การใช้ข้อมูลตำแหน่งอย่างเหมาะสมอาจเป็นประโยชน์ต่อผู้ใช้แอปของคุณ
เช่น หากแอปช่วยผู้ใช้ค้นหาเส้นทางขณะเดินหรือ
ขับรถ หรือหากแอปติดตามตำแหน่งของชิ้นงาน แอปจะต้องรับตำแหน่งของอุปกรณ์
เป็นระยะๆ นอกจากตำแหน่งทางภูมิศาสตร์ (ละติจูดและลองจิจูด) แล้ว คุณอาจต้องการให้ข้อมูลเพิ่มเติมแก่ผู้ใช้ เช่น แบริ่ง (ทิศทางการเดินทางในแนวนอน) ระดับความสูง หรือความเร็วของอุปกรณ์ ข้อมูลนี้และข้อมูลอื่นๆ มีอยู่ในออบเจ็กต์
Location
ซึ่งแอปของคุณสามารถดึงข้อมูลจาก
Fused
Location Provider ได้ API จะอัปเดตแอปเป็นระยะๆ ด้วย
ตำแหน่งที่ดีที่สุดที่พร้อมใช้งาน โดยอิงตามผู้ให้บริการตำแหน่งที่พร้อมใช้งานในปัจจุบัน
เช่น Wi-Fi และ GPS (ระบบกำหนดตำแหน่งบนโลก) ความแม่นยำของ
ตำแหน่งจะกำหนดโดยผู้ให้บริการ
สิทธิ์เข้าถึงตำแหน่งที่คุณ
ขอ และตัวเลือกที่คุณตั้งค่าในคำขอตำแหน่ง
บทเรียนนี้จะแสดงวิธีขอข้อมูลอัปเดตเป็นประจำเกี่ยวกับตำแหน่งของอุปกรณ์โดยใช้วิธี requestLocationUpdates()
ในผู้ให้บริการตำแหน่งที่ผสานรวม
รับตำแหน่งที่รู้จักล่าสุด
ตำแหน่งที่ทราบล่าสุดของอุปกรณ์เป็นฐานที่สะดวกในการเริ่มต้น
เพื่อให้มั่นใจว่าแอปมีตำแหน่งที่ทราบก่อนที่จะเริ่ม
การอัปเดตตำแหน่งเป็นระยะ บทเรียนเกี่ยวกับการรับตำแหน่งสุดท้ายที่ทราบจะแสดงวิธีรับตำแหน่งสุดท้ายที่ทราบโดยการเรียกใช้ getLastLocation()
ข้อมูลโค้ดในส่วนต่อไปนี้ถือว่าแอปของคุณได้
ดึงตำแหน่งสุดท้ายที่ทราบและจัดเก็บเป็นออบเจ็กต์ Location
ในตัวแปรส่วนกลาง mCurrentLocation
แล้ว
ส่งคำขอตำแหน่ง
ก่อนขอการอัปเดตตำแหน่ง แอปต้องเชื่อมต่อกับบริการตำแหน่งและส่งคำขอตำแหน่ง บทเรียนเกี่ยวกับ
การเปลี่ยนการตั้งค่าตำแหน่ง
จะแสดงวิธีดำเนินการ เมื่อคำขอตำแหน่งพร้อมแล้ว คุณจะเริ่ม
การอัปเดตปกติได้โดยโทรไปที่
requestLocationUpdates()
Fused Location Provider จะเรียกใช้เมธอดเรียกกลับ LocationCallback.onLocationResult()
และส่งรายการออบเจ็กต์ Location
หรือออก PendingIntent
ที่มีตำแหน่งในข้อมูลเพิ่มเติม ทั้งนี้ขึ้นอยู่กับรูปแบบของคำขอ ความแม่นยำและความถี่ของการอัปเดตจะขึ้นอยู่กับสิทธิ์เข้าถึงตำแหน่งที่คุณขอและตัวเลือกที่คุณตั้งค่าในออบเจ็กต์คำขอตำแหน่ง
บทเรียนนี้จะแสดงวิธีรับข้อมูลอัปเดตโดยใช้
LocationCallback
แนวทางการเรียกกลับ Call
requestLocationUpdates()
,
passing it your instance of the
LocationRequest
object,
and a 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()
ดูข้อมูลเพิ่มเติมเกี่ยวกับการบันทึกค่ากำหนดได้ที่
การบันทึก
ชุดคีย์-ค่า
แหล่งข้อมูลเพิ่มเติม
ดูข้อมูลเพิ่มเติมได้จากแหล่งข้อมูลต่อไปนี้
ตัวอย่าง
- แอปตัวอย่างเพื่อสาธิตการรับข้อมูลอัปเดตตำแหน่งใน Android