เมื่อใช้ Location API ของบริการ Google Play แอปจะขอตำแหน่งล่าสุดที่ทราบของอุปกรณ์ของผู้ใช้ได้ ในกรณีส่วนใหญ่ คุณสนใจตำแหน่งปัจจุบันของผู้ใช้ ซึ่งมักจะเทียบเท่ากับตำแหน่งที่ทราบล่าสุดของอุปกรณ์
กล่าวโดยละเอียดคือ ให้ใช้ผู้ให้บริการตำแหน่งแบบรวมเพื่อดึงข้อมูลตำแหน่งที่ทราบล่าสุดของอุปกรณ์ ผู้ให้บริการตำแหน่งแบบรวมเป็นหนึ่งใน API ตำแหน่งในบริการ Google Play โดยจะจัดการเทคโนโลยีตำแหน่งพื้นฐานและให้บริการ API ที่ใช้งานง่ายเพื่อให้คุณระบุข้อกำหนดในระดับสูงได้ เช่น ความแม่นยำสูงหรือพลังงานต่ำ รวมถึงเพิ่มประสิทธิภาพการใช้พลังงานแบตเตอรี่ของอุปกรณ์ด้วย
หมายเหตุ: เมื่อแอปทำงานอยู่เบื้องหลัง การเข้าถึงตำแหน่งควรมีความสําคัญต่อฟังก์ชันหลักของแอปและมีการเปิดเผยข้อมูลที่เหมาะสมต่อผู้ใช้
บทเรียนนี้จะแสดงวิธีส่งคําขอตําแหน่งของอุปกรณ์ครั้งเดียวโดยใช้เมธอด getLastLocation()
ในผู้ให้บริการตําแหน่งแบบรวม
ตั้งค่าบริการ Google Play
หากต้องการเข้าถึงผู้ให้บริการตำแหน่งที่ผสาน โปรเจ็กต์การพัฒนาแอปของคุณต้องมีบริการ Google Play ดาวน์โหลดและติดตั้งคอมโพเนนต์บริการ Google Play ผ่านเครื่องมือจัดการ SDK และเพิ่มไลบรารีลงในโปรเจ็กต์ของคุณ โปรดดูรายละเอียดในคำแนะนำเกี่ยวกับการตั้งค่าบริการ Google Play
ระบุสิทธิ์ของแอป
แอปที่มีฟีเจอร์ใช้บริการตำแหน่งต้องขอสิทธิ์เข้าถึงตำแหน่ง โดยขึ้นอยู่กับกรณีการใช้งานของฟีเจอร์เหล่านั้น
สร้างไคลเอ็นต์บริการตำแหน่ง
ในเมธอด onCreate()
ของกิจกรรม ให้สร้างอินสแตนซ์ของไคลเอ็นต์ผู้ให้บริการตำแหน่งแบบรวมตามที่ข้อมูลโค้ดต่อไปนี้แสดง
Kotlin
private lateinit var fusedLocationClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) { // ... fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) }
Java
private FusedLocationProviderClient fusedLocationClient; // .. @Override protected void onCreate(Bundle savedInstanceState) { // ... fusedLocationClient = LocationServices.getFusedLocationProviderClient(this); }
รับตำแหน่งที่รู้จักล่าสุด
เมื่อสร้างไคลเอ็นต์บริการหาตำแหน่งแล้ว คุณจะได้รับตำแหน่งที่ทราบล่าสุดของอุปกรณ์ของผู้ใช้ เมื่อแอปเชื่อมต่อกับบริการเหล่านี้ คุณจะใช้วิธีการของผู้ให้บริการตำแหน่งแบบรวม getLastLocation()
เพื่อดึงข้อมูลตำแหน่งของอุปกรณ์ได้ ความแม่นยำของตำแหน่งที่การเรียกนี้แสดงจะขึ้นอยู่กับการตั้งค่าสิทธิ์ที่คุณใส่ไว้ในไฟล์ Manifest ของแอป ตามที่อธิบายไว้ในคู่มือเกี่ยวกับวิธีขอสิทธิ์เข้าถึงตำแหน่ง
หากต้องการขอตำแหน่งที่ทราบล่าสุด ให้เรียกใช้เมธอด getLastLocation()
ข้อมูลโค้ดต่อไปนี้แสดงคําขอและการจัดการการตอบกลับอย่างง่าย
Kotlin
fusedLocationClient.lastLocation .addOnSuccessListener { location : Location? -> // Got last known location. In some rare situations this can be null. }
Java
fusedLocationClient.getLastLocation() .addOnSuccessListener(this, new OnSuccessListener<Location>() { @Override public void onSuccess(Location location) { // Got last known location. In some rare situations this can be null. if (location != null) { // Logic to handle location object } } });
วิธีการ getLastLocation()
จะแสดงผล Task
ที่คุณสามารถใช้รับออบเจ็กต์ Location
ที่มีพิกัดละติจูดและลองจิจูดของสถานที่ตั้งทางภูมิศาสตร์ ออบเจ็กต์สถานที่ตั้งอาจเป็น null
ในกรณีต่อไปนี้
- ตำแหน่งปิดอยู่ในการตั้งค่าอุปกรณ์ ผลลัพธ์ที่ได้อาจเป็น
null
แม้ว่าก่อนหน้านี้จะมีการดึงข้อมูลตำแหน่งล่าสุดแล้ว เนื่องจากการปิดใช้ตำแหน่งจะล้างแคชด้วย - อุปกรณ์ไม่เคยบันทึกตำแหน่ง ซึ่งอาจเป็นกรณีของอุปกรณ์ใหม่หรืออุปกรณ์ที่กู้คืนเป็นการตั้งค่าเริ่มต้น
- บริการ Google Play ในอุปกรณ์ได้รีสตาร์ทแล้ว และไม่มีไคลเอ็นต์ผู้ให้บริการตำแหน่งแบบรวมที่ขอตำแหน่งหลังจากรีสตาร์ทบริการ หากต้องการหลีกเลี่ยงสถานการณ์นี้ คุณสามารถสร้างลูกค้าใหม่และขอให้อัปเดตตำแหน่งด้วยตนเองได้ ดูข้อมูลเพิ่มเติมได้ที่การรับการอัปเดตตำแหน่ง
เลือกตำแหน่งโดยประมาณที่ดีที่สุด
FusedLocationProviderClient
มีวิธีการดึงข้อมูลตำแหน่งของอุปกรณ์หลายวิธี เลือกจากรายการต่อไปนี้ โดยขึ้นอยู่กับกรณีการใช้งานของแอป
getLastLocation()
จะได้รับตำแหน่งโดยประมาณเร็วขึ้นและลดการใช้แบตเตอรี่ที่มาจากแอปของคุณได้ อย่างไรก็ตาม ข้อมูลตำแหน่งอาจล้าสมัยหากไม่มีไคลเอ็นต์รายอื่นใช้ตำแหน่งอย่างสม่ำเสมอเมื่อเร็วๆ นี้getCurrentLocation()
ได้รับตำแหน่งที่แม่นยำและใหม่กว่าอย่างสม่ำเสมอมากขึ้น อย่างไรก็ตาม วิธีนี้อาจทําให้อุปกรณ์คํานวณตําแหน่งปัจจุบันวิธีนี้เป็นวิธีที่แนะนําในการรับตําแหน่งใหม่ทุกครั้งที่เป็นไปได้ และปลอดภัยกว่าวิธีอื่นๆ เช่น การเริ่มและจัดการการอัปเดตตําแหน่งด้วยตนเองโดยใช้
requestLocationUpdates()
หากแอปเรียกใช้requestLocationUpdates()
บางครั้งแอปอาจใช้พลังงานเป็นจำนวนมากหากไม่มีตำแหน่ง หรือหากคำขอไม่หยุดอย่างถูกต้องหลังจากได้รับตำแหน่งใหม่
แหล่งข้อมูลเพิ่มเติม
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการดึงข้อมูลตำแหน่งปัจจุบันใน Android ให้ดูเนื้อหาต่อไปนี้
ตัวอย่าง
- ตัวอย่างแอปเพื่อสาธิตแนวทางปฏิบัติแนะนำขณะดึงข้อมูลตำแหน่งปัจจุบัน