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

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

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

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

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

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

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

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

บทเรียนนี้จะแสดงวิธีรับข้อมูลอัปเดตโดยใช้ LocationCallback แนวทาง Callback เรียกใช้ 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());
}

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

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

ผู้ให้บริการ Fused Location จะเรียกใช้เมธอด Callback LocationCallback.onLocationResult() อาร์กิวเมนต์ขาเข้ามีรายการ 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 Activity

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

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

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

ตัวอย่าง