ขออัปเดตตำแหน่ง

การใช้ข้อมูลตำแหน่งอย่างเหมาะสมสามารถเป็นประโยชน์ต่อผู้ใช้ แอป ตัวอย่างเช่น หากแอปของคุณช่วยผู้ใช้ค้นหาเส้นทางขณะเดิน หรือ หรือถ้าแอปของคุณติดตามตำแหน่งของเนื้อหา แอปจะต้องมีพร็อพเพอร์ตี้ ตำแหน่งของอุปกรณ์เป็นระยะๆ นอกจากสถานที่ตั้งทางภูมิศาสตร์ (ละติจูดและลองจิจูด) แล้ว คุณอาจต้องการให้ข้อมูลเพิ่มเติมแก่ผู้ใช้ เช่น ทิศทาง (ทิศทางการเคลื่อนที่ในแนวนอน) ความสูง หรือความเร็วของอุปกรณ์ ข้อมูลนี้และอื่นๆ จะอยู่ใน Location ที่แอปของคุณสามารถดึงข้อมูลจาก รวมเข้าด้วยกัน ผู้ให้บริการตำแหน่ง API จะอัปเดตแอปของคุณเป็นระยะๆ ด้วยการตอบสนอง ตำแหน่งที่ดีที่สุดที่ใช้ได้ โดยดูจากตำแหน่งที่มีให้บริการในปัจจุบัน ผู้ให้บริการ เช่น WiFi และ GPS (Global Positioning System) ความแม่นยำของตำแหน่งจะขึ้นอยู่กับผู้ให้บริการ, สิทธิ์เข้าถึงตำแหน่งที่คุณขอ และตัวเลือกที่คุณตั้งค่าในคำขอตำแหน่ง

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

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

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

ส่งคำขอตำแหน่ง

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

ผู้ให้บริการตำแหน่งที่ผสานจะเรียกใช้เมธอดการเรียกกลับ LocationCallback.onLocationResult() และส่งรายการออบเจ็กต์ Location หรือจะส่ง PendingIntent ที่มีตำแหน่งในข้อมูลแบบขยายก็ได้ ทั้งนี้ขึ้นอยู่กับรูปแบบของคำขอ ความแม่นยำและความถี่ในการอัปเดตจะขึ้นอยู่กับสิทธิ์เข้าถึงตำแหน่งที่คุณขอและตัวเลือกที่คุณตั้งค่าไว้ในออบเจ็กต์คำขอตำแหน่ง

บทเรียนนี้จะแสดงวิธีรับการอัปเดตโดยใช้แนวทางการเรียกกลับ LocationCallback โทร requestLocationUpdates(), กำลังส่งอินสแตนซ์ LocationRequest ออบเจ็กต์ และ LocationCallback กำหนดเมธอด startLocationUpdates() ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

โปรดทราบว่าข้อมูลโค้ดด้านบนอ้างอิงถึง Flag แบบบูลีน requestingLocationUpdates ซึ่งใช้เพื่อติดตามว่าผู้ใช้เปิดหรือปิดการอัปเดตตำแหน่งไว้ หากผู้ใช้ปิดการอัปเดตตำแหน่งไว้ คุณสามารถแจ้งผู้ใช้เกี่ยวกับข้อกำหนดด้านตำแหน่งของแอป สำหรับ ข้อมูลเพิ่มเติมเกี่ยวกับการรักษาค่าของแฟล็กบูลีนไว้ในทุกๆ อินสแตนซ์ของ กิจกรรม โปรดดูบันทึกข้อมูลสถานะของกิจกรรม

กำหนด Callback สำหรับการอัปเดตตำแหน่ง

ผู้ให้บริการ Fused Location จะเรียกฟังก์ชัน LocationCallback.onLocationResult() Callback Method อาร์กิวเมนต์ขาเข้ามีรายการ Location ที่มีละติจูดและลองจิจูดของตำแหน่งนั้น ข้อมูลโค้ดต่อไปนี้แสดงวิธีใช้LocationCallback อินเทอร์เฟซและกำหนดเมธอด จากนั้นรับการประทับเวลาของการอัปเดตตำแหน่ง และแสดงละติจูด ลองจิจูด และการประทับเวลาในอินเทอร์เฟซผู้ใช้ของแอป

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

หยุดการอัปเดตตำแหน่ง

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

หากต้องการหยุดการอัปเดตตำแหน่ง โทร removeLocationUpdates(), กำลังส่งต่อ LocationCallback ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

ใช้บูลีน requestingLocationUpdates เพื่อติดตาม การอัปเดตตำแหน่งเปิดอยู่หรือไม่ ในเมธอด onResume() ของกิจกรรม ให้ตรวจสอบว่าขณะนี้การอัปเดตตำแหน่งทำงานอยู่หรือไม่ และเปิดใช้งานหากไม่ได้ทำงานอยู่ โดยทำดังนี้

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

บันทึกสถานะของกิจกรรม

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

ตัวอย่างโค้ดต่อไปนี้แสดงวิธีใช้การเรียกกลับของกิจกรรม onSaveInstanceState() เพื่อบันทึกสถานะอินสแตนซ์

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

กำหนดเมธอด updateValuesFromBundle() ที่จะกู้คืน ค่าที่บันทึกไว้จากกิจกรรมครั้งก่อน พร้อมใช้งาน เรียกใช้เมธอดจากเมธอด onCreate() ของกิจกรรม ดังที่แสดงในตัวอย่างโค้ดต่อไปนี้

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

โปรดดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกสถานะอินสแตนซ์ Android กิจกรรมอ้างอิงของชั้นเรียน

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

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

ดูข้อมูลเพิ่มเติมได้จากแหล่งข้อมูลต่อไปนี้

ตัวอย่าง

  • แอปตัวอย่างเพื่อแสดงให้เห็นว่าได้รับการอัปเดตตำแหน่งใน Android