เมื่อใช้ 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 ดังที่ข้อมูลโค้ดต่อไปนี้แสดง
private lateinit var fusedLocationClient: FusedLocationProviderClient override fun onCreate(savedInstanceState: Bundle?) { // ... fusedLocationClient = LocationServices.getFusedLocationProviderClient(this) }
รับตำแหน่งที่รู้จักล่าสุด
เมื่อสร้างไคลเอ็นต์บริการตำแหน่งแล้ว คุณจะดูตำแหน่งที่ทราบล่าสุดของอุปกรณ์ของผู้ใช้ได้ ใช้เมธอด getLastLocation() ของผู้ให้บริการ Fused Location เพื่อดึงข้อมูลตำแหน่งของอุปกรณ์ ความแม่นยำของตำแหน่งที่ได้จากการเรียกนี้จะขึ้นอยู่กับการตั้งค่าสิทธิ์ที่คุณใส่ไว้ในไฟล์ Manifest ของแอป ตามที่อธิบายไว้ในคำแนะนำเกี่ยวกับวิธีขอสิทธิ์เข้าถึงตำแหน่ง
หากต้องการขอตำแหน่งที่ทราบล่าสุด ให้เรียกใช้เมธอด getLastLocation()
ข้อมูลโค้ดต่อไปนี้แสดงคำขอและการจัดการการตอบกลับขั้นพื้นฐาน
fusedLocationClient.lastLocation .addOnSuccessListener { location: Location? -> // Got last known location. In some rare situations this can be null. }
เมธอด getLastLocation() จะแสดงผล Task ที่คุณใช้เพื่อรับออบเจ็กต์ Location ที่มีพิกัดละติจูดและลองจิจูดของสถานที่ตั้งทางภูมิศาสตร์ได้ ออบเจ็กต์ตำแหน่งอาจเป็น null ในสถานการณ์ต่อไปนี้
- ตำแหน่งปิดอยู่ในการตั้งค่าอุปกรณ์ ผลลัพธ์อาจเป็น
nullแม้ว่าจะมีการดึงข้อมูลตำแหน่งล่าสุดไว้ก่อนหน้านี้ เนื่องจากเมื่อปิดใช้ตำแหน่ง ระบบจะล้างแคชด้วย - อุปกรณ์ไม่เคยบันทึกตำแหน่ง ซึ่งอาจเป็นกรณีของอุปกรณ์ใหม่หรืออุปกรณ์ที่คืนค่าเป็นการตั้งค่าเริ่มต้น
- บริการ Google Play บนอุปกรณ์รีสตาร์ทแล้ว และไม่มีไคลเอ็นต์ผู้ให้บริการ Fused Location ที่ใช้งานอยู่ซึ่งขอตำแหน่งหลังจากที่บริการรีสตาร์ท เพื่อหลีกเลี่ยงสถานการณ์นี้ คุณสามารถสร้างไคลเอ็นต์ใหม่และขอการอัปเดตตำแหน่งด้วยตนเอง ดูข้อมูลเพิ่มเติมได้ที่ขอการอัปเดตตำแหน่ง
เลือกค่าประมาณตำแหน่งที่ดีที่สุด
FusedLocationProviderClient มีวิธีการหลายวิธีในการดึงข้อมูลตำแหน่งของอุปกรณ์ เลือกจากตัวเลือกใดตัวเลือกหนึ่งต่อไปนี้ โดยขึ้นอยู่กับกรณีการใช้งานของแอป
getLastLocation()จะได้รับตำแหน่งโดยประมาณเร็วขึ้นและลดการใช้แบตเตอรี่ที่อาจเกิดจากแอปของคุณ อย่างไรก็ตาม ข้อมูลตำแหน่งอาจล้าสมัยหากไม่มีไคลเอ็นต์อื่นๆ ที่ใช้ตำแหน่งอยู่เมื่อเร็วๆ นี้getCurrentLocation()จะได้รับตำแหน่งที่ใหม่และแม่นยำยิ่งขึ้นอย่างสม่ำเสมอมากขึ้น อย่างไรก็ตาม วิธีนี้อาจทำให้เกิดการคำนวณตำแหน่งที่ใช้งานอยู่ในอุปกรณ์วิธีนี้เป็นวิธีที่แนะนำในการรับตำแหน่งใหม่ทุกครั้งที่ทำได้ และปลอดภัยกว่าทางเลือกอื่นๆ เช่น การเริ่มและจัดการการอัปเดตตำแหน่งด้วยตนเองโดยใช้
requestLocationUpdates()หากแอปเรียกใช้requestLocationUpdates()บางครั้งแอปอาจใช้พลังงานจำนวนมากหากไม่มีตำแหน่ง หรือหากคำขอไม่หยุดอย่างถูกต้องหลังจากได้รับตำแหน่งใหม่
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมเกี่ยวกับการดึงข้อมูลตำแหน่งปัจจุบันใน Android ได้จากแหล่งข้อมูลต่อไปนี้
ตัวอย่าง
- แอปตัวอย่างเพื่อสาธิตแนวทางปฏิบัติแนะนำขณะดึงข้อมูลตำแหน่งปัจจุบัน