การกำหนดเขตพื้นที่เสมือนจะรวมการรับรู้ตำแหน่งปัจจุบันของผู้ใช้เข้ากับการรับรู้ความใกล้ชิดของผู้ใช้กับสถานที่ที่อาจสนใจ หากต้องการทำเครื่องหมายสถานที่ที่สนใจ ให้ระบุละติจูดและลองจิจูดของสถานที่นั้น หากต้องการปรับความใกล้เคียงของสถานที่ตั้ง ให้เพิ่มรัศมี ละติจูด ลองจิจูด และรัศมีจะกำหนดเขตพื้นที่เสมือน โดยสร้างพื้นที่วงกลมหรือรั้วรอบสถานที่ที่สนใจ
คุณสามารถมีเขตพื้นที่เสมือนที่ใช้งานอยู่ได้หลายเขต โดยจำกัดไว้ที่ 100 เขตต่อแอปต่อผู้ใช้อุปกรณ์ สำหรับเขตพื้นที่เสมือนแต่ละเขต คุณสามารถขอให้บริการตำแหน่งส่งเหตุการณ์การเข้าและออกให้คุณ หรือจะระบุระยะเวลาภายในเขตพื้นที่เสมือนเพื่อรอหรือหยุดพักก่อนที่จะทริกเกอร์เหตุการณ์ก็ได้ คุณสามารถจำกัดระยะเวลาของเขตพื้นที่เสมือนได้โดยระบุระยะเวลาหมดอายุเป็นมิลลิวินาที หลังจากเขตพื้นที่เสมือนหมดอายุ บริการตำแหน่งจะนำเขตพื้นที่เสมือนออกโดยอัตโนมัติ
บทเรียนนี้จะแสดงวิธีเพิ่มและนำเขตพื้นที่เสมือนออก จากนั้นฟังการเปลี่ยนผ่านเขตพื้นที่เสมือนโดยใช้ BroadcastReceiver
หมายเหตุ: ในอุปกรณ์ Wear นั้น Geofencing API จะใช้พลังงานอย่างไม่มีประสิทธิภาพ เราไม่แนะนำให้ใช้ API เหล่านี้ใน Wear อ่านข้อมูลเพิ่มเติมได้ที่ประหยัดพลังงานและแบตเตอรี่
ตั้งค่าสำหรับการตรวจสอบเขตพื้นที่เสมือน
ขั้นตอนแรกในการขอการตรวจสอบเขตพื้นที่เสมือนคือการขอสิทธิ์ที่จำเป็น หากต้องการใช้การกำหนดเขตพื้นที่เสมือน แอปของคุณต้องขอสิ่งต่อไปนี้
-
ACCESS_FINE_LOCATION -
ACCESS_BACKGROUND_LOCATIONหากแอปกำหนดเป้าหมายเป็น Android 10 (ระดับ API 29) ขึ้นไป
ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับวิธีขอสิทธิ์เข้าถึงตำแหน่ง
หากต้องการใช้ BroadcastReceiver เพื่อฟังการเปลี่ยนผ่านเขตพื้นที่เสมือน ให้เพิ่มองค์ประกอบที่ระบุชื่อบริการ องค์ประกอบนี้ต้องเป็นองค์ประกอบย่อยขององค์ประกอบ
<application> ดังนี้
<application android:allowBackup="true"> ... <receiver android:name=".GeofenceBroadcastReceiver"/> <application/>
หากต้องการเข้าถึง API สถานที่ คุณต้องสร้างอินสแตนซ์ของไคลเอ็นต์การกำหนดเขตพื้นที่เสมือน ดูวิธีเชื่อมต่อไคลเอ็นต์ได้ดังนี้
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); }
สร้างและเพิ่มเขตพื้นที่เสมือน
แอปของคุณต้องสร้างและเพิ่มเขตพื้นที่เสมือนโดยใช้คลาส Builder ของ API สถานที่เพื่อสร้างออบเจ็กต์เขตพื้นที่เสมือน และคลาสอำนวยความสะดวกเพื่อเพิ่มเขตพื้นที่เสมือน นอกจากนี้ หากต้องการจัดการ Intent ที่ส่งจากบริการตำแหน่งเมื่อเกิดการเปลี่ยนผ่านเขตพื้นที่เสมือน คุณสามารถกำหนด 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 เป็นวิธีที่ดีในการจัดการการเปลี่ยนผ่านเขตพื้นที่เสมือน BroadcastReceiver จะได้รับการอัปเดตเมื่อเกิดเหตุการณ์ เช่น การเปลี่ยนเข้าหรือออกจากเขตพื้นที่เสมือน และสามารถเริ่มงานที่ทำงานอยู่เบื้องหลังเป็นเวลานานได้
ข้อมูลโค้ดต่อไปนี้แสดงวิธีกำหนด PendingIntent ที่เริ่ม BroadcastReceiver
Kotlin
class MainActivity : AppCompatActivity() { // ... private val geofencePendingIntent: PendingIntent by lazy { // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling // addGeofences() and removeGeofences(). val flags = PendingIntent.FLAG_UPDATE_CURRENT if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { // Starting on Android S+ the pending intent has to be mutable. flags or PendingIntent.FLAG_MUTABLE } val intent = Intent(this, GeofenceBroadcastReceiver::class.java) PendingIntent.getBroadcast(this, 0, intent, flags) } }
Java
public class MainActivity extends AppCompatActivity { // ... private PendingIntent getGeofencePendingIntent() { // Reuse the PendingIntent if we already have it. if (geofencePendingIntent != null) { return geofencePendingIntent; } // We use FLAG_UPDATE_CURRENT so that we get the same pending intent back when calling // addGeofences() and removeGeofences(). int flags = PendingIntent.FLAG_UPDATE_CURRENT; if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.S) { // Starting on Android S+ the pending intent has to be mutable. flags |= PendingIntent.FLAG_MUTABLE; } Intent intent = new Intent(this, GeofenceBroadcastReceiver.class); geofencePendingIntent = PendingIntent.getBroadcast(this, 0, intent, flags); 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 ซึ่งคุณรวมไว้ในคำขอเพื่อเพิ่มเขตพื้นที่เสมือน Broadcast Receiver เช่น GeofenceBroadcastReceiver จะสังเกตเห็นว่ามีการเรียกใช้ Intent และสามารถรับเหตุการณ์การกำหนดเขตพื้นที่เสมือนจาก Intent, กำหนดประเภทของการเปลี่ยนผ่านเขตพื้นที่เสมือน และกำหนดว่าเขตพื้นที่เสมือนที่กำหนดไว้ใดถูกทริกเกอร์ Broadcast Receiver สามารถสั่งให้แอปเริ่มทำงานในเบื้องหลัง หรือส่งการแจ้งเตือนเป็นเอาต์พุตได้หากต้องการ
หมายเหตุ: ใน Android 8.0 (ระดับ API 26) ขึ้นไป หากแอปทำงานอยู่เบื้องหลังขณะตรวจสอบเขตพื้นที่เสมือน อุปกรณ์จะตอบสนองต่อเหตุการณ์การกำหนดเขตพื้นที่เสมือนทุกๆ 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 // ... } });
คุณสามารถรวมการกำหนดเขตพื้นที่เสมือนเข้ากับฟีเจอร์อื่นๆ ที่รับรู้ถึงตำแหน่ง เช่น การอัปเดตตำแหน่งเป็นระยะ ดูข้อมูลเพิ่มเติมได้จากบทเรียนอื่นๆ ในชั้นเรียนนี้
ใช้แนวทางปฏิบัติแนะนำสำหรับการกำหนดเขตพื้นที่เสมือน
ส่วนนี้จะสรุปคำแนะนำในการใช้การกำหนดเขตพื้นที่เสมือนกับ API สถานที่สำหรับ Android
ลดการใช้พลังงาน
คุณสามารถใช้เทคนิคต่อไปนี้เพื่อเพิ่มประสิทธิภาพการใช้พลังงานในแอปที่ใช้การกำหนดเขตพื้นที่เสมือน
ตั้งค่า การตอบสนองต่อการแจ้งเตือนให้มีค่าสูงขึ้น การทำเช่นนี้จะช่วยปรับปรุงการใช้พลังงานโดยเพิ่มเวลาในการตอบสนองของการแจ้งเตือนเขตพื้นที่เสมือน ตัวอย่างเช่น หากคุณตั้งค่าการตอบสนองไว้ที่ 5 นาที แอปจะตรวจสอบการแจ้งเตือนการเข้าหรือออกเพียงครั้งเดียวทุกๆ 5 นาที การตั้งค่าเป็นค่าที่ต่ำกว่าไม่ได้หมายความว่าผู้ใช้จะได้รับการแจ้งเตือนภายในระยะเวลาดังกล่าว (เช่น หากคุณตั้งค่าเป็น 5 วินาที อาจใช้เวลานานกว่านั้นเล็กน้อยในการรับการแจ้งเตือน)
ใช้รัศมีเขตพื้นที่เสมือนที่ใหญ่ขึ้นสำหรับสถานที่ที่ผู้ใช้ใช้เวลาเป็นจำนวนมาก เช่น บ้านหรือที่ทำงาน แม้ว่ารัศมีที่ใหญ่ขึ้นจะไม่ลดการใช้พลังงานโดยตรง แต่จะลดความถี่ที่ App Check ตรวจสอบการเข้าหรือออก ซึ่งช่วยลดการใช้พลังงานโดยรวมได้อย่างมีประสิทธิภาพ
เลือกรัศมีที่เหมาะสมที่สุดสำหรับเขตพื้นที่เสมือน
คุณควรกำหนดรัศมีขั้นต่ำของเขตพื้นที่เสมือนไว้ระหว่าง 100-150 เมตรเพื่อให้ได้ผลลัพธ์ที่ดีที่สุด เมื่อใช้ Wi-Fi ได้ ความแม่นยำของตำแหน่งมักจะอยู่ระหว่าง 20-50 เมตร เมื่อตำแหน่งในอาคารพร้อมใช้งาน ช่วงความแม่นยำอาจต่ำถึง 5 เมตร หากไม่ทราบว่ามีตำแหน่งในอาคารภายในเขตพื้นที่เสมือนหรือไม่ ให้ถือว่าความแม่นยำของตำแหน่ง Wi-Fi อยู่ที่ประมาณ 50 เมตร
เมื่อตำแหน่ง Wi-Fi ไม่พร้อมใช้งาน (เช่น เมื่อคุณขับรถในพื้นที่ชนบท) ความแม่นยำของตำแหน่งจะลดลง ช่วงความแม่นยำอาจกว้างได้ตั้งแต่หลายร้อยเมตรไปจนถึงหลายกิโลเมตร ในกรณีเช่นนี้ คุณควรสร้างเขตพื้นที่เสมือนโดยใช้รัศมีที่ใหญ่ขึ้น
อธิบายให้ผู้ใช้ทราบถึงสาเหตุที่แอปของคุณใช้การกำหนดเขตพื้นที่เสมือน
เนื่องจากแอปของคุณเข้าถึงตำแหน่งในเบื้องหลังเมื่อคุณใช้การกำหนดเขตพื้นที่เสมือน ให้พิจารณาว่าแอปของคุณให้ประโยชน์แก่ผู้ใช้อย่างไร อธิบายให้ผู้ใช้ทราบอย่างชัดเจนว่าเหตุใดแอปของคุณจึงต้องเข้าถึงข้อมูลนี้เพื่อเพิ่มความเข้าใจและความโปร่งใสของผู้ใช้
ดูข้อมูลเพิ่มเติมเกี่ยวกับแนวทางปฏิบัติแนะนำที่เกี่ยวข้องกับการเข้าถึงตำแหน่ง รวมถึงการกำหนดเขตพื้นที่เสมือนได้ที่หน้าแนวทางปฏิบัติแนะนำด้านความเป็นส่วนตัว
ใช้ประเภทการเปลี่ยนผ่านแบบอยู่กับที่เพื่อลดการแจ้งเตือนสแปม
หากคุณได้รับการแจ้งเตือนจำนวนมากเมื่อขับรถผ่านเขตพื้นที่เสมือนเป็นเวลาสั้นๆ วิธีที่ดีที่สุดในการลดการแจ้งเตือนคือการใช้ประเภทการเปลี่ยนผ่านเป็น
GEOFENCE_TRANSITION_DWELL แทน
GEOFENCE_TRANSITION_ENTER วิธีนี้จะทำให้ระบบส่งการแจ้งเตือนการหยุดพักก็ต่อเมื่อผู้ใช้หยุดอยู่ภายในเขตพื้นที่เสมือนเป็นระยะเวลาหนึ่งเท่านั้น คุณเลือกระยะเวลาได้โดยตั้งค่า
ระยะหน่วงเวลาการเอ้อระเหย
ลงทะเบียนเขตพื้นที่เสมือนอีกครั้งเมื่อจำเป็นเท่านั้น
ระบบจะเก็บเขตพื้นที่เสมือนที่ลงทะเบียนไว้ในกระบวนการ com.google.process.location ซึ่งเป็นของแพ็กเกจ com.google.android.gms
แอปไม่จำเป็นต้องดำเนินการใดๆ เพื่อจัดการเหตุการณ์ต่อไปนี้ เนื่องจากระบบจะกู้คืนเขตพื้นที่เสมือนหลังจากเหตุการณ์เหล่านี้
- อัปเกรดบริการ Google Play แล้ว
- ระบบปิดและรีสตาร์ทบริการ Google Play เนื่องจากข้อจำกัดด้านทรัพยากร
- กระบวนการระบุตำแหน่งขัดข้อง
แอปต้องลงทะเบียนเขตพื้นที่เสมือนอีกครั้งหากยังจำเป็นต้องใช้หลังจากเหตุการณ์ต่อไปนี้ เนื่องจากระบบไม่สามารถกู้คืนเขตพื้นที่เสมือนในกรณีต่อไปนี้ได้
- รีบูตอุปกรณ์แล้ว แอปควรฟังการดำเนินการเปิดเครื่องอุปกรณ์จนเสร็จสมบูรณ์ แล้วลงทะเบียนเขตพื้นที่เสมือนที่จำเป็นอีกครั้ง
- มีการถอนการติดตั้งแอปและติดตั้งอีกครั้ง
- ระบบจะล้างข้อมูลของแอป
- ระบบจะล้างข้อมูลบริการ Google Play
- แอปได้รับการแจ้งเตือน
GEOFENCE_NOT_AVAILABLEซึ่งมักเกิดขึ้นหลังจากปิดใช้ NLP (ผู้ให้บริการตำแหน่งเครือข่ายของ Android)
แก้ปัญหาเหตุการณ์การเข้าสู่เขตพื้นที่เสมือน
หากเขตพื้นที่เสมือนไม่ทำงานเมื่ออุปกรณ์เข้าสู่เขตพื้นที่เสมือน (การแจ้งเตือน
GEOFENCE_TRANSITION_ENTER ไม่ทำงาน) ก่อนอื่นให้ตรวจสอบว่าได้ลงทะเบียนเขตพื้นที่เสมือนอย่างถูกต้องตามที่อธิบายไว้ในคู่มือนี้
สาเหตุที่อาจทำให้การแจ้งเตือนไม่ทำงานตามที่คาดไว้มีดังนี้
- ตำแหน่งที่แม่นยำไม่พร้อมใช้งานภายในเขตพื้นที่เสมือนหรือเขตพื้นที่เสมือนมีขนาดเล็กเกินไป ในอุปกรณ์ส่วนใหญ่ บริการเขตพื้นที่เสมือนจะใช้เฉพาะตำแหน่งเครือข่ายสำหรับการทริกเกอร์เขตพื้นที่เสมือน บริการนี้ใช้วิธีนี้เนื่องจากตำแหน่งเครือข่ายใช้พลังงานน้อยกว่ามาก ใช้เวลาน้อยกว่าในการรับตำแหน่งที่ไม่ต่อเนื่อง และที่สำคัญที่สุดคือใช้ในอาคารได้
Wi-Fi ในอุปกรณ์ปิดอยู่ การเปิด Wi-Fi จะช่วยปรับปรุงความแม่นยำของตำแหน่งได้อย่างมาก ดังนั้นหาก Wi-Fi ปิดอยู่ แอปพลิเคชันของคุณอาจไม่ได้รับการแจ้งเตือนเขตพื้นที่เสมือน ทั้งนี้ขึ้นอยู่กับการตั้งค่าหลายอย่าง เช่น รัศมีของเขตพื้นที่เสมือน รุ่นอุปกรณ์ หรือเวอร์ชัน 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 นาที)
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดเขตพื้นที่เสมือนได้จากแหล่งข้อมูลต่อไปนี้
ตัวอย่าง
แอปตัวอย่างสำหรับการสร้างและตรวจสอบเขตพื้นที่เสมือน