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

แอปของคุณสามารถขอตำแหน่งล่าสุดที่ทราบของอุปกรณ์ของผู้ใช้ได้โดยใช้ 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 ได้จากสื่อต่อไปนี้

ตัวอย่าง

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