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

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

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

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

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

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

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

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

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

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

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

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

Kotlin

fun createLocationRequest() {
  val locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build()
}

Java

protected void createLocationRequest() {
  LocationRequest locationRequest = LocationRequest.Builder()
      .setIntervalMillis(10000)
      .setFastestIntervalMillis(5000)
      .setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY)
      .build();
}

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

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

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

เมื่อคุณเชื่อมต่อกับบริการ 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 ออบเจ็กต์ หากต้องการดูรายละเอียดเพิ่มเติมเกี่ยวกับสถานะปัจจุบันของธุรกิจที่เกี่ยวข้อง แอปของคุณสามารถเรียก LocationSettingsResponse ของออบเจ็กต์ getLocationSettingsStates()

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

พิจารณาว่าการตั้งค่าตำแหน่งเหมาะสมกับตำแหน่งหรือไม่ คำขอ ให้เพิ่ม 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.
            }
        }
    }
});

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