Layanan lokasi di Android
Panduan ini memperkenalkan kesadaran lokasi di aplikasi Android dan menggambarkan cara mendapatkan lokasi pengguna menggunakan ANDROID Location Service API, serta penyedia lokasi yang menyatu yang tersedia dengan GOOGLE Location Services API.
Android menyediakan akses ke berbagai teknologi lokasi seperti lokasi menara sel, Wi-Fi, dan GPS. Detail setiap teknologi lokasi diabstraksi melalui penyedia lokasi, memungkinkan aplikasi untuk mendapatkan lokasi dengan cara yang sama terlepas dari penyedia yang digunakan. Panduan ini memperkenalkan penyedia lokasi yang menyatu, bagian dari Layanan Google Play, yang secara cerdas menentukan cara terbaik untuk mendapatkan lokasi perangkat berdasarkan penyedia apa yang tersedia dan bagaimana perangkat digunakan. Android Location Service API dan menunjukkan cara berkomunikasi dengan layanan lokasi sistem menggunakan LocationManager
. Bagian kedua dari panduan ini menjelajahi ANDROID Location Services API menggunakan LocationManager
.
Sebagai aturan umum praktis, aplikasi harus lebih suka menggunakan penyedia lokasi yang menyatu, mengembalikan API Layanan Lokasi Android yang lebih lama hanya jika perlu.
Dasar-dasar lokasi
Di Android, apa pun API yang Anda pilih untuk bekerja dengan data lokasi, beberapa konsep tetap sama. Bagian ini memperkenalkan Penyedia Lokasi dan izin terkait lokasi.
Penyedia lokasi
Beberapa teknologi digunakan secara internal untuk menentukan lokasi pengguna. Perangkat keras yang digunakan tergantung pada jenis penyedia lokasi yang dipilih untuk pekerjaan mengumpulkan data. Android menggunakan tiga penyedia lokasi:
Penyedia GPS – GPS memberikan lokasi yang paling akurat, menggunakan daya terbanyak, dan berfungsi paling baik di luar ruangan. Penyedia ini menggunakan kombinasi GPS dan GPS terbantu (aGPS), yang mengembalikan data GPS yang dikumpulkan oleh menara seluler.
Penyedia Jaringan – Menyediakan kombinasi data WiFi dan Seluler, termasuk data aGPS yang dikumpulkan oleh menara sel. Ini menggunakan lebih sedikit daya daripada Penyedia GPS, tetapi mengembalikan data lokasi dengan akurasi yang bervariasi.
Penyedia Pasif – Opsi "piggyback" menggunakan penyedia yang diminta oleh aplikasi atau Layanan lain untuk menghasilkan data lokasi dalam aplikasi. Ini adalah opsi yang kurang andal tetapi hemat daya ideal untuk aplikasi yang tidak memerlukan pembaruan lokasi konstan untuk bekerja.
Penyedia lokasi tidak selalu tersedia. Misalnya, kita mungkin ingin menggunakan GPS untuk aplikasi kita, tetapi GPS mungkin dimatikan di Pengaturan, atau perangkat mungkin tidak memiliki GPS sama sekali. Jika penyedia tertentu tidak tersedia, memilih penyedia tersebut mungkin mengembalikan null
.
Izin lokasi
Aplikasi yang sadar lokasi memerlukan akses sensor perangkat keras untuk menerima GPS, Wi-Fi, dan data seluler. Akses dikontrol melalui izin yang sesuai dalam Manifes Android aplikasi. Ada dua izin yang tersedia - tergantung pada persyaratan aplikasi Anda dan pilihan API Anda, Anda ingin mengizinkannya:
ACCESS_FINE_LOCATION
– Memungkinkan akses aplikasi ke GPS. Diperlukan untuk opsi Penyedia GPS dan Penyedia Pasif (Penyedia Pasif memerlukan izin untuk mengakses data GPS yang dikumpulkan oleh aplikasi atau Layanan lain). Izin opsional untuk Penyedia Jaringan.ACCESS_COARSE_LOCATION
– Memungkinkan akses aplikasi ke lokasi Seluler dan Wi-Fi. Diperlukan untuk Penyedia Jaringan jikaACCESS_FINE_LOCATION
tidak diatur.
Untuk aplikasi yang menargetkan API versi 21 (Android 5.0 Lollipop) atau yang lebih tinggi, Anda dapat mengaktifkan ACCESS_FINE_LOCATION
dan masih berjalan di perangkat yang tidak memiliki perangkat keras GPS. Jika aplikasi Anda memerlukan perangkat keras GPS, Anda harus secara eksplisit menambahkan android.hardware.location.gps
uses-feature
elemen ke Manifes Android. Untuk informasi selengkapnya, lihat referensi elemen fitur penggunaan Android.
Untuk mengatur izin, perluas folder Properti di Pad Solusi dan klik dua kali AndroidManifest.xml. Izin akan dicantumkan di bawah Izin yang Diperlukan:
Mengatur salah satu izin ini memberi tahu Android bahwa aplikasi Anda memerlukan izin dari pengguna untuk mengakses ke penyedia lokasi. Perangkat yang menjalankan API level 22 (Android 5.1) atau yang lebih rendah akan meminta pengguna untuk memberikan izin ini setiap kali aplikasi diinstal. Pada perangkat yang menjalankan API level 23 (Android 6.0) atau yang lebih tinggi, aplikasi harus melakukan pemeriksaan izin run-time sebelum membuat permintaan penyedia lokasi.
Catatan
Catatan: Pengaturan ACCESS_FINE_LOCATION
menyiratkan akses ke data lokasi kasar dan halus. Anda seharusnya tidak perlu mengatur kedua izin, hanya izin minimal yang diperlukan aplikasi Anda untuk bekerja.
Cuplikan ini adalah contoh cara memeriksa apakah aplikasi memiliki izin untuk ACCESS_FINE_LOCATION
izin:
if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Permission.Granted)
{
StartRequestingLocationUpdates();
isRequestingLocationUpdates = true;
}
else
{
// The app does not have permission ACCESS_FINE_LOCATION
}
Aplikasi harus toleran terhadap skenario di mana pengguna tidak akan memberikan izin (atau telah mencabut izin) dan memiliki cara untuk menangani situasi tersebut dengan baik. Silakan lihat Panduan izin untuk detail selengkapnya tentang menerapkan pemeriksaan izin run-time di Xamarin.Android.
Menggunakan penyedia lokasi yang menyatu
Penyedia lokasi yang menyatu adalah cara yang disukai bagi aplikasi Android untuk menerima pembaruan lokasi dari perangkat karena akan secara efisien memilih penyedia lokasi selama run time untuk memberikan informasi lokasi terbaik dengan cara yang hemat baterai. Misalnya, pengguna yang berjalan-jalan di luar ruangan mendapatkan pembacaan lokasi terbaik dengan GPS. Jika pengguna kemudian berjalan di dalam ruangan, di mana GPS bekerja dengan buruk (jika sama sekali), penyedia lokasi yang menyatu dapat secara otomatis beralih ke WiFi, yang bekerja lebih baik di dalam ruangan.
API penyedia lokasi yang menyatu menyediakan berbagai alat lain untuk memberdayakan aplikasi yang sadar lokasi, termasuk geofencing dan pemantauan aktivitas. Di bagian ini, kita akan fokus pada dasar-dasar menyiapkan LocationClient
, membangun penyedia, dan mendapatkan lokasi pengguna.
Penyedia lokasi yang menyatu adalah bagian dari Layanan Google Play. Paket Layanan Google Play harus diinstal dan dikonfigurasi dengan benar dalam aplikasi agar API penyedia lokasi yang menyatu berfungsi, dan perangkat harus menginstal APK Layanan Google Play.
Sebelum aplikasi Xamarin.Android dapat menggunakan penyedia lokasi yang menyatu, aplikasi harus menambahkan paket Xamarin.GooglePlayServices.Location ke proyek. Selain itu, pernyataan berikut using
harus ditambahkan ke file sumber apa pun yang mereferensikan kelas yang dijelaskan di bawah ini:
using Android.Gms.Common;
using Android.Gms.Location;
Memeriksa apakah Layanan Google Play diinstal
Xamarin.Android akan mengalami crash jika mencoba menggunakan penyedia lokasi yang menyatu saat Layanan Google Play tidak diinstal (atau kedaluarsa) maka pengecualian runtime akan terjadi. Jika Layanan Google Play tidak diinstal, aplikasi harus kembali ke Layanan Lokasi Android yang dibahas di atas. Jika Google Play Services sudah kedaluarsa, aplikasi dapat menampilkan pesan kepada pengguna yang meminta mereka untuk memperbarui versi Google Play Services yang diinstal.
Cuplikan ini adalah contoh bagaimana Aktivitas Android dapat secara terprogram memeriksa apakah Google Play Services diinstal:
bool IsGooglePlayServicesInstalled()
{
var queryResult = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);
if (queryResult == ConnectionResult.Success)
{
Log.Info("MainActivity", "Google Play Services is installed on this device.");
return true;
}
if (GoogleApiAvailability.Instance.IsUserResolvableError(queryResult))
{
// Check if there is a way the user can resolve the issue
var errorString = GoogleApiAvailability.Instance.GetErrorString(queryResult);
Log.Error("MainActivity", "There is a problem with Google Play Services on this device: {0} - {1}",
queryResult, errorString);
// Alternately, display the error to the user.
}
return false;
}
FusedLocationProviderClient
Untuk berinteraksi dengan penyedia lokasi yang menyatu, aplikasi Xamarin.Android harus memiliki instans FusedLocationProviderClient
. Kelas ini mengekspos metode yang diperlukan untuk berlangganan pembaruan lokasi dan untuk mengambil lokasi perangkat terakhir yang diketahui.
Metode OnCreate
Aktivitas adalah tempat yang cocok untuk mendapatkan referensi ke FusedLocationProviderClient
, seperti yang ditunjukkan dalam cuplikan kode berikut:
public class MainActivity: AppCompatActivity
{
FusedLocationProviderClient fusedLocationProviderClient;
protected override void OnCreate(Bundle bundle)
{
fusedLocationProviderClient = LocationServices.GetFusedLocationProviderClient(this);
}
}
Mendapatkan lokasi terakhir yang diketahui
Metode ini FusedLocationProviderClient.GetLastLocationAsync()
menyediakan cara sederhana dan non-pemblokiran bagi aplikasi Xamarin.Android untuk dengan cepat mendapatkan lokasi perangkat terakhir yang diketahui dengan overhead pengodean minimal.
Cuplikan ini menunjukkan cara menggunakan GetLastLocationAsync
metode untuk mengambil lokasi perangkat:
async Task GetLastLocationFromDevice()
{
// This method assumes that the necessary run-time permission checks have succeeded.
getLastLocationButton.SetText(Resource.String.getting_last_location);
Android.Locations.Location location = await fusedLocationProviderClient.GetLastLocationAsync();
if (location == null)
{
// Seldom happens, but should code that handles this scenario
}
else
{
// Do something with the location
Log.Debug("Sample", "The latitude is " + location.Latitude);
}
}
Berlangganan pembaruan lokasi
Aplikasi Xamarin.Android juga dapat berlangganan pembaruan lokasi dari penyedia lokasi yang menyatu menggunakan metode , seperti yang FusedLocationProviderClient.RequestLocationUpdatesAsync
ditunjukkan dalam cuplikan kode ini:
await fusedLocationProviderClient.RequestLocationUpdatesAsync(locationRequest, locationCallback);
Metode ini mengambil dua parameter:
Android.Gms.Location.LocationRequest
– ObjekLocationRequest
adalah bagaimana aplikasi Xamarin.Android meneruskan parameter tentang cara kerja penyedia lokasi yang menyatu. InformasiLocationRequest
penahanan seperti seberapa sering permintaan harus dibuat atau seberapa penting pembaruan lokasi yang akurat. Misalnya, permintaan lokasi penting akan menyebabkan perangkat menggunakan GPS, dan akibatnya lebih banyak daya, saat menentukan lokasi. Cuplikan kode ini menunjukkan cara membuatLocationRequest
untuk lokasi dengan akurasi tinggi, memeriksa sekitar setiap lima menit untuk pembaruan lokasi (tetapi tidak lebih cepat dari dua menit di antara permintaan). Penyedia lokasi yang menyatu akan menggunakanLocationRequest
sebagai panduan untuk digunakan penyedia lokasi mana saat mencoba menentukan lokasi perangkat:LocationRequest locationRequest = new LocationRequest() .SetPriority(LocationRequest.PriorityHighAccuracy) .SetInterval(60 * 1000 * 5) .SetFastestInterval(60 * 1000 * 2);
Android.Gms.Location.LocationCallback
– Untuk menerima pembaruan lokasi, aplikasi Xamarin.Android harus subkelasLocationProvider
kelas abstrak. Kelas ini mengekspos dua metode yang mungkin dipanggil oleh penyedia lokasi yang menyatu untuk memperbarui aplikasi dengan informasi lokasi. Ini akan dibahas secara lebih rinci di bawah ini.
Untuk memberi tahu aplikasi Xamarin.Android tentang pembaruan lokasi, penyedia lokasi yang menyatu akan memanggil LocationCallBack.OnLocationResult(LocationResult result)
. Parameter Android.Gms.Location.LocationResult
akan berisi informasi lokasi pembaruan.
Ketika penyedia lokasi yang menyatu mendeteksi perubahan ketersediaan data lokasi, penyedia lokasi akan memanggil metode .LocationProvider.OnLocationAvailability(LocationAvailability locationAvailability)
LocationAvailability.IsLocationAvailable
Jika properti mengembalikan , maka dapat diasumsikan true
bahwa hasil lokasi perangkat yang dilaporkan oleh OnLocationResult
seakurat dan terbaru seperti yang diperlukan oleh LocationRequest
. Jika IsLocationAvailable
false, maka tidak ada hasil lokasi yang akan dikembalikan oleh OnLocationResult
.
Cuplikan kode ini adalah implementasi LocationCallback
sampel objek:
public class FusedLocationProviderCallback : LocationCallback
{
readonly MainActivity activity;
public FusedLocationProviderCallback(MainActivity activity)
{
this.activity = activity;
}
public override void OnLocationAvailability(LocationAvailability locationAvailability)
{
Log.Debug("FusedLocationProviderSample", "IsLocationAvailable: {0}",locationAvailability.IsLocationAvailable);
}
public override void OnLocationResult(LocationResult result)
{
if (result.Locations.Any())
{
var location = result.Locations.First();
Log.Debug("Sample", "The latitude is :" + location.Latitude);
}
else
{
// No locations to work with.
}
}
}
Menggunakan API Layanan Lokasi Android
Layanan Lokasi Android adalah API yang lebih lama untuk menggunakan informasi lokasi di Android. Data lokasi dikumpulkan oleh sensor perangkat keras dan dikumpulkan oleh layanan sistem, yang diakses dalam aplikasi dengan LocationManager
kelas dan ILocationListener
.
Layanan Lokasi paling cocok untuk aplikasi yang harus berjalan pada perangkat yang tidak menginstal Layanan Google Play.
Layanan Lokasi adalah jenis layanan khusus yang dikelola oleh Sistem. Layanan Sistem berinteraksi dengan perangkat keras perangkat dan selalu berjalan. Untuk memanfaatkan pembaruan lokasi di aplikasi kami, kami akan berlangganan pembaruan lokasi dari Layanan Lokasi sistem menggunakan LocationManager
dan RequestLocationUpdates
panggilan.
Untuk mendapatkan lokasi pengguna menggunakan Layanan Lokasi Android melibatkan beberapa langkah:
- Dapatkan referensi ke
LocationManager
layanan. - Terapkan
ILocationListener
antarmuka dan tangani peristiwa saat lokasi berubah. LocationManager
Gunakan untuk meminta pembaruan lokasi untuk penyedia tertentu. DariILocationListener
langkah sebelumnya akan digunakan untuk menerima panggilan balik dariLocationManager
.- Hentikan pembaruan lokasi ketika aplikasi tidak lagi sesuai untuk menerima pembaruan.
Manajer Lokasi
Kita dapat mengakses layanan lokasi sistem dengan instans LocationManager
kelas. LocationManager
adalah kelas khusus yang memungkinkan kita berinteraksi dengan layanan lokasi sistem dan memanggil metode di atasnya. Aplikasi bisa mendapatkan referensi ke dengan memanggil GetSystemService
dan meneruskan jenis Layanan, seperti yang LocationManager
ditunjukkan di bawah ini:
LocationManager locationManager = (LocationManager) GetSystemService(Context.LocationService);
OnCreate
adalah tempat yang baik untuk mendapatkan referensi ke LocationManager
.
Ada baiknya untuk menyimpan LocationManager
sebagai variabel kelas, sehingga kita dapat memanggilnya di berbagai titik dalam siklus hidup Aktivitas.
Meminta pembaruan lokasi dari LocationManager
Setelah aplikasi memiliki referensi ke LocationManager
, aplikasi perlu memberi tahu LocationManager
jenis informasi lokasi apa yang diperlukan, dan seberapa sering informasi tersebut akan diperbarui. Lakukan ini dengan memanggil RequestLocationUpdates
LocationManager
objek, dan meneruskan beberapa kriteria untuk pembaruan dan panggilan balik yang akan menerima pembaruan lokasi. Panggilan balik ini adalah jenis yang harus mengimplementasikan ILocationListener
antarmuka (dijelaskan secara lebih rinci nanti dalam panduan ini).
Metode ini RequestLocationUpdates
memberi tahu Layanan lokasi sistem bahwa aplikasi Anda ingin mulai menerima pembaruan lokasi. Metode ini memungkinkan Anda menentukan penyedia, serta ambang waktu dan jarak untuk mengontrol frekuensi pembaruan. Misalnya, metode di bawah ini meminta pembaruan lokasi dari penyedia lokasi GPS setiap 2000 milidetik, dan hanya ketika lokasi berubah lebih dari 1 meter:
// For this example, this method is part of a class that implements ILocationListener, described below
locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 2000, 1, this);
Aplikasi harus meminta pembaruan lokasi hanya sesering yang diperlukan agar aplikasi berkinerja baik. Ini mempertahankan masa pakai baterai dan menciptakan pengalaman yang lebih baik bagi pengguna.
Menanggapi pembaruan dari LocationManager
Setelah aplikasi meminta pembaruan dari LocationManager
, aplikasi dapat menerima informasi dari Layanan dengan menerapkan ILocationListener
antarmuka. Antarmuka ini menyediakan empat metode untuk mendengarkan Layanan lokasi dan penyedia lokasi, OnLocationChanged
. Sistem akan memanggil OnLocationChanged
ketika lokasi pengguna cukup berubah untuk memenuhi syarat sebagai perubahan lokasi sesuai dengan Kriteria yang ditetapkan saat meminta pembaruan lokasi.
Kode berikut menunjukkan metode dalam ILocationListener
antarmuka:
public class MainActivity : AppCompatActivity, ILocationListener
{
TextView latitude;
TextView longitude;
public void OnLocationChanged (Location location)
{
// called when the location has been updated.
}
public OnProviderDisabled(string locationProvider)
{
// called when the user disables the provider
}
public OnProviderEnabled(string locationProvider)
{
// called when the user enables the provider
}
public OnStatusChanged(string locationProvider, Availability status, Bundle extras)
{
// called when the status of the provider changes (there are a variety of reasons for this)
}
}
Berhenti berlangganan pembaruan LocationManager
Untuk menghemat sumber daya sistem, aplikasi harus berhenti berlangganan pembaruan lokasi sesegera mungkin. Metode ini RemoveUpdates
memberi tahu LocationManager
untuk berhenti mengirim pembaruan ke aplikasi kami. Sebagai contoh, Aktivitas dapat memanggil RemoveUpdates
dalam OnPause
metode sehingga kami dapat menghemat daya jika aplikasi tidak memerlukan pembaruan lokasi saat Aktivitasnya tidak ada di layar:
protected override void OnPause ()
{
base.OnPause ();
locationManager.RemoveUpdates (this);
}
Jika aplikasi Anda perlu mendapatkan pembaruan lokasi saat berada di latar belakang, Anda harus membuat Layanan kustom yang berlangganan sistem Layanan Lokasi. Lihat panduan Latar Belakang dengan Layanan Android untuk informasi selengkapnya.
Menentukan penyedia lokasi terbaik untuk LocationManager
Aplikasi di atas menetapkan GPS sebagai penyedia lokasi. Namun, GPS mungkin tidak tersedia dalam semua kasus, seperti jika perangkat berada di dalam ruangan atau tidak memiliki penerima GPS. Jika demikian, hasilnya adalah pengembalian null
untuk Penyedia.
Untuk membuat aplikasi Anda berfungsi saat GPS tidak tersedia, Anda menggunakan GetBestProvider
metode untuk meminta penyedia lokasi terbaik yang tersedia (didukung perangkat dan diaktifkan pengguna) saat peluncuran aplikasi. Alih-alih meneruskan penyedia tertentu, Anda dapat memberi tahu GetBestProvider
persyaratan untuk penyedia - seperti akurasi dan daya - dengan Criteria
objek. GetBestProvider
mengembalikan penyedia terbaik untuk Kriteria yang diberikan.
Kode berikut menunjukkan cara mendapatkan penyedia terbaik yang tersedia dan menggunakannya saat meminta pembaruan lokasi:
Criteria locationCriteria = new Criteria();
locationCriteria.Accuracy = Accuracy.Coarse;
locationCriteria.PowerRequirement = Power.Medium;
locationProvider = locationManager.GetBestProvider(locationCriteria, true);
if(locationProvider != null)
{
locationManager.RequestLocationUpdates (locationProvider, 2000, 1, this);
}
else
{
Log.Info(tag, "No location providers available");
}
Catatan
Jika pengguna telah menonaktifkan semua penyedia lokasi, GetBestProvider
akan mengembalikan null
. Untuk melihat cara kerja kode ini pada perangkat nyata, pastikan untuk mengaktifkan GPS, Wi-Fi, dan jaringan seluler di bawah Mode Lokasi > google Pengaturan > seperti yang ditunjukkan pada cuplikan layar ini:
Cuplikan layar di bawah ini menunjukkan aplikasi lokasi yang berjalan menggunakan GetBestProvider
:
Perlu diingat bahwa GetBestProvider
tidak mengubah penyedia secara dinamis. Sebaliknya, ini menentukan penyedia terbaik yang tersedia sekali selama siklus hidup Aktivitas. Jika status penyedia berubah setelah ditetapkan, aplikasi akan memerlukan kode tambahan dalam ILocationListener
metode - OnProviderEnabled
, OnProviderDisabled
, dan OnStatusChanged
- untuk menangani setiap kemungkinan yang terkait dengan pengalihan penyedia.
Ringkasan
Panduan ini mencakup mendapatkan lokasi pengguna menggunakan Layanan Lokasi Android dan penyedia lokasi yang menyatu dari Google Location Services API.