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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

ตัวอย่าง

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