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

เมื่อใช้ Location API ของบริการ Google Play แอปจะขอตำแหน่งล่าสุดที่ทราบของอุปกรณ์ของผู้ใช้ได้ ในกรณีส่วนใหญ่ คุณสนใจตำแหน่งปัจจุบันของผู้ใช้ ซึ่งมักจะเทียบเท่ากับตำแหน่งที่ทราบล่าสุดของอุปกรณ์

กล่าวโดยละเอียดคือ ให้ใช้ผู้ให้บริการตำแหน่งแบบรวมเพื่อดึงข้อมูลตำแหน่งที่ทราบล่าสุดของอุปกรณ์ ผู้ให้บริการตำแหน่งแบบรวมเป็นหนึ่งใน API ตำแหน่งในบริการ Google Play โดยจะจัดการเทคโนโลยีตำแหน่งพื้นฐานและให้บริการ API ที่ใช้งานง่ายเพื่อให้คุณระบุข้อกำหนดในระดับสูงได้ เช่น ความแม่นยำสูงหรือพลังงานต่ำ รวมถึงเพิ่มประสิทธิภาพการใช้พลังงานแบตเตอรี่ของอุปกรณ์ด้วย

หมายเหตุ: เมื่อแอปทำงานอยู่เบื้องหลัง การเข้าถึงตำแหน่งควรมีความสําคัญต่อฟังก์ชันหลักของแอปและมีการเปิดเผยข้อมูลที่เหมาะสมต่อผู้ใช้

บทเรียนนี้จะแสดงวิธีส่งคําขอตําแหน่งของอุปกรณ์ครั้งเดียวโดยใช้เมธอด getLastLocation() ในผู้ให้บริการตําแหน่งที่ผสาน

ตั้งค่าบริการ Google Play

หากต้องการเข้าถึงผู้ให้บริการตำแหน่งที่ผสาน โปรเจ็กต์การพัฒนาแอปของคุณต้องมีบริการ Google Play ดาวน์โหลดและติดตั้งคอมโพเนนต์บริการ Google Play ผ่านเครื่องมือจัดการ SDK และเพิ่มไลบรารีลงในโปรเจ็กต์ โปรดดูรายละเอียดในคู่มือการตั้งค่าบริการ Google Play

ระบุสิทธิ์ของแอป

แอปที่มีฟีเจอร์ใช้บริการตำแหน่งต้องขอสิทธิ์เข้าถึงตำแหน่ง โดยขึ้นอยู่กับกรณีการใช้งานของฟีเจอร์เหล่านั้น

สร้างไคลเอ็นต์บริการตำแหน่ง

ในเมธอด onCreate() ของกิจกรรม ให้สร้างอินสแตนซ์ของไคลเอ็นต์ผู้ให้บริการตำแหน่งแบบรวมตามที่ข้อมูลโค้ดต่อไปนี้แสดง

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

เลือกตำแหน่งโดยประมาณที่ดีที่สุด

FusedLocationProviderClient มีวิธีการดึงข้อมูลตำแหน่งของอุปกรณ์หลายวิธี เลือกจากรายการต่อไปนี้ โดยขึ้นอยู่กับกรณีการใช้งานของแอป

  • getLastLocation() จะได้รับตำแหน่งโดยประมาณเร็วขึ้นและลดการใช้แบตเตอรี่ที่มาจากแอปของคุณได้ อย่างไรก็ตาม ข้อมูลตำแหน่งอาจล้าสมัยหากไม่มีไคลเอ็นต์รายอื่นใช้ตำแหน่งอย่างสม่ำเสมอเมื่อเร็วๆ นี้
  • getCurrentLocation() ได้รับตำแหน่งที่แม่นยำและใหม่กว่าอย่างสม่ำเสมอมากขึ้น อย่างไรก็ตาม วิธีนี้อาจทําให้เกิดการประมวลผลตําแหน่งปัจจุบันในอุปกรณ์

    วิธีนี้เป็นวิธีที่แนะนำในการรับตำแหน่งใหม่ทุกครั้งที่เป็นไปได้ และปลอดภัยกว่าวิธีอื่นๆ เช่น การเริ่มและจัดการการอัปเดตตำแหน่งด้วยตนเองโดยใช้ requestLocationUpdates() หากแอปเรียกใช้ requestLocationUpdates() บางครั้งแอปอาจใช้พลังงานเป็นจำนวนมากหากไม่มีตำแหน่ง หรือหากคำขอไม่หยุดอย่างถูกต้องหลังจากได้รับตำแหน่งใหม่

แหล่งข้อมูลเพิ่มเติม

ดูข้อมูลเพิ่มเติมเกี่ยวกับการดึงข้อมูลตำแหน่งปัจจุบันใน Android ได้ที่เนื้อหาต่อไปนี้

ตัวอย่าง

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