The LocationManager
API pada Android tampaknya seperti itu sedikit rasa sakit untuk menggunakan untuk aplikasi yang hanya membutuhkan perkiraan sesekali dan kasar dari lokasi pengguna.
Aplikasi yang sedang saya kerjakan sebenarnya bukan aplikasi lokasi semata, tetapi perlu mendapatkan lokasi pengguna untuk menampilkan daftar bisnis terdekat. Tidak perlu khawatir tentang apakah pengguna bergerak atau semacamnya.
Inilah yang ingin saya lakukan:
- Tunjukkan pada pengguna daftar lokasi terdekat.
- Preload lokasi pengguna sehingga saat saya membutuhkannya di
Activity
X, itu akan tersedia. - Saya tidak terlalu peduli tentang akurasi atau frekuensi pembaruan. Hanya mengambil satu lokasi saja sudah cukup selama tidak jauh. Mungkin jika saya ingin menjadi mewah, saya akan memperbarui lokasi setiap beberapa menit sekali, tetapi itu bukan prioritas besar.
- Bekerja untuk perangkat apa pun asalkan memiliki GPS atau penyedia Lokasi Jaringan.
Sepertinya seharusnya tidak sesulit itu, tetapi bagi saya tampaknya saya harus memutar dua penyedia lokasi yang berbeda (GPS dan JARINGAN) dan mengelola siklus hidup masing-masing. Bukan hanya itu, tetapi saya harus menduplikasi kode yang sama dalam beberapa kegiatan untuk memenuhi # 2. Saya telah mencoba menggunakan getBestProvider()
di masa lalu untuk memotong solusi hanya dengan menggunakan satu penyedia lokasi, tetapi itu tampaknya hanya memberi Anda penyedia "teoritis" terbaik daripada penyedia yang benar-benar akan memberi Anda hasil terbaik.
Apakah ada cara yang lebih sederhana untuk mencapai ini?
Jawaban:
Inilah yang saya lakukan:
Inilah cara saya menggunakan kelas saya:
Dan inilah kelas MyLocation:
Seseorang mungkin juga ingin memodifikasi logika saya. Misalnya, jika Anda mendapatkan pembaruan dari penyedia Jaringan jangan berhenti pendengar tetapi terus menunggu. GPS memberikan data yang lebih akurat sehingga layak untuk ditunggu. Jika penghitung waktu berlalu dan Anda mendapat pembaruan dari Jaringan tetapi tidak dari GPS, maka Anda dapat menggunakan nilai yang disediakan dari Jaringan.
Satu lagi pendekatan adalah dengan menggunakan LocationClient http://developer.android.com/training/location/retrieve-current.html . Tetapi itu membutuhkan Google Play Services apk untuk diinstal pada perangkat pengguna.
sumber
Setelah mencari implementasi terbaik cara mendapatkan lokasi pengguna terbaik yang tepat, saya berhasil menggabungkan semua metode terbaik dan menghasilkan kelas berikut:
Kelas ini mencoba terhubung ke
min_gps_sat_count
satelit jika GPS diaktifkan. Lain mengembalikanLocationManager.getBestProvider()
lokasi. Periksa kodenya!sumber
import java.util.Iterator; import android.content.Context; import android.location.Criteria; import android.location.GpsSatellite; import android.location.GpsStatus; import android.location.Location; import android.location.LocationListener; import android.location.LocationManager; import android.os.Bundle; import android.os.Handler;
Dengan solusi Fedor, saya telah mengalami beberapa kali eksekusi callback
gotLocation
. Tampaknya karena kondisi balapan dalamLocationListener.onLocationChanged
metode override , ketika metode gotLocation 'cukup panjang' . Saya tidak yakin, tapi saya kiraremoveUpdates
mencegah enqueueing pesan baru di antrian Looper, tetapi itu tidak menghapus yang sudah enqueued tetapi belum dikonsumsi. Karenanya kondisi balapan.Untuk mengurangi kemungkinan perilaku yang salah ini, mungkin untuk memanggil removeUpdates sebelum menjalankan event onLocationChanged, tetapi masih kami memiliki kondisi balapan.
Solusi terbaik yang saya temukan adalah untuk menggantikan
requestLocationUpdates
denganrequestSingleUpdate
.Ini adalah versi saya, berdasarkan solusi Fedor, menggunakan Handler untuk mengirim pesan ke utas looper:
Saya menggunakan kelas ini dari utas looper yang dikustomisasi, seperti yang berikut:
di mana Koordinat adalah kelas sederhana dengan dua properti: lintang dan bujur.
sumber
Saya telah membuat aplikasi kecil dengan deskripsi langkah demi langkah untuk mendapatkan lokasi saat ini koordinat GPS.
Lengkapi contoh kode sumber di URL di bawah ini:
Lihat Cara kerjanya:
Yang perlu kita lakukan adalah menambahkan izin ini dalam file manifes
dan buat instance LocationManager seperti ini
Periksa GPS diaktifkan atau tidak
kemudian laksanakan LocationListener dan Dapatkan Koordinat
di sini adalah kode contoh yang harus dilakukan
sumber
Anda selalu bisa menggunakan LocationManager.getLastKnownLocation () tapi seperti yang dikatakan itu bisa jadi ketinggalan zaman.
Dan cara sederhana untuk mendapatkan lokasi umum bisa mendaftar untuk jaringan (biasanya cukup cepat).
dan kemudian lakukan
dalam
onLocationChanged()
metode pendengar.sumber
Saya telah menulis tutorial terperinci yang mencakup lokasi saat ini di demonuts.com . Anda dapat menemukan lebih banyak deskripsi di sini dan juga Anda dapat mengunduh seluruh kode sumber demo untuk pemahaman yang lebih baik.
Sudah ada banyak jawaban di sana, tetapi saya ingin menunjukkan cara terbaru untuk mendapatkan lokasi menggunakan Google API, sehingga pemrogram baru dapat menggunakan metode baru:
Pertama-tama, letakkan ini di file gradle
kemudian mengimplementasikan antarmuka yang diperlukan
nyatakan contoh
letakkan ini
onCreate()
Akhirnya, ganti metode yang diperlukan
Jangan lupa untuk memulai GPS di perangkat Anda sebelum menjalankan aplikasi.
sumber
Sebenarnya kita bisa menggunakan dua provider (GPS & NETWORK). Dan mereka hanya berbagi pendengar publik:
Ini diperlukan karena
OnLocationChanged()
metode selalu perlu dipanggil dalam waktu.sumber
Saya tidak yakin apakah Layanan Berbasis Lokasi dapat memperoleh lokasi dari infrastruktur lain selain GPS, tetapi menurut artikel itu, tampaknya memang mungkin:
sumber
Gunakan kode di bawah ini, itu akan memberikan penyedia terbaik yang tersedia:
sumber
Cara yang disarankan untuk melakukan ini adalah menggunakan
LocationClient
:Pertama, tentukan nilai interval pembaruan lokasi. Sesuaikan ini dengan kebutuhan Anda.
Memiliki Anda
Activity
menerapkanGooglePlayServicesClient.ConnectionCallbacks
,GooglePlayServicesClient.OnConnectionFailedListener
danLocationListener
.Kemudian, atur metode a
LocationClient
dionCreate()
AndaActivity
:Tambahkan metode yang diperlukan untuk Anda
Activity
;onConnected()
adalah metode yang disebut ketikaLocationClient
menghubungkan.onLocationChanged()
adalah tempat Anda akan mengambil lokasi yang paling baru.Pastikan untuk menghubungkan / memutuskan sambungan
LocationClient
sehingga hanya menggunakan baterai tambahan saat benar-benar diperlukan dan agar GPS tidak berjalan tanpa batas. ItuLocationClient
harus terhubung untuk mendapatkan data dari itu.Dapatkan lokasi pengguna. Pertama coba gunakan
LocationClient
; jika itu gagal, kembali keLocationManager
.sumber
Meskipun jawabannya sudah diberikan di sini. Saya hanya ingin membagikan ini kepada dunia jika menemukan skenario seperti itu.
Persyaratan saya adalah bahwa saya perlu mendapatkan lokasi pengguna saat ini dalam waktu maksimal 30 hingga 35 detik, jadi di sini adalah solusi yang saya buat berikut Jawaban Nirav Ranpara .
1. Saya membuat kelas MyLocationManager.java yang menangani semua hal-hal GPS dan Jaringan
2. Saya membuat Interface (panggilan balik) OnLocationDetectectionListener.java untuk mengkomunikasikan hasil kembali ke fragmen panggilan atau aktivitas
3. Kemudian saya membuat Kegiatan MainAppActivty.java yang mengimplementasikan
OnLocationDetectectionListener
antarmuka dan inilah cara saya menerima lokasi saya di dalamnya4. Tambahkan izin berikut ke file manifes Anda
Semoga ini bisa membantu orang lain :)
sumber
Dari lebih dari satu tahun terakhir, saya menggunakan kombinasi GPS_PROVIDER dan NETWORK_PROVIDER untuk mendapatkan lokasi saat ini dan berfungsi dengan baik, tetapi dari beberapa bulan terakhir saya mendapatkan lokasi setelah penundaan yang lama, jadi saya beralih ke API terbaru FusedLocationProviderClient dan ini bekerja cukup baik.
Ini adalah kelas yang saya tulis untuk mendapatkan lokasi saat ini dengan menggunakan FusedLocationProviderClient. Dalam kode di bawah ini, saya menggunakan timer untuk menunggu sementara untuk mendapatkan lokasi saat ini, saya dijadwalkan timer 15 detik, Anda dapat mengubahnya sesuai dengan Anda.
Dan menyebut ini dari aktivitas, inilah kodenya
Tambahkan entri berikut di AndroidManifest.xml
sumber
sumber
Ini adalah kode yang menyediakan lokasi pengguna saat ini
buat Activty Maps:
main.xml:
dan jelaskan izin berikut dalam manifes:
sumber
Ini adalah cara saya meminta Izin Pengguna.
Di luar tag aplikasi Anda di AndroidManifest.xml tambahkan permintaan izin ini.
Kemudian tambahkan dependensi Lokasi Google di file App Gradle.
Sekarang deklarasikan beberapa variabel Global.
Dalam metode OnCreate dari Aktivitas Anda (Saya tidak dapat Memformat Kode dengan Benar, Permintaan Maaf untuk itu)
Sekarang buat kedua fungsinya.
Metode Kedua
Untuk Constant.kt
sumber
Perbaikan solusi @ Fedor. Daripada meminta lokasi dengan interval waktu '0' dan jarak '0', kita dapat menggunakan metode requestSingleUpdate dari manajer lokasi . Kode yang diperbarui (versi kotlin)
Untuk mendapatkan lokasi perlu memanggil metode getLocation sebagai -
Catatan: Sebelum memanggil metode getLocation, izin lokasi yang diperlukan harus diberikan.
sumber
Untuk mendapatkan dan menunjukkan lokasi pengguna saat ini, Anda juga dapat menggunakan
MyLocationOverlay
. Misalkan Anda memilikimapView
bidang dalam aktivitas Anda. Yang perlu Anda lakukan untuk menunjukkan lokasi pengguna adalah sebagai berikut:Ini mendapatkan lokasi saat ini baik dari GPS atau jaringan. Jika keduanya gagal,
enableMyLocation()
akan kembalifalse
.Adapun lokasi hal-hal di sekitar area, sebuah
ItemizedOverlay
harus melakukan trik.Saya harap saya tidak salah mengerti pertanyaan Anda. Semoga berhasil.
sumber
EDIT: Diperbarui dengan API Layanan Lokasi terbaru dari pustaka Layanan Google Play (Juli 2014)
Saya akan merekomendasikan Anda untuk menggunakan API Layanan Lokasi baru , tersedia dari pustaka Layanan Google Play, yang menyediakan kerangka kerja tingkat tinggi yang lebih kuat yang mengotomatiskan tugas-tugas seperti pilihan penyedia lokasi dan manajemen daya. Menurut dokumentasi resmi: "... Location API memudahkan Anda untuk membangun aplikasi yang sadar lokasi, tanpa harus fokus pada detail teknologi lokasi yang mendasarinya. Mereka juga memungkinkan Anda meminimalkan konsumsi daya dengan menggunakan semua kemampuan perangkat keras perangkat. "
Untuk informasi lebih lanjut, kunjungi: Menjadikan Lokasi Aplikasi Anda Sadar
Untuk melihat contoh lengkap menggunakan API Layanan Lokasi terbaru, kunjungi: Kelas Android LocationClient sudah usang tetapi digunakan dalam dokumentasi
sumber
Cara sederhana dan terbaik untuk GeoLocation.
sumber
Agak terlambat di sini, tetapi yang akan saya lakukan dalam situasi seperti ini adalah menggunakan Google Maps API dan menandai lokasi terdekat menggunakan API lat dan long google maps. Ditambah pengalaman pengguna lebih baik jika Anda dapat menunjukkan lokasinya di peta. Tidak perlu repot dengan pembaruan lokasi pengguna atau frisking dengan api android. Biarkan google maps menangani internal untuk Anda.
@emmby mungkin telah menyelesaikannya di aplikasinya, tetapi untuk referensi di masa mendatang, lihat Google maps API untuk hal-hal khusus lokasi adalah apa yang saya rekomendasikan kepada sesama pengembang.
Sunting: Tautan untuk menampilkan lokasi pengguna di google maps
sumber
Dibutuhkan banyak hal untuk mendapatkan pembaruan lokasi di android, membutuhkan banyak kode bolierplate.
Anda harus berhati-hati
Saya telah membuat Android-EasyLocation (perpustakaan android kecil) yang akan menangani semua hal ini dan Anda dapat fokus pada logika bisnis.
Yang Anda butuhkan adalah memperpanjang EasyLocationActivity dan ini
atau
Periksa contoh aplikasi dan langkah-langkah yang diperlukan di sini di https://github.com/akhgupta/Android-EasyLocation
sumber
Inilah yang saya lakukan:
mFinalLocation
).onDestroy()
metode layanan, berhenti mendengarkan pembaruan lokasi untuk masing-masing penyedia.Di bawah ini adalah kode untuk layanan. Anda dapat menjalankannya berdasarkan frekuensi pembaruan lokasi yang Anda butuhkan.
sumber
Versi Kotlin dari @Fedor Greate menjawab:
penggunaan kelas:
MyLocation
Kelas:sumber
Di Kelas Aktivitas membuat metode yang disesuaikan:
Buat Nama Kelas UserDefined LocationGetter: -
sumber
Dengan menggunakan FusedLocationProviderApi yang merupakan API terbaru dan yang terbaik di antara kemungkinan yang tersedia untuk mendapatkan lokasi di Android. tambahkan ini dalam file build.gradle
Anda bisa mendapatkan kode sumber lengkap dengan url ini http://javapapers.com/android/android-location-fused-provider/
sumber
Baru-baru ini refactored untuk mendapatkan lokasi kode, mempelajari beberapa ide bagus, dan akhirnya mencapai perpustakaan dan Demo yang relatif sempurna.
Kode lengkap: https://github.com/bingerz/FastLocation/blob/master/fastlocationlib/src/main/java/cn/bingerz/fastlocation/FastLocation.java
* Setiap permintaan untuk menyelesaikan lokasi, yang terbaik adalah menghapus Pembaruan, jika tidak bilah status telepon akan selalu menampilkan ikon posisi.
sumber
Setelah melihat semua jawaban, dan pertanyaan ( Sederhana dan Kuat ). Saya diklik hanya tentang perpustakaan Android-ReactiveLocation .
Ketika saya membuat aplikasi pelacakan lokasi. Kemudian saya menyadari bahwa itu sangat khas untuk menangani pelacakan lokasi dengan dioptimalkan dengan baterai.
Jadi saya ingin memberi tahu freshers dan juga pengembang yang tidak ingin mempertahankan kode lokasi mereka dengan optimisasi di masa depan. Gunakan perpustakaan ini.
Ketergantungan untuk dimasukkan ke dalam build.gradle tingkat aplikasi
Pro untuk menggunakan lib ini:
sumber