สร้างและตรวจสอบเขตพื้นที่เสมือน

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

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

บทเรียนนี้จะแสดงวิธีเพิ่มและนำการกำหนดเขตพื้นที่เสมือนออก จากนั้นฟังการเปลี่ยนเขตพื้นที่เสมือนโดยใช้ BroadcastReceiver

หมายเหตุ: ในอุปกรณ์ Wear นั้น API การกำหนดเขตพื้นที่เสมือนจะไม่ใช้พลังงานอย่างมีประสิทธิภาพ เราไม่แนะนำให้ใช้ API เหล่านี้ใน Wear อ่านข้อมูลเพิ่มเติมที่หัวข้อประหยัดพลังงานและแบตเตอรี่

ตั้งค่าการตรวจสอบเขตพื้นที่เสมือน

ขั้นตอนแรกในการขอใช้การตรวจสอบเขตพื้นที่เสมือนคือการขอสิทธิ์ที่จําเป็น หากต้องการใช้การกำหนดเขตพื้นที่เสมือน แอปของคุณจะต้องขอสิ่งต่อไปนี้

ดูข้อมูลเพิ่มเติมได้ที่คำแนะนำเกี่ยวกับวิธีขอสิทธิ์เข้าถึงตำแหน่ง

หากต้องการใช้ BroadcastReceiver เพื่อฟังการเปลี่ยนเขตพื้นที่เสมือน ให้เพิ่มองค์ประกอบที่ระบุชื่อบริการ องค์ประกอบนี้ต้องอยู่ภายใต้องค์ประกอบ <application>

<application
   android:allowBackup="true">
   ...
   <receiver android:name=".GeofenceBroadcastReceiver"/>
<application/>

หากต้องการเข้าถึง Location 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 เขตพื้นที่เสมือนต่อแอปต่อผู้ใช้อุปกรณ์ 1 คน

สร้างออบเจ็กต์เขตพื้นที่เสมือน

ก่อนอื่น ให้ใช้ 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 ที่คุณระบุไว้ในคำขอเพิ่มเขตพื้นที่เสมือน ตัวรับการออกอากาศอย่าง GeofenceBroadcastReceiver จะสังเกตเห็นว่ามีการเรียกใช้ Intent แล้วจึงรับเหตุการณ์การกำหนดเขตพื้นที่เสมือนจาก 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
                // ...
            }
        });

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

ใช้แนวทางปฏิบัติแนะนำสำหรับการกำหนดเขตพื้นที่เสมือน

ส่วนนี้จะกล่าวถึงคําแนะนําในการใช้การกำหนดเขตพื้นที่เสมือนกับ Location 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 เท่านั้นหากปิดใช้ทั้ง 2 โหมด ใช้ SettingsClient เพื่อให้แน่ใจว่าการตั้งค่าระบบของอุปกรณ์ได้รับการกําหนดค่าอย่างถูกต้องสําหรับการตรวจหาตําแหน่งที่ดีที่สุด

    หมายเหตุ: หากแอปกำหนดเป้าหมายเป็น Android 10 (API ระดับ 29) ขึ้นไป คุณจะเรียก WifiManager.setEnabled() โดยตรงไม่ได้ เว้นแต่แอปจะเป็นแอประบบหรือตัวควบคุมนโยบายอุปกรณ์ (DPC) แต่ให้ใช้แผงการตั้งค่าแทน

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

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการกำหนดเขตพื้นที่เสมือนได้ที่เอกสารต่อไปนี้

ตัวอย่าง

ตัวอย่างแอปสำหรับสร้างและตรวจสอบเขตพื้นที่เสมือน