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

แอปของคุณสามารถใช้ 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 ดังที่ข้อมูลโค้ดต่อไปนี้แสดง

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

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

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

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

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

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

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

ตัวอย่าง

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