รับตำแหน่งที่รู้จักล่าสุด

เมื่อใช้ 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 ได้จากแหล่งข้อมูลต่อไปนี้

ตัวอย่าง

  • แอปตัวอย่างเพื่อสาธิตแนวทางปฏิบัติแนะนำขณะดึงข้อมูลตำแหน่งปัจจุบัน