รั้วภูมิศาสตร์ผสานการรับรู้ตำแหน่งปัจจุบันของผู้ใช้กับการรับรู้ความใกล้เคียงของผู้ใช้กับสถานที่ที่อาจสนใจ หากต้องการทำเครื่องหมาย สถานที่ที่สนใจ ให้ระบุละติจูดและลองจิจูดของสถานที่นั้น หากต้องการปรับระยะใกล้สำหรับ สถานที่ ให้เพิ่มรัศมี ละติจูด ลองจิจูด และรัศมีจะกำหนดรั้วเสมือน ซึ่งสร้าง พื้นที่วงกลมหรือรั้วรอบสถานที่ที่สนใจ
คุณมีรั้วภูมิศาสตร์ที่ใช้งานอยู่ได้หลายรั้ว โดยจำกัดไว้ที่ 100 รั้วต่อแอปต่อผู้ใช้อุปกรณ์ สำหรับแต่ละ เขตพื้นที่เสมือน คุณสามารถขอให้บริการตำแหน่งส่งเหตุการณ์การเข้าและออก หรือระบุ ระยะเวลาภายในเขตพื้นที่เสมือนเพื่อรอ หรืออยู่ในก่อนที่จะทริกเกอร์เหตุการณ์ คุณ สามารถจำกัดระยะเวลาของรั้วภูมิศาสตร์ได้โดยการระบุระยะเวลาหมดอายุเป็นมิลลิวินาที หลังจากรั้วภูมิศาสตร์หมดอายุแล้ว บริการตำแหน่งจะนำรั้วภูมิศาสตร์ออกโดยอัตโนมัติ

บทเรียนนี้จะแสดงวิธีเพิ่มและนำรั้วภูมิศาสตร์ออก แล้วฟังการเปลี่ยนรั้วภูมิศาสตร์
โดยใช้ BroadcastReceiver
หมายเหตุ: ในอุปกรณ์ Wear API Geofencing จะใช้พลังงานอย่างไม่คุ้มค่า เราไม่แนะนำให้ใช้ API เหล่านี้ใน Wear อ่านข้อมูลเพิ่มเติมได้ที่หัวข้อประหยัดพลังงานและแบตเตอรี่
ตั้งค่าการตรวจสอบเขตพื้นที่เสมือน
ขั้นตอนแรกในการขอการตรวจสอบ Geofence คือการขอสิทธิ์ที่จำเป็น หากต้องการใช้ Geofencing แอปของคุณต้องขอสิ่งต่อไปนี้
-
ACCESS_FINE_LOCATION
-
ACCESS_BACKGROUND_LOCATION
หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ขึ้นไป
ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับวิธี ขอสิทธิ์เข้าถึงตำแหน่ง
หากต้องการใช้ BroadcastReceiver
เพื่อฟังการเปลี่ยนผ่านของ Geofence
ให้เพิ่มองค์ประกอบที่ระบุชื่อบริการ องค์ประกอบนี้ต้องเป็นองค์ประกอบย่อยขององค์ประกอบ
<application>
<application android:allowBackup="true"> ... <receiver android:name=".GeofenceBroadcastReceiver"/> <application/>
หากต้องการเข้าถึง Location API คุณต้องสร้างอินสแตนซ์ของ ไคลเอ็นต์ Geofencing วิธีเชื่อมต่อไคลเอ็นต์
Kotlin
lateinit var geofencingClient: GeofencingClient override fun onCreate(savedInstanceState: Bundle?) { // ... geofencingClient = LocationServices.getGeofencingClient(this) }
Java
private GeofencingClient geofencingClient; @Override public void onCreate(Bundle savedInstanceState) { // ... geofencingClient = LocationServices.getGeofencingClient(this); }
สร้างและเพิ่มเขตพื้นที่เสมือน
แอปของคุณต้องสร้างและเพิ่ม Geofence โดยใช้คลาส Builder ของ Location API สำหรับ
การสร้างออบเจ็กต์ Geofence และคลาสความสะดวกในการเพิ่ม นอกจากนี้ หากต้องการจัดการ Intent ที่ส่งจากบริการตำแหน่งเมื่อเกิดการเปลี่ยนผ่านของ Geofence คุณสามารถกำหนด PendingIntent
ได้ตามที่แสดงในส่วนนี้
หมายเหตุ: ในอุปกรณ์แบบผู้ใช้คนเดียว จะมีขีดจำกัดรั้วภูมิศาสตร์ 100 รายการต่อแอป สำหรับอุปกรณ์แบบผู้ใช้หลายคน จะมีขีดจำกัดรั้วภูมิศาสตร์ 100 รายการต่อแอปต่อผู้ใช้อุปกรณ์
สร้างออบเจ็กต์เขตพื้นที่เสมือน
ก่อนอื่น ให้ใช้
Geofence.Builder
เพื่อสร้างรั้วภูมิศาสตร์ โดยตั้งค่ารัศมี ระยะเวลา และ
ประเภทการเปลี่ยนผ่านที่ต้องการสำหรับรั้วภูมิศาสตร์ เช่น หากต้องการป้อนข้อมูลออบเจ็กต์รายการ ให้ทำดังนี้
Kotlin
geofenceList.add(Geofence.Builder() // Set the request ID of the geofence. This is a string to identify this // geofence. .setRequestId(entry.key) // Set the circular region of this geofence. .setCircularRegion( entry.value.latitude, entry.value.longitude, Constants.GEOFENCE_RADIUS_IN_METERS ) // Set the expiration duration of the geofence. This geofence gets automatically // removed after this period of time. .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) // Set the transition types of interest. Alerts are only generated for these // transition. We track entry and exit transitions in this sample. .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER or Geofence.GEOFENCE_TRANSITION_EXIT) // Create the geofence. .build())
Java
geofenceList.add(new Geofence.Builder() // Set the request ID of the geofence. This is a string to identify this // geofence. .setRequestId(entry.getKey()) .setCircularRegion( entry.getValue().latitude, entry.getValue().longitude, Constants.GEOFENCE_RADIUS_IN_METERS ) .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS) .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT) .build());
ตัวอย่างนี้ดึงข้อมูลจากไฟล์ค่าคงที่ ในทางปฏิบัติจริง แอปอาจ สร้างรั้วภูมิศาสตร์แบบไดนามิกตามตำแหน่งของผู้ใช้
ระบุรั้วภูมิศาสตร์และทริกเกอร์เริ่มต้น
ข้อมูลโค้ดต่อไปนี้ใช้คลาส
GeofencingRequest
และคลาส
GeofencingRequestBuilder
ที่ซ้อนกันเพื่อ
ระบุรัศมีภูมิศาสตร์ที่จะตรวจสอบและตั้งค่าวิธีทริกเกอร์เหตุการณ์รัศมีภูมิศาสตร์ที่เกี่ยวข้อง
Kotlin
private fun getGeofencingRequest(): GeofencingRequest { return GeofencingRequest.Builder().apply { setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER) addGeofences(geofenceList) }.build() }
Java
private GeofencingRequest getGeofencingRequest() { GeofencingRequest.Builder builder = new GeofencingRequest.Builder(); builder.setInitialTrigger(GeofencingRequest.INITIAL_TRIGGER_ENTER); builder.addGeofences(geofenceList); return builder.build(); }
ตัวอย่างนี้แสดงการใช้ทริกเกอร์รั้วภูมิศาสตร์ 2 รายการ การเปลี่ยนสถานะ
GEOFENCE_TRANSITION_ENTER
จะทริกเกอร์เมื่ออุปกรณ์เข้าสู่รั้วภูมิศาสตร์ และการเปลี่ยนสถานะ
GEOFENCE_TRANSITION_EXIT
จะทริกเกอร์เมื่ออุปกรณ์ออกจากรั้วภูมิศาสตร์ การระบุ
INITIAL_TRIGGER_ENTER
จะบอกบริการตำแหน่งว่า
GEOFENCE_TRANSITION_ENTER
ควรทริกเกอร์หากอุปกรณ์อยู่ภายในรั้วภูมิศาสตร์อยู่แล้ว
ในหลายกรณี คุณอาจต้องการใช้
INITIAL_TRIGGER_DWELL
แทน
ซึ่งจะทริกเกอร์เหตุการณ์เมื่อผู้ใช้หยุดเป็นระยะเวลาที่กำหนดภายในรั้วภูมิศาสตร์เท่านั้น
วิธีนี้จะช่วยลด "สแปมการแจ้งเตือน" ที่เกิดจากการแจ้งเตือนจำนวนมากเมื่ออุปกรณ์เข้าและออกจากรั้วภูมิศาสตร์ในระยะเวลาสั้นๆ อีกกลยุทธ์หนึ่งในการได้ผลลัพธ์ที่ดีที่สุดจากรั้วภูมิศาสตร์คือการตั้งค่ารัศมีขั้นต่ำที่ 100 เมตร ซึ่งจะช่วยให้ระบบคำนึงถึงความแม่นยำของตำแหน่ง
ของเครือข่าย Wi-Fi ทั่วไป และยังช่วยลดการใช้พลังงานของอุปกรณ์ด้วย
กำหนด Broadcast Receiver สำหรับการเปลี่ยนรั้วภูมิศาสตร์
Intent
ที่ส่งจากบริการตำแหน่งสามารถทริกเกอร์การดำเนินการต่างๆ ใน
แอปของคุณได้ แต่คุณไม่ควรให้เริ่มกิจกรรมหรือ Fragment เนื่องจากคอมโพเนนต์
ควรปรากฏต่อเมื่อมีการตอบสนองต่อการกระทำของผู้ใช้เท่านั้น ในหลายกรณี BroadcastReceiver
เป็นวิธีที่ดีในการจัดการการเปลี่ยนผ่านของรั้วภูมิศาสตร์ A
BroadcastReceiver
จะได้รับการอัปเดตเมื่อเกิดเหตุการณ์ เช่น
การเข้าหรือออกจากรั้วภูมิศาสตร์ และสามารถเริ่มงานที่ใช้เวลานานในเบื้องหลัง
ได้
ข้อมูลโค้ดต่อไปนี้แสดงวิธี
กําหนด PendingIntent
ที่เริ่มต้น BroadcastReceiver
Kotlin
class MainActivity : AppCompatActivity() { // ... private val geofencePendingIntent: PendingIntent by lazy { val intent = Intent(this, GeofenceBroadcastReceiver::class.java) // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling // addGeofences() and removeGeofences(). PendingIntent.getBroadcast(this, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT) } }
Java
public class MainActivity extends AppCompatActivity { // ... private PendingIntent getGeofencePendingIntent() { // Reuse the PendingIntent if we already have it. if (geofencePendingIntent != null) { return geofencePendingIntent; } Intent intent = new Intent(this, GeofenceBroadcastReceiver.class); // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when // calling addGeofences() and removeGeofences(). geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, PendingIntent. FLAG_UPDATE_CURRENT); return geofencePendingIntent; }
เพิ่มรั้วเสมือน
หากต้องการเพิ่มรั้วภูมิศาสตร์ ให้ใช้วิธี
ระบุออบเจ็กต์ GeofencingClient.addGeofences()
GeofencingRequest
และ PendingIntent
ข้อมูลโค้ดต่อไปนี้แสดงการประมวลผลผลลัพธ์
Kotlin
geofencingClient?.addGeofences(getGeofencingRequest(), geofencePendingIntent)?.run { addOnSuccessListener { // Geofences added // ... } addOnFailureListener { // Failed to add geofences // ... } }
Java
geofencingClient.addGeofences(getGeofencingRequest(), getGeofencePendingIntent()) .addOnSuccessListener(this, new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Geofences added // ... } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Failed to add geofences // ... } });
จัดการการเปลี่ยนรั้วภูมิศาสตร์
เมื่อบริการตำแหน่งตรวจพบว่าผู้ใช้เข้าหรือออกจากรั้วภูมิศาสตร์ ระบบจะส่ง Intent
ที่อยู่ใน PendingIntent
ที่คุณรวมไว้ในคำขอเพิ่มรั้วภูมิศาสตร์ เครื่องรับการออกอากาศ เช่น
GeofenceBroadcastReceiver
สังเกตว่ามีการเรียกใช้ Intent
และ
จากนั้นจะรับเหตุการณ์ Geofencing จาก Intent ระบุประเภทการเปลี่ยน Geofence
และระบุว่า Geofence ที่กำหนดใดที่ทริกเกอร์ เครื่องรับการออกอากาศ
สามารถสั่งให้แอปเริ่มทำงานในเบื้องหลัง หรือส่งการแจ้งเตือนเป็นเอาต์พุตหาก
ต้องการ
หมายเหตุ: ใน Android 8.0 (API ระดับ 26) ขึ้นไป หากแอป ทำงานในเบื้องหลังขณะตรวจสอบ Geofence อุปกรณ์จะตอบสนองต่อเหตุการณ์ Geofencing ทุกๆ 2-3 นาที ดูวิธีปรับ แอปให้สอดคล้องกับขีดจำกัดการตอบกลับเหล่านี้ได้ที่ ข้อจำกัดด้านตำแหน่ง ในเบื้องหลัง
ข้อมูลโค้ดต่อไปนี้แสดงวิธีกำหนด
BroadcastReceiver
ที่โพสต์การแจ้งเตือนเมื่อมีการเปลี่ยนรั้วภูมิศาสตร์ เมื่อผู้ใช้
คลิกการแจ้งเตือน กิจกรรมหลักของแอปจะปรากฏขึ้น
Kotlin
class GeofenceBroadcastReceiver : BroadcastReceiver() { // ... override fun onReceive(context: Context?, intent: Intent?) { val geofencingEvent = GeofencingEvent.fromIntent(intent) if (geofencingEvent.hasError()) { val errorMessage = GeofenceStatusCodes .getStatusCodeString(geofencingEvent.errorCode) Log.e(TAG, errorMessage) return } // Get the transition type. val geofenceTransition = geofencingEvent.geofenceTransition // Test that the reported transition was of interest. if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { // Get the geofences that were triggered. A single event can trigger // multiple geofences. val triggeringGeofences = geofencingEvent.triggeringGeofences // Get the transition details as a String. val geofenceTransitionDetails = getGeofenceTransitionDetails( this, geofenceTransition, triggeringGeofences ) // Send notification and log the transition details. sendNotification(geofenceTransitionDetails) Log.i(TAG, geofenceTransitionDetails) } else { // Log the error. Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition)) } } }
Java
public class GeofenceBroadcastReceiver extends BroadcastReceiver { // ... protected void onReceive(Context context, Intent intent) { GeofencingEvent geofencingEvent = GeofencingEvent.fromIntent(intent); if (geofencingEvent.hasError()) { String errorMessage = GeofenceStatusCodes .getStatusCodeString(geofencingEvent.getErrorCode()); Log.e(TAG, errorMessage); return; } // Get the transition type. int geofenceTransition = geofencingEvent.getGeofenceTransition(); // Test that the reported transition was of interest. if (geofenceTransition == Geofence.GEOFENCE_TRANSITION_ENTER || geofenceTransition == Geofence.GEOFENCE_TRANSITION_EXIT) { // Get the geofences that were triggered. A single event can trigger // multiple geofences. List<Geofence> triggeringGeofences = geofencingEvent.getTriggeringGeofences(); // Get the transition details as a String. String geofenceTransitionDetails = getGeofenceTransitionDetails( this, geofenceTransition, triggeringGeofences ); // Send notification and log the transition details. sendNotification(geofenceTransitionDetails); Log.i(TAG, geofenceTransitionDetails); } else { // Log the error. Log.e(TAG, getString(R.string.geofence_transition_invalid_type, geofenceTransition)); } } }
หลังจากตรวจหาเหตุการณ์การเปลี่ยนผ่านผ่าน PendingIntent
,
BroadcastReceiver
จะรับประเภทการเปลี่ยนผ่านของรั้วภูมิศาสตร์และ
ทดสอบว่าเป็นการเปลี่ยนผ่านเหตุการณ์ที่แอปใช้เพื่อทริกเกอร์
การแจ้งเตือนหรือไม่ ซึ่งในกรณีนี้คือ
GEOFENCE_TRANSITION_ENTER
หรือ GEOFENCE_TRANSITION_EXIT
จากนั้นบริการจะส่งการแจ้งเตือนและบันทึกรายละเอียดการเปลี่ยน
หยุดการตรวจสอบรั้วภูมิศาสตร์
การหยุดการตรวจสอบรั้วภูมิศาสตร์เมื่อไม่จำเป็นหรือต้องการแล้วจะช่วยประหยัดพลังงานแบตเตอรี่
และรอบ CPU ในอุปกรณ์ได้ คุณสามารถหยุดการตรวจสอบรั้วภูมิศาสตร์
ในกิจกรรมหลักที่ใช้เพิ่มและนำรั้วภูมิศาสตร์ออกได้ โดยการนำรั้วภูมิศาสตร์ออกจะหยุดการตรวจสอบ
ทันที API มีเมธอดสำหรับ
นำรั้วภูมิศาสตร์ออกตามรหัสคำขอ หรือนำรั้วภูมิศาสตร์ที่เชื่อมโยงกับ PendingIntent
ที่กำหนดออก
ข้อมูลโค้ดต่อไปนี้จะนำรั้วภูมิศาสตร์ออกตาม PendingIntent
ซึ่งจะหยุดการแจ้งเตือนทั้งหมด
เพิ่มเติมเมื่ออุปกรณ์เข้าหรือออกจากรั้วภูมิศาสตร์ที่เพิ่มไว้ก่อนหน้านี้
Kotlin
geofencingClient?.removeGeofences(geofencePendingIntent)?.run { addOnSuccessListener { // Geofences removed // ... } addOnFailureListener { // Failed to remove geofences // ... } }
Java
geofencingClient.removeGeofences(getGeofencePendingIntent()) .addOnSuccessListener(this, new OnSuccessListener<Void>() { @Override public void onSuccess(Void aVoid) { // Geofences removed // ... } }) .addOnFailureListener(this, new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Failed to remove geofences // ... } });
คุณสามารถใช้รั้วภูมิศาสตร์ร่วมกับฟีเจอร์อื่นๆ ที่รับรู้ตำแหน่งได้ เช่น การอัปเดตตำแหน่งเป็นระยะ ดูข้อมูลเพิ่มเติมได้ในบทเรียนอื่นๆ ในชั้นเรียนนี้
ใช้แนวทางปฏิบัติแนะนำสำหรับรั้วภูมิศาสตร์
ส่วนนี้จะอธิบายคำแนะนำในการใช้ Geofencing กับ Location API สำหรับ Android
ลดการใช้พลังงาน
คุณใช้เทคนิคต่อไปนี้เพื่อเพิ่มประสิทธิภาพการใช้พลังงานในแอปที่ใช้ Geofencing ได้
ตั้งค่า การตอบสนองต่อการแจ้งเตือนให้มีค่าสูงขึ้น การทำเช่นนี้จะช่วยปรับปรุงการใช้พลังงานโดย เพิ่มเวลาในการตอบสนองของการแจ้งเตือน Geofence เช่น หากคุณตั้งค่าการตอบสนองเป็น 5 นาที แอปจะตรวจสอบการแจ้งเตือนการเข้าหรือออกเพียงครั้งเดียวทุกๆ 5 นาที การตั้งค่าให้มีค่าน้อยลงไม่ได้หมายความว่าผู้ใช้จะได้รับการแจ้งเตือนภายในระยะเวลาดังกล่าว (เช่น หากตั้งค่าเป็น 5 วินาที อาจใช้เวลานานกว่านั้นเล็กน้อยจึงจะได้รับการแจ้งเตือน)
ใช้รัศมีเขตพื้นที่เสมือนที่ใหญ่ขึ้นสำหรับสถานที่ที่ผู้ใช้ใช้เวลาเป็นจำนวนมาก เช่น บ้านหรือที่ทำงาน แม้ว่ารัศมีที่ใหญ่ขึ้นจะไม่ได้ลดการใช้พลังงานโดยตรง แต่จะช่วยลดความถี่ที่แอปตรวจสอบการเข้าหรือออก ซึ่งจะช่วยลดการใช้พลังงานโดยรวมได้อย่างมีประสิทธิภาพ
เลือกรัศมีที่เหมาะสมที่สุดสำหรับรั้วเสมือน
รัศมีขั้นต่ำของรั้วภูมิศาสตร์ควรตั้งค่าระหว่าง 100-150 เมตรเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด เมื่อใช้ Wi-Fi ได้ ความแม่นยำของตำแหน่งมักจะอยู่ระหว่าง 20-50 เมตร เมื่อมี ตำแหน่งในอาคาร ช่วงความแม่นยำอาจอยู่ที่ 5 เมตร หากไม่ทราบว่ามีตำแหน่งในอาคารภายในรั้วกําหนดภูมิศาสตร์ ให้ถือว่าความแม่นยำของตำแหน่ง Wi-Fi อยู่ที่ประมาณ 50 เมตร
เมื่อไม่มีตำแหน่ง Wi-Fi (เช่น เมื่อคุณขับรถในพื้นที่ชนบท) ความแม่นยำของตำแหน่งจะลดลง ช่วงความแม่นยำอาจกว้างตั้งแต่หลายร้อยเมตรไปจนถึงหลายกิโลเมตร ในกรณีเช่นนี้ คุณควรสร้างรั้วภูมิศาสตร์โดยใช้รัศมีที่ใหญ่ขึ้น
อธิบายให้ผู้ใช้ทราบว่าเหตุใดแอปของคุณจึงใช้ Geofencing
เนื่องจากแอปเข้าถึงตำแหน่งในเบื้องหลังเมื่อคุณใช้ Geofencing ให้พิจารณาว่าแอปของคุณมอบประโยชน์แก่ผู้ใช้อย่างไร อธิบายให้ผู้ใช้ทราบอย่างชัดเจนว่าทำไม แอปของคุณจึงต้องเข้าถึงข้อมูลนี้เพื่อเพิ่มความเข้าใจและความโปร่งใสของผู้ใช้
ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติแนะนำที่เกี่ยวข้องกับการเข้าถึงตำแหน่ง รวมถึงการกำหนดขอบเขตทางภูมิศาสตร์ได้ที่หน้าแนวทางปฏิบัติแนะนำด้านความเป็นส่วนตัว
ใช้ประเภทการเปลี่ยนผ่านแบบคงที่เพื่อลดสแปมการแจ้งเตือน
หากได้รับการแจ้งเตือนจำนวนมากเมื่อขับรถผ่านรั้วภูมิศาสตร์ในช่วงเวลาสั้นๆ วิธีที่ดีที่สุดในการ
ลดการแจ้งเตือนคือการใช้ประเภทการเปลี่ยนเป็น
GEOFENCE_TRANSITION_DWELL
แทน
GEOFENCE_TRANSITION_ENTER
ด้วยวิธีนี้ ระบบจะส่งการแจ้งเตือนการหยุดพักก็ต่อเมื่อผู้ใช้หยุด
ภายในรั้วภูมิศาสตร์เป็นระยะเวลาหนึ่ง คุณเลือกระยะเวลาได้โดยการตั้งค่า
การหน่วงเวลาการคงอยู่
ลงทะเบียนรั้วภูมิศาสตร์อีกครั้งเมื่อจำเป็นเท่านั้น
ระบบจะเก็บรั้วภูมิศาสตร์ที่ลงทะเบียนไว้ในกระบวนการ com.google.process.location
ที่เป็นของแพ็กเกจ com.google.android.gms
แอปไม่จำเป็นต้องดำเนินการใดๆ เพื่อจัดการเหตุการณ์ต่อไปนี้ เนื่องจากระบบจะคืนค่า Geofence หลังจากเหตุการณ์เหล่านี้
- อัปเกรดบริการ Google Play แล้ว
- ระบบจะปิดและรีสตาร์ทบริการ Google Play เนื่องจากข้อจำกัดด้านทรัพยากร
- กระบวนการระบุตำแหน่งขัดข้อง
แอปต้องลงทะเบียนรั้วภูมิศาสตร์อีกครั้งหากยังจำเป็นหลังจากเหตุการณ์ต่อไปนี้ เนื่องจาก ระบบไม่สามารถกู้คืนรั้วภูมิศาสตร์ในกรณีต่อไปนี้ได้
- รีบูตอุปกรณ์แล้ว แอปควรรอฟังการดำเนินการบูตอุปกรณ์เสร็จสมบูรณ์ แล้วจึงลงทะเบียนรั้วภูมิศาสตร์ที่จำเป็นอีกครั้ง
- ระบบถอนการติดตั้งแอปและติดตั้งอีกครั้ง
- ระบบจะล้างข้อมูลของแอป
- ระบบจะล้างข้อมูลของบริการ Google Play
- แอปได้รับ
GEOFENCE_NOT_AVAILABLE
การแจ้งเตือน โดยมักเกิดขึ้น หลังจากปิดใช้ NLP (ผู้ให้บริการตำแหน่งเครือข่ายของ Android)
แก้ปัญหาเหตุการณ์การเข้าเขตพื้นที่เสมือน
หากรั้วภูมิศาสตร์ไม่ทริกเกอร์เมื่ออุปกรณ์เข้าสู่รั้วภูมิศาสตร์
(ระบบไม่ทริกเกอร์การแจ้งเตือน
GEOFENCE_TRANSITION_ENTER
) ก่อนอื่นให้ตรวจสอบว่ารั้วภูมิศาสตร์ของคุณ
ลงทะเบียนอย่างถูกต้องตามที่อธิบายไว้ในคู่มือนี้
สาเหตุที่อาจทำให้การแจ้งเตือนไม่ทำงานตามที่คาดไว้มีดังนี้
- ตำแหน่งที่แม่นยำไม่พร้อมใช้งานภายในเขตพื้นที่เสมือนหรือเขตพื้นที่เสมือนมีขนาดเล็กเกินไป ในอุปกรณ์ส่วนใหญ่ บริการ Geofence จะใช้เฉพาะตำแหน่งเครือข่ายสำหรับการทริกเกอร์ Geofence บริการนี้ใช้วิธีการนี้เนื่องจากตำแหน่งเครือข่ายใช้พลังงานน้อยกว่ามาก ใช้เวลาน้อยกว่าในการรับตำแหน่งที่แยกกัน และที่สำคัญที่สุดคือใช้ได้ในอาคาร
Wi-Fi ปิดอยู่ในอุปกรณ์ การเปิด Wi-Fi จะช่วยปรับปรุงความแม่นยำของตำแหน่งได้อย่างมาก ดังนั้นหากปิด Wi-Fi ไว้ แอปพลิเคชันอาจไม่ได้รับการแจ้งเตือน Geofence โดยขึ้นอยู่กับการตั้งค่าหลายอย่าง เช่น รัศมีของ Geofence, รุ่นอุปกรณ์ หรือ เวอร์ชัน Android ตั้งแต่ Android 4.3 (API ระดับ 18) เป็นต้นมา เราได้เพิ่มความสามารถของ "โหมดสแกน Wi-Fi เท่านั้น" ซึ่งช่วยให้ผู้ใช้ปิดใช้ Wi-Fi แต่ยังคงรับตำแหน่งเครือข่ายที่แม่นยำได้ แนวทางปฏิบัติที่ดีคือการแจ้งให้ผู้ใช้ทราบและให้ทางลัดแก่ผู้ใช้เพื่อเปิดใช้ Wi-Fi หรือโหมดสแกน Wi-Fi เท่านั้น หากปิดใช้ทั้ง 2 อย่าง ใช้ SettingsClient เพื่อให้มั่นใจว่าการตั้งค่าระบบของอุปกรณ์ได้รับการกำหนดค่าอย่างถูกต้องเพื่อการตรวจหาตำแหน่งที่เหมาะสมที่สุด
หมายเหตุ: หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ขึ้นไป คุณจะเรียกใช้
WifiManager.setEnabled()
โดยตรงไม่ได้ เว้นแต่แอปจะเป็นแอปของระบบหรือตัวควบคุมนโยบายอุปกรณ์ (DPC) แต่ให้ใช้แผงการตั้งค่าแทน- ไม่มีการเชื่อมต่อเครือข่ายที่เชื่อถือได้ภายในรั้วภูมิศาสตร์ หากไม่มีการเชื่อมต่ออินเทอร์เน็ตที่เชื่อถือได้ ระบบอาจไม่สร้างการแจ้งเตือน เนื่องจากบริการรั้วภูมิศาสตร์ ขึ้นอยู่กับผู้ให้บริการตำแหน่งเครือข่าย ซึ่งต้องใช้การเชื่อมต่ออินเทอร์เน็ต
- การแจ้งเตือนอาจล่าช้า บริการรั้วภูมิศาสตร์ไม่ได้ค้นหาตำแหน่งอย่างต่อเนื่อง ดังนั้นโปรดทราบว่าอาจมีความหน่วงเมื่อได้รับการแจ้งเตือน โดยปกติแล้วเวลาในการตอบสนองจะน้อยกว่า 2 นาที และยิ่งน้อยลงเมื่ออุปกรณ์เคลื่อนที่ หากขีดจำกัดของตำแหน่งในพื้นหลังมีผล เวลาในการตอบสนองจะอยู่ที่ประมาณ 2-3 นาทีโดยเฉลี่ย หากอุปกรณ์อยู่กับที่เป็นระยะเวลานาน ความหน่วงอาจเพิ่มขึ้น (สูงสุด 6 นาที)
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับ Geofencing ได้ที่สื่อต่อไปนี้
ตัวอย่าง
แอปตัวอย่างสำหรับการสร้างและตรวจสอบเขตพื้นที่เสมือน