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