เปลี่ยนการตั้งค่าตำแหน่ง

หากแอปของคุณจำเป็นต้องขอตำแหน่งหรือรับการอัปเดตสิทธิ์ อุปกรณ์จะต้องเปิดใช้การตั้งค่าระบบที่เหมาะสม เช่น การสแกน GPS หรือ Wi-Fi แทนที่จะเปิดใช้บริการต่างๆ เช่น GPS ของอุปกรณ์โดยตรง แอปของคุณจะระบุระดับความแม่นยำ/การใช้พลังงานที่จำเป็นและช่วงเวลาการอัปเดตที่ต้องการ และอุปกรณ์จะทำการเปลี่ยนแปลงการตั้งค่าระบบที่เหมาะสมโดยอัตโนมัติ การตั้งค่าเหล่านี้กำหนดโดยออบเจ็กต์ข้อมูล LocationRequest

บทเรียนนี้จะแสดงวิธีใช้ Settings Client เพื่อตรวจสอบว่ามีการเปิดใช้การตั้งค่าใดบ้าง และแสดงกล่องโต้ตอบการตั้งค่าตำแหน่งเพื่อให้ผู้ใช้อัปเดตการตั้งค่าได้ด้วยการแตะเพียงครั้งเดียว

กำหนดค่าบริการตำแหน่ง

หากต้องการใช้บริการตำแหน่งที่ให้บริการโดยบริการ Google Play และผู้ให้บริการ Fused Location ให้เชื่อมต่อแอปโดยใช้ Settings Client จากนั้นตรวจสอบการตั้งค่าตำแหน่งปัจจุบันและแจ้งให้ผู้ใช้เปิดใช้การตั้งค่าที่จำเป็นหากจำเป็น

แอปที่มีฟีเจอร์ซึ่งใช้บริการตำแหน่งต้องขอสิทธิ์เข้าถึงตำแหน่ง โดยขึ้นอยู่กับกรณีการใช้งานของฟีเจอร์เหล่านั้น

ตั้งค่าคำขอตำแหน่ง

หากต้องการจัดเก็บพารามิเตอร์สำหรับคำขอไปยังผู้ให้บริการ Fused Location ให้สร้าง LocationRequest พารามิเตอร์จะกำหนดระดับความแม่นยำสำหรับคำขอตำแหน่ง ดูรายละเอียดตัวเลือกคำขอตำแหน่งที่ใช้ได้ทั้งหมดได้ที่ข้อมูลอ้างอิงคลาส LocationRequest บทเรียนนี้จะตั้งค่าช่วงเวลาการอัปเดต ช่วงเวลาการอัปเดตที่เร็วที่สุด และลำดับความสำคัญ ดังที่อธิบายไว้ด้านล่าง

ช่วงเวลาการปรับข้อมูล
setIntervalMillis() - วิธีนี้จะกำหนดอัตราเป็นมิลลิวินาทีที่แอปของคุณต้องการรับการอัปเดตตำแหน่ง โปรดทราบว่าการอัปเดตตำแหน่งอาจเร็วหรือช้ากว่าอัตรานี้เล็กน้อยเพื่อเพิ่มประสิทธิภาพการใช้งานแบตเตอรี่ หรืออาจไม่มีการอัปเดตเลย (เช่น หากอุปกรณ์ไม่มีการเชื่อมต่อ)
ช่วงเวลาการอัปเดตที่เร็วที่สุด
setMinUpdateIntervalMillis() - เมธอดนี้จะตั้งค่าอัตราเร็วที่สุดเป็นมิลลิวินาทีที่แอปของคุณสามารถจัดการการอัปเดตตำแหน่งได้ คุณไม่จำเป็นต้องเรียกใช้เมธอดนี้ เว้นแต่ว่าแอปจะได้รับประโยชน์จากการรับการอัปเดตเร็วกว่าอัตราที่ระบุไว้ใน setInterval()
ลำดับความสำคัญ

setPriority() - วิธีนี้จะกำหนดลำดับความสำคัญของคำขอ ซึ่งจะบอกใบ้บริการตำแหน่งของบริการ Google Play อย่างชัดเจนเกี่ยวกับแหล่งที่มาของตำแหน่งที่จะใช้ ค่าที่รองรับมีดังนี้

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

สร้างคำขอตำแหน่งและตั้งค่าพารามิเตอร์ตามที่แสดงในตัวอย่างโค้ดนี้

Kotlin

  fun createLocationRequest() {
    val locationRequest = LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
        .setMinUpdateIntervalMillis(5000)
        .build()
}

Java

  protected void createLocationRequest() {
    LocationRequest locationRequest = new LocationRequest.Builder(Priority.PRIORITY_HIGH_ACCURACY, 10000)
            .setMinUpdateIntervalMillis(5000)
            .build();
}

ลำดับความสำคัญของ PRIORITY_HIGH_ACCURACY เมื่อรวมกับการตั้งค่าสิทธิ์ ACCESS_FINE_LOCATION ที่คุณกำหนดไว้ในไฟล์ Manifest ของแอป และช่วงเวลาการอัปเดตที่รวดเร็ว 5,000 มิลลิวินาที (5 วินาที) จะทำให้ผู้ให้บริการ Fused Location แสดงผลการอัปเดตตำแหน่งที่แม่นยำภายในระยะไม่กี่ฟุต แนวทางนี้เหมาะสำหรับแอปแผนที่ที่แสดงตำแหน่งแบบเรียลไทม์

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

ดูการตั้งค่าตำแหน่งปัจจุบัน

เมื่อเชื่อมต่อกับบริการ Google Play และ API บริการตำแหน่งแล้ว คุณจะดูการตั้งค่าตำแหน่งปัจจุบันของอุปกรณ์ของผู้ใช้ได้ โดยสร้าง LocationSettingsRequest.Builder แล้วเพิ่มคำขอตำแหน่งอย่างน้อย 1 รายการ ข้อมูลโค้ดต่อไปนี้แสดงวิธีเพิ่มคำขอตำแหน่งที่สร้างขึ้นในขั้นตอนก่อนหน้า

Kotlin

val builder = LocationSettingsRequest.Builder()
        .addLocationRequest(locationRequest)

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder()
     .addLocationRequest(locationRequest);

จากนั้นตรวจสอบว่าการตั้งค่าตำแหน่งปัจจุบันเป็นไปตามเงื่อนไขต่อไปนี้หรือไม่

Kotlin

val builder = LocationSettingsRequest.Builder()

// ...

val client: SettingsClient = LocationServices.getSettingsClient(this)
val task: Task<LocationSettingsResponse> = client.checkLocationSettings(builder.build())

Java

LocationSettingsRequest.Builder builder = new LocationSettingsRequest.Builder();

// ...

SettingsClient client = LocationServices.getSettingsClient(this);
Task<LocationSettingsResponse> task = client.checkLocationSettings(builder.build());

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

แจ้งให้ผู้ใช้เปลี่ยนการตั้งค่าตำแหน่ง

หากต้องการตรวจสอบว่าการตั้งค่าตำแหน่งเหมาะสมกับคำขอตำแหน่งหรือไม่ ให้เพิ่ม OnFailureListener ลงในออบเจ็กต์ Task ที่ตรวจสอบการตั้งค่าตำแหน่ง จากนั้นตรวจสอบว่าออบเจ็กต์ Exception ที่ส่งไปยังเมธอด onFailure() เป็นอินสแตนซ์ของคลาส ResolvableApiException หรือไม่ ซึ่งบ่งชี้ว่าต้องเปลี่ยนการตั้งค่า จากนั้นแสดงกล่องโต้ตอบที่แจ้งให้ผู้ใช้ขอสิทธิ์แก้ไขการตั้งค่าตำแหน่งโดยเรียกใช้ startResolutionForResult()

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

Kotlin

task.addOnSuccessListener { locationSettingsResponse ->
    // All location settings are satisfied. The client can initialize
    // location requests here.
    // ...
}

task.addOnFailureListener { exception ->
    if (exception is ResolvableApiException){
        // Location settings are not satisfied, but this can be fixed
        // by showing the user a dialog.
        try {
            // Show the dialog by calling startResolutionForResult(),
            // and check the result in onActivityResult().
            exception.startResolutionForResult(this@MainActivity,
                    REQUEST_CHECK_SETTINGS)
        } catch (sendEx: IntentSender.SendIntentException) {
            // Ignore the error.
        }
    }
}

Java

task.addOnSuccessListener(this, new OnSuccessListener<LocationSettingsResponse>() {
    @Override
    public void onSuccess(LocationSettingsResponse locationSettingsResponse) {
        // All location settings are satisfied. The client can initialize
        // location requests here.
        // ...
    }
});

task.addOnFailureListener(this, new OnFailureListener() {
    @Override
    public void onFailure(@NonNull Exception e) {
        if (e instanceof ResolvableApiException) {
            // Location settings are not satisfied, but this can be fixed
            // by showing the user a dialog.
            try {
                // Show the dialog by calling startResolutionForResult(),
                // and check the result in onActivityResult().
                ResolvableApiException resolvable = (ResolvableApiException) e;
                resolvable.startResolutionForResult(MainActivity.this,
                        REQUEST_CHECK_SETTINGS);
            } catch (IntentSender.SendIntentException sendEx) {
                // Ignore the error.
            }
        }
    }
});

บทเรียนถัดไปคือขอการอัปเดตตำแหน่งจะแสดงวิธีรับการอัปเดตตำแหน่งเป็นระยะๆ