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

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

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

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

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

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

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

ผู้ให้บริการ Fused Location จะเรียกใช้เมธอด Callback 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());
}

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

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

ผู้ให้บริการ 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() ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกค่ากำหนดได้ที่ การบันทึก ชุดคีย์-ค่า

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

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

ตัวอย่าง