แอปของคุณสามารถใช้ API ตำแหน่งของบริการ Google Play เพื่อขอตำแหน่งที่ทราบล่าสุดของอุปกรณ์ของผู้ใช้ได้ ในกรณีส่วนใหญ่ คุณจะสนใจตำแหน่งปัจจุบันของผู้ใช้ ซึ่งมักจะเทียบเท่ากับตำแหน่งที่ทราบล่าสุดของอุปกรณ์
โดยเฉพาะอย่างยิ่ง ให้ใช้ผู้ให้บริการ Fused Location เพื่อเรียกข้อมูลตำแหน่งที่ทราบล่าสุดของอุปกรณ์ ผู้ให้บริการ Fused Location เป็นหนึ่งใน API สถานที่ในบริการ Google Play โดยจะจัดการเทคโนโลยีตำแหน่งที่สำคัญและมี API ที่ใช้งานง่ายเพื่อให้คุณระบุข้อกำหนดในระดับสูงได้ เช่น ความแม่นยำสูงหรือใช้พลังงานต่ำ นอกจากนี้ยังเพิ่มประสิทธิภาพการใช้พลังงานแบตเตอรี่ของอุปกรณ์ด้วย
หมายเหตุ: เมื่อแอปทำงานอยู่เบื้องหลัง การเข้าถึงตำแหน่งควรมีความสำคัญต่อฟังก์ชันหลักของแอปและต้องมีการเปิดเผยข้อมูลที่เหมาะสมแก่ผู้ใช้
บทเรียนนี้จะแสดงวิธีส่งคำขอเดียวสำหรับตำแหน่งของอุปกรณ์โดยใช้เมธอด getLastLocation() ในผู้ให้บริการ Fused Location
ตั้งค่าบริการ Google Play
หากต้องการเข้าถึงผู้ให้บริการ Fused Location โปรเจ็กต์การพัฒนาของแอปต้องมีบริการ Google Play ดาวน์โหลดและติดตั้งคอมโพเนนต์บริการ Google Play ผ่านเครื่องมือจัดการ SDK แล้วเพิ่มไลบรารีลงในโปรเจ็กต์ ดูรายละเอียดได้ที่คู่มือการตั้งค่าบริการ Google Play
ระบุสิทธิ์ของแอป
แอปที่มีฟีเจอร์ซึ่งใช้บริการตำแหน่งต้องขอสิทธิ์เข้าถึงตำแหน่ง โดยขึ้นอยู่กับกรณีการใช้งานของฟีเจอร์เหล่านั้น
สร้างไคลเอ็นต์บริการตามตำแหน่ง
ในเมธอด onCreate() ของกิจกรรม ให้สร้างอินสแตนซ์ของไคลเอ็นต์ผู้ให้บริการ Fused Location ดังที่ข้อมูลโค้ดต่อไปนี้แสดง
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() ของผู้ให้บริการ Fused Location เพื่อดึงข้อมูลตำแหน่งของอุปกรณ์ได้ ความแม่นยำของตำแหน่งที่แสดงผลโดยการเรียกนี้จะกำหนดโดยการตั้งค่าสิทธิ์ที่คุณใส่ไว้ในไฟล์ 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 ในอุปกรณ์รีสตาร์ทแล้ว และไม่มีไคลเอ็นต์ผู้ให้บริการ Fused Location ที่ทำงานอยู่ซึ่งขอตำแหน่งหลังจากบริการรีสตาร์ท เพื่อหลีกเลี่ยงสถานการณ์นี้ คุณสามารถสร้างไคลเอ็นต์ใหม่และขอการอัปเดตตำแหน่งด้วยตนเองได้ ดูข้อมูลเพิ่มเติมได้ที่ขอการอัปเดตตำแหน่ง
เลือกค่าประมาณตำแหน่งที่ดีที่สุด
FusedLocationProviderClient มีวิธีการหลายวิธีในการดึงข้อมูลตำแหน่งของอุปกรณ์ เลือกจากตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้ โดยขึ้นอยู่กับกรณีการใช้งานของแอป
getLastLocation()จะได้รับค่าประมาณตำแหน่งได้เร็วขึ้นและลดการใช้แบตเตอรี่ที่อาจเกิดจากแอปของคุณ อย่างไรก็ตาม ข้อมูลตำแหน่งอาจล้าสมัยหากไม่มีไคลเอ็นต์อื่นใช้ตำแหน่งอย่างต่อเนื่องเมื่อเร็วๆ นี้getCurrentLocation()จะได้รับตำแหน่งที่ใหม่และแม่นยำยิ่งขึ้นอย่างสม่ำเสมอมากขึ้น อย่างไรก็ตาม วิธีนี้อาจทำให้เกิดการคำนวณตำแหน่งที่ใช้งานอยู่ในอุปกรณ์วิธีนี้เป็นวิธีที่แนะนำในการรับตำแหน่งใหม่เมื่อเป็นไปได้ และปลอดภัยกว่าทางเลือกอื่นๆ เช่น การเริ่มและจัดการการอัปเดตตำแหน่งด้วยตนเองโดยใช้
requestLocationUpdates()หากแอปเรียกใช้requestLocationUpdates()บางครั้งแอปอาจใช้พลังงานจำนวนมากหากไม่มีตำแหน่ง หรือหากคำขอไม่หยุดอย่างถูกต้องหลังจากได้รับตำแหน่งใหม่
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการดึงข้อมูลตำแหน่งปัจจุบันใน Android ได้จากแหล่งข้อมูลต่อไปนี้
ตัวอย่าง
- แอปตัวอย่างเพื่อสาธิตแนวทางปฏิบัติแนะนำขณะดึงข้อมูลตำแหน่งปัจจุบัน