หากแอปต้องขอตำแหน่งหรือรับการอัปเดตสิทธิ์ อุปกรณ์จะต้องเปิดใช้การตั้งค่าระบบที่เหมาะสม เช่น การสแกน GPS หรือ Wi-Fi
แทนที่จะเปิดใช้บริการต่างๆ โดยตรง เช่น GPS ของอุปกรณ์
แอปของคุณจะระบุระดับความแม่นยำ/การใช้พลังงานที่จำเป็นและ
ช่วงเวลาการอัปเดตที่ต้องการ จากนั้นอุปกรณ์จะทำการเปลี่ยนแปลงที่เหมาะสม
กับการตั้งค่าระบบโดยอัตโนมัติ การตั้งค่าเหล่านี้กำหนดโดยออบเจ็กต์ข้อมูล
LocationRequest
บทเรียนนี้แสดงวิธีใช้ Settings Client เพื่อตรวจสอบว่ามีการเปิดใช้การตั้งค่าใดบ้าง และแสดงกล่องโต้ตอบการตั้งค่าตำแหน่ง เพื่อให้ผู้ใช้อัปเดตการตั้งค่าได้ด้วยการแตะเพียงครั้งเดียว
กำหนดค่าบริการตำแหน่ง
หากต้องการใช้บริการตำแหน่งที่ให้บริการโดยบริการ Google Play และ ผู้ให้บริการตำแหน่งแบบรวม ให้เชื่อมต่อแอปโดยใช้ Settings Client จากนั้นตรวจสอบการตั้งค่าตำแหน่งปัจจุบันและแจ้งให้ผู้ใช้เปิดใช้ การตั้งค่าที่จำเป็นหากจำเป็น
แอปที่มีฟีเจอร์ที่ใช้บริการตำแหน่งต้องขอสิทธิ์เข้าถึงตำแหน่ง ตามกรณีการใช้งานของฟีเจอร์เหล่านั้น
ตั้งค่าคำขอตำแหน่ง
หากต้องการจัดเก็บพารามิเตอร์สำหรับคำขอไปยังผู้ให้บริการตำแหน่งที่ผสานรวม ให้สร้าง
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 วินาที) ทำให้ผู้ให้บริการตำแหน่งที่ผสานรวม
แสดงข้อมูลอัปเดตตำแหน่งที่แม่นยำภายในไม่กี่ฟุต
แนวทางนี้เหมาะสำหรับแอปการนำทางที่แสดงตำแหน่งแบบเรียลไทม์
เคล็ดลับด้านประสิทธิภาพ: หากแอปเข้าถึงเครือข่ายหรือทำงานอื่นๆ ที่ใช้เวลานานหลังจากได้รับการอัปเดตตำแหน่ง ให้ปรับช่วงเวลาที่เร็วที่สุดเป็นค่าที่ช้าลง การปรับนี้จะป้องกันไม่ให้แอป ได้รับการอัปเดตที่ใช้ไม่ได้ เมื่อการทำงานที่ใช้เวลานานเสร็จสิ้น ให้ตั้งค่าช่วงเวลาที่เร็วที่สุดกลับไปเป็นค่าที่เร็ว
ดูการตั้งค่าตำแหน่งปัจจุบัน
เมื่อเชื่อมต่อกับบริการ 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. } } } });
บทเรียนถัดไป ขออัปเดตตำแหน่งจะแสดง วิธีรับการอัปเดตตำแหน่งเป็นระยะ