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

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

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

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

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

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

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

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

กำหนด 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() Callback เพื่อบันทึกสถานะอินสแตนซ์:

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