Saya ingin membangun aplikasi yang berpusat pada mendapatkan lokasi pengguna saat ini dan kemudian menemukan tempat menarik (seperti bar, restoran, dll) yang dekat dengannya melalui Google Places API .
Setelah mencari tempat untuk memulai di web, saya menemukan beberapa tutorial yang menggunakan LocationManager
kelas dan beberapa lainnya yang menggunakan Layanan Google Play untuk menemukan lokasi pengguna.
Pada pandangan pertama mereka berdua melakukan hal yang sama, tetapi karena saya baru dalam hal ini, saya jadi sedikit bingung dan saya tidak tahu metode mana yang paling sesuai dengan kebutuhan saya. Jadi, saya ingin bertanya:
Apa perbedaan antara kedua metode ini untuk menemukan lokasi (jika ada)?
android
gps
geolocation
SoCo
sumber
sumber
Jawaban:
Lokasi Pengguna di Android
Mendapatkan lokasi pengguna di Android sedikit lebih mudah daripada di iOS. Untuk memulai kebingungan, ada dua cara yang sangat berbeda untuk melakukannya. Yang pertama menggunakan Android API dari
android.location.LocationListener
, dan yang kedua menggunakan Google Play Services APIscom.google.android.gms.location.LocationListener
. Mari kita pergi melalui keduanya.API Lokasi Android
API lokasi Android menggunakan tiga penyedia berbeda untuk mendapatkan lokasi -
LocationManager.GPS_PROVIDER
- Penyedia ini menentukan lokasi menggunakan satelit. Tergantung pada kondisinya, penyedia ini mungkin perlu waktu untuk mengembalikan perbaikan lokasi.LocationManager.NETWORK_PROVIDER
- Penyedia ini menentukan lokasi berdasarkan ketersediaan menara seluler dan titik akses WiFi. Hasil diambil melalui pencarian jaringan.LocationManager.PASSIVE_PROVIDER
- Penyedia ini akan mengembalikan lokasi yang dihasilkan oleh penyedia lain. Anda secara pasif menerima pembaruan lokasi ketika aplikasi atau layanan lain memintanya tanpa benar-benar meminta lokasi itu sendiri.Intinya adalah Anda mendapatkan objek dari
LocationManager
sistem, mengimplementasikanLocationListener
, dan memanggilrequestLocationUpdates
onLocationManager
.Berikut cuplikan kode:
Panduan API Google tentang Strategi Lokasimenjelaskan kode dengan cukup baik. Tetapi mereka juga menyebutkan bahwa dalam kebanyakan kasus, Anda akan mendapatkan kinerja baterai yang lebih baik, serta akurasi yang lebih tepat, dengan menggunakan API Layanan Lokasi Google sebagai gantinya. Sekarang kebingungan dimulai!API Layanan Lokasi Google adalah bagian dari APK Layanan Google Play ( inilah cara mengaturnya ). Mereka dibangun di atas API Android. API ini menyediakan "Penyedia Lokasi Yang Menyatu" alih-alih penyedia yang disebutkan di atas. Penyedia ini secara otomatis memilih penyedia yang mendasarinya untuk digunakan, berdasarkan keakuratan, penggunaan baterai, dll. Cepat karena Anda mendapatkan lokasi dari layanan seluruh sistem yang terus memperbaruinya. Dan Anda dapat menggunakan fitur yang lebih canggih seperti geofencing.
Untuk menggunakan Layanan Lokasi Google, aplikasi Anda perlu terhubung ke
GooglePlayServicesClient
. Untuk terhubung ke klien, aktivitas Anda (atau fragmen, atau lebih) perlu diimplementasikanGooglePlayServicesClient.ConnectionCallbacks
danGooglePlayServicesClient.OnConnectionFailedListener
antarmuka. Berikut ini contoh kode:locationClient.getLastLocation()
null?The
locationClient.getLastLocation()
mendapat lokasi terakhir yang diketahui dari klien. Namun, Penyedia Lokasi Fusi hanya akan mempertahankan lokasi latar belakang jika setidaknya satu klien terhubung dengannya. Setelah klien pertama terhubung, ia akan segera mencoba untuk mendapatkan lokasi. Jika aktivitas Anda adalah klien pertama untuk menghubungkan dan Anda menelepongetLastLocation()
langsung dionConnected()
, yang mungkin tidak cukup waktu untuk lokasi pertama yang masuk. Hal ini akan mengakibatkanlocation
menjadinull
.Untuk mengatasi masalah ini, Anda harus menunggu (tidak pasti) sampai penyedia mendapatkan lokasi dan kemudian menelepon
getLastLocation()
, yang tidak mungkin diketahui. Opsi lain (lebih baik) adalah mengimplementasikancom.google.android.gms.location.LocationListener
antarmuka untuk menerima pembaruan lokasi berkala (dan matikan begitu Anda mendapatkan pembaruan pertama).Dalam kode ini, Anda memeriksa apakah klien sudah memiliki lokasi terakhir (dalam
onConnected
). Jika tidak, Anda meminta pembaruan lokasi, dan mematikan permintaan (dalamonLocationChanged()
panggilan balik) segera setelah Anda mendapatkan pembaruan.Perhatikan bahwa
locationClient.requestLocationUpdates(locationRequest, this);
harus ada di dalamonConnected
callback, atau Anda akan mendapatkanIllegalStateException
karena Anda akan mencoba untuk meminta lokasi tanpa terhubung ke Klien Layanan Google Play.Sering kali, pengguna akan menonaktifkan layanan lokasi (untuk menghemat baterai, atau alasan privasi). Dalam kasus seperti itu, kode di atas masih akan meminta pembaruan lokasi, tetapi
onLocationChanged
tidak akan pernah dipanggil. Anda dapat menghentikan permintaan dengan memeriksa apakah pengguna telah menonaktifkan layanan lokasi.Jika aplikasi Anda mengharuskan mereka untuk mengaktifkan layanan lokasi, Anda ingin menampilkan pesan atau bersulang. Sayangnya, tidak ada cara untuk memeriksa apakah pengguna telah menonaktifkan layanan lokasi di API Layanan Lokasi Google. Untuk ini, Anda harus kembali ke API Android.
Dalam
onCreate
metode Anda :Dan gunakan
locationEnabled
bendera dalamonConnected
metode Anda seperti ini:MEMPERBARUI
Dokumen diperbarui, LocationClient dihapus dan api mendukung untuk mengaktifkan GPS dengan satu klik dari dialog:
Tautan https://developer.android.com/training/location/change-location-settings#prompt
Klien lokasi baru: FusedLocationProviderClient
Dianjurkan untuk pergi melalui https://developer.android.com/training/location sebelum melakukan tugas-tugas lokasi.
sumber
SettingsApi.checkLocationSettings()
untuk memeriksa apakah pengguna telah mengaktifkan Layanan Lokasi (lihat di sini: developers.google.com/android/reference/com/google/android/gms/… ).LocationManager
! Apakah api lokasi berfusi bekerja pada perangkat yang tidak memiliki layanan google play?fun isLocationEnabled(context: Context): Boolean { val locationMode: Int try { locationMode = Settings.Secure.getInt( context.contentResolver, Settings.Secure.LOCATION_MODE ) } catch (e: SettingNotFoundException) { e.printStackTrace() return false } return locationMode != Settings.Secure.LOCATION_MODE_OFF }
Dalam pengalaman saya, "akurasi lebih tepat" tidak berarti lebih baik dengan cara apa pun. Kecuali saya kehilangan sesuatu, jika Anda ingin memastikan GPS digunakan, LocationManager adalah satu-satunya cara untuk pergi. Kami melacak kendaraan dengan aplikasi kami dan, sekali lagi, kecuali saya kehilangan sesuatu, Layanan Google Play menyediakan beberapa lokasi yang sangat tidak akurat.
sumber
Anda harus menggunakan api lokasi Layanan Google Play alih-alih LocationManager. Menurut dokumen:
Mengenai alasan beralih, Google mengatakan ini:
sumber
Saya telah menggunakan API Layanan Lokasi Google cukup lama. Itu memang memiliki keuntungan, karena merangkum kompleksitas memiliki beberapa sumber untuk menentukan posisi. Namun itu merangkum terlalu banyak , sehingga ketika Anda mendapatkan posisi aneh, Anda tidak memiliki cara untuk menentukan dari mana posisi aneh itu berasal.
Dalam kehidupan nyata, saya memiliki beberapa nilai aneh yang muncul, karena berjarak 10 km dari posisi sebenarnya. Satu-satunya penjelasan adalah bahwa lokasi gila ini berasal dari kesalahan dalam Googles Wi-Fi atau database NWK - kesalahan yang akan selalu ada, karena topologi Wi-Fi dan Jaringan berubah setiap hari. Namun sayangnya (dan yang mengejutkan) API tidak memberi Anda informasi tentang bagaimana posisi individu diturunkan.
Ini membuat Anda memiliki masalah karena harus menyaring nilai-nilai aneh berdasarkan pemeriksaan masuk akal pada kecepatan, akselerasi, bearing, dll.
... atau kembali ke kerangka API lama yang baik dan gunakan GPS saja, itulah yang saya putuskan untuk lakukan sampai Google meningkatkan API yang menyatu.
sumber
API Layanan Lokasi Google , bagian dari Layanan Google Play, menyediakan kerangka kerja tingkat tinggi yang lebih kuat yang secara otomatis menangani penyedia lokasi , pergerakan pengguna , dan akurasi lokasi . Ini juga menangani penjadwalan pembaruan lokasi berdasarkan parameter konsumsi daya yang Anda berikan. Dalam kebanyakan kasus, Anda akan mendapatkan kinerja baterai yang lebih baik , serta akurasi yang lebih tepat, dengan menggunakan API Layanan Lokasi.
Perbedaan yang lebih mendetail antara kedua apis Google Play Service Location API dan Android Framework Location API dapat ditemukan di sini
sumber
Ya, API Layanan Lokasi Layanan Google Play dapat memberikan informasi Lokasi yang sangat menyesatkan. Modem WiFi dapat dipindahkan, modem WiFi diperbarui dengan informasi lokasi yang salah (yaitu jika lokasi dipalsukan oleh perangkat Android yang memperbarui lokasi modem WiFi) dan ada sejumlah keadaan lain yang dapat mengakibatkan data Lokasi salah dari triangulasi modem WiFi. Di semua aplikasi kami di mana Lokasi akurat wajib, kami hanya menggunakan GPS.
sumber
Perbedaan antara kedua apis Google Play Service Location API dan Android Framework Location API berdasarkan pada layanan GPS
FusedLocationProviderClient
requestLocationUpdates()
metode untuk mengambil lokasi.locationRequest.setInterval(milliseconds)
dansetFastestInterval(milliseconds)
, bukan berdasarkan perubahan lokasi penggunaLocationManager Api
Lokasi pengambilan berdasarkan perubahan lokasi pengguna dan interval waktu
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, milliseconds, mindistance, Mylocationlistener)
Nilai LatLng yang dikembalikan telah mengandung 14 nilai desimal (mis: 11.94574594963342 79.81166719458997) nilai lokasi yang akurat
sumber