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

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

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

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

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

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

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

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

หากคุณต้องการใช้ 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);
}

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

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

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

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

ตัวอย่าง

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