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

บทเรียนนี้แสดงวิธีการเพิ่มและนําเขตพื้นที่เสมือนออก จากนั้นฟังการเปลี่ยนเขตพื้นที่เสมือน
โดยใช้ BroadcastReceiver
หมายเหตุ: ในอุปกรณ์ Wear นั้น 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); }
สร้างและเพิ่มเขตพื้นที่เสมือน
แอปของคุณต้องสร้างและเพิ่มเขตพื้นที่เสมือนโดยใช้คลาสตัวสร้างของ Location 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
ที่ส่งจากบริการหาตำแหน่งสามารถทริกเกอร์การดำเนินการต่างๆ ในแอปได้ แต่คุณไม่ควรให้เริ่มกิจกรรมหรือข้อมูลโค้ดย่อย เนื่องจากคอมโพเนนต์ควรปรากฏขึ้นเมื่อผู้ใช้ดำเนินการเท่านั้น ในหลายกรณี BroadcastReceiver
เป็นวิธีที่ดีในการจัดการการเปลี่ยนเขตพื้นที่เสมือน 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
ที่คุณรวมไว้ในคำขอเพิ่มเขตพื้นที่เสมือน Broadcast Receiver เช่น
GeofenceBroadcastReceiver
สังเกตเห็นว่ามีการเรียก Intent
และ
จะได้เหตุการณ์การกำหนดเขตพื้นที่เสมือนจากความตั้งใจ ระบุประเภทของการเปลี่ยนเขตพื้นที่เสมือน
และระบุเขตพื้นที่เสมือนที่กำหนดไว้ซึ่งถูกเรียกให้แสดง ผู้รับการออกอากาศสามารถสั่งให้แอปเริ่มทํางานเบื้องหลัง หรือส่งการแจ้งเตือนเป็นเอาต์พุตได้หากต้องการ
หมายเหตุ: ใน 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 วินาที อาจใช้เวลานานกว่านั้นเล็กน้อยในการรับแอตทริบิวต์ )
ใช้รัศมีของเขตพื้นที่เสมือนที่ใหญ่ขึ้นสำหรับสถานที่ที่ผู้ใช้ใช้เวลาอยู่เป็นเวลานาน เช่น บ้านหรือที่ทำงาน แม้ว่ารัศมีที่มากขึ้นจะไม่ช่วยลดการใช้พลังงานโดยตรง แต่ก็จะช่วยลดความถี่ที่แอปตรวจสอบทางเข้าหรือทางออก ซึ่งจะช่วยลดการใช้พลังงานโดยรวมได้อย่างมีประสิทธิภาพ
เลือกรัศมีที่เหมาะสมที่สุดสำหรับเขตพื้นที่เสมือน
เพื่อผลลัพธ์ที่ดีที่สุด คุณควรตั้งค่ารัศมีขั้นต่ำของเขตพื้นที่เสมือนระหว่าง 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 เท่านั้น ถ้าปิดใช้ทั้งสองโหมด ใช้ SettingsClient เพื่อให้แน่ใจว่าการตั้งค่าระบบของอุปกรณ์จะได้รับการกำหนดค่าอย่างเหมาะสมเพื่อประสิทธิภาพสูงสุด การตรวจหาตำแหน่ง
หมายเหตุ: หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) หรือ สูงกว่า คุณจะไม่สามารถโทรหา
WifiManager.setEnabled()
โดยตรง ยกเว้น แอปของคุณเป็นแอประบบหรือนโยบายด้านอุปกรณ์ (DPC) แต่ให้ใช้แผงการตั้งค่าแทน- ไม่มีการเชื่อมต่อเครือข่ายที่เชื่อถือได้ภายในเขตพื้นที่เสมือน หากไม่มีการเชื่อมต่ออินเทอร์เน็ตที่เชื่อถือได้ ระบบอาจไม่สร้างการแจ้งเตือน เนื่องจากบริการเขตพื้นที่เสมือน ขึ้นอยู่กับผู้ให้บริการตำแหน่งเครือข่าย ซึ่งจะส่งผลให้ต้องมีการเชื่อมต่อข้อมูล
- การแจ้งเตือนอาจล่าช้า บริการเขตพื้นที่เสมือนไม่ได้ค้นหาอย่างต่อเนื่อง ตำแหน่ง ดังนั้นจึงคาดว่าจะต้องใช้เวลาในการตอบสนองบ้างเมื่อได้รับการแจ้งเตือน โดยปกติเวลาในการตอบสนองจะน้อยกว่า 2 นาที หรืออาจน้อยลงเมื่อมีการขยับอุปกรณ์ หากขีดจำกัดของตำแหน่งในเบื้องหลังมีผลอยู่ เวลาในการตอบสนองโดยเฉลี่ยจะอยู่ที่ประมาณ 2-3 นาที หากอุปกรณ์ไม่มีการเคลื่อนไหวเป็นระยะเวลานาน เวลาในการตอบสนองอาจเพิ่มขึ้น (สูงสุด 6 นาที)
แหล่งข้อมูลเพิ่มเติม
หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับการกำหนดเขตพื้นที่เสมือน โปรดดูเอกสารต่อไปนี้
ตัวอย่าง
แอปตัวอย่างสำหรับการสร้างและตรวจสอบเขตพื้นที่เสมือน