Xamarin.Essentials:Geolokasi
Kelas Geolokasi menyediakan API untuk mengambil koordinat geolokasi perangkat saat ini.
Memulai
Untuk mulai menggunakan API ini, baca panduan memulai untuk Xamarin.Essentials memastikan pustaka diinstal dan disiapkan dengan benar di proyek Anda.
Untuk mengakses fungsionalitas Geolokasi , pengaturan khusus platform berikut diperlukan:
Izin Coarse dan Fine Location diperlukan dan harus dikonfigurasi dalam proyek Android. Selain itu, jika aplikasi Anda menargetkan Android 5.0 (API level 21) atau yang lebih tinggi, Anda harus menyatakan bahwa aplikasi Anda menggunakan fitur perangkat keras dalam file manifes. Ini dapat ditambahkan dengan cara berikut:
Buka file AssemblyInfo.cs di bawah folder Properti dan tambahkan:
[assembly: UsesPermission(Android.Manifest.Permission.AccessCoarseLocation)]
[assembly: UsesPermission(Android.Manifest.Permission.AccessFineLocation)]
[assembly: UsesFeature("android.hardware.location", Required = false)]
[assembly: UsesFeature("android.hardware.location.gps", Required = false)]
[assembly: UsesFeature("android.hardware.location.network", Required = false)]
Atau perbarui manifes Android:
Buka file AndroidManifest.xml di bawah folder Properti dan tambahkan yang berikut ini di dalam node manifes:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
<uses-feature android:name="android.hardware.location.network" android:required="false" />
Atau klik kanan pada proyek Android dan buka properti proyek. Di bawah Manifes Android, temukan area Izin yang diperlukan: dan periksa izin ACCESS_COARSE_LOCATION dan ACCESS_FINE_LOCATION . Ini akan secara otomatis memperbarui file AndroidManifest.xml .
Jika aplikasi Anda menargetkan Android 10 - Q (API Level 29 atau lebih tinggi) dan meminta LocationAlways, Anda juga harus menambahkan izin berikut ke AssemblyInfo.cs:
[assembly: UsesPermission(Manifest.Permission.AccessBackgroundLocation)]
Atau langsung ke AndroidManifest.xml Anda:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Disarankan untuk membaca dokumentasi Android tentang pembaruan lokasi latar belakang karena ada banyak batasan yang perlu dipertimbangkan.
API ini menggunakan izin runtime di Android. Pastikan bahwa Xamarin.Essentials sepenuhnya diinisialisasi dan penanganan izin disiapkan di aplikasi Anda.
Dalam proyek MainLauncher
Android atau apa pun Activity
yang diluncurkan Xamarin.Essentials harus diinisialisasi dalam OnCreate
metode :
protected override void OnCreate(Bundle savedInstanceState)
{
//...
base.OnCreate(savedInstanceState);
Xamarin.Essentials.Platform.Init(this, savedInstanceState); // add this line to your code, it may also be called: bundle
//...
}
Untuk menangani izin runtime di Android, Xamarin.Essentials harus menerima apa pun OnRequestPermissionsResult
. Tambahkan kode berikut ke semua Activity
kelas:
public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Android.Content.PM.Permission[] grantResults)
{
Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}
Menggunakan Geolokasi
Tambahkan referensi ke Xamarin.Essentials di kelas Anda:
using Xamarin.Essentials;
API Geolokasi juga akan meminta izin kepada pengguna jika diperlukan.
Anda bisa mendapatkan lokasi perangkat terakhir yang diketahui dengan memanggil GetLastKnownLocationAsync
metode . Ini sering lebih cepat kemudian melakukan kueri penuh, tetapi bisa kurang akurat dan dapat kembali null
jika tidak ada lokasi cache.
try
{
var location = await Geolocation.GetLastKnownLocationAsync();
if (location != null)
{
Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
}
}
catch (FeatureNotSupportedException fnsEx)
{
// Handle not supported on device exception
}
catch (FeatureNotEnabledException fneEx)
{
// Handle not enabled on device exception
}
catch (PermissionException pEx)
{
// Handle permission exception
}
catch (Exception ex)
{
// Unable to get location
}
Untuk mengkueri koordinat lokasi perangkat saat ini, GetLocationAsync
dapat digunakan. Yang terbaik adalah meneruskan secara penuh GeolocationRequest
dan CancellationToken
karena mungkin perlu waktu untuk mendapatkan lokasi perangkat.
CancellationTokenSource cts;
async Task GetCurrentLocation()
{
try
{
var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));
cts = new CancellationTokenSource();
var location = await Geolocation.GetLocationAsync(request, cts.Token);
if (location != null)
{
Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");
}
}
catch (FeatureNotSupportedException fnsEx)
{
// Handle not supported on device exception
}
catch (FeatureNotEnabledException fneEx)
{
// Handle not enabled on device exception
}
catch (PermissionException pEx)
{
// Handle permission exception
}
catch (Exception ex)
{
// Unable to get location
}
}
protected override void OnDisappearing()
{
if (cts != null && !cts.IsCancellationRequested)
cts.Cancel();
base.OnDisappearing();
}
Perhatikan bahwa semua nilai mungkin tersedia karena bagaimana setiap perangkat mengkueri geolokasi melalui penyedia yang berbeda. Misalnya, Altitude
properti mungkin null
, memiliki nilai 0, atau memiliki nilai positif, yang berada dalam meter di atas permukaan laut. Nilai lain yang mungkin tidak ada termasuk Speed
dan Course
.
Akurasi Geolokasi
Tabel berikut menguraikan akurasi per platform:
Terendah
Platform | Jarak (dalam meter) |
---|---|
Android | 500 |
iOS | 3000 |
UWP | 1000 - 5000 |
Kurang Penting
Platform | Jarak (dalam meter) |
---|---|
Android | 500 |
iOS | 1000 |
UWP | 300 - 3000 |
Sedang (Default)
Platform | Jarak (dalam meter) |
---|---|
Android | 100 - 500 |
iOS | 100 |
UWP | 30-500 |
Sangat Penting
Platform | Jarak (dalam meter) |
---|---|
Android | 0 - 100 |
iOS | 10 |
UWP | <= 10 |
Terbaik
Platform | Jarak (dalam meter) |
---|---|
Android | 0 - 100 |
iOS | ~0 |
UWP | <= 10 |
Mendeteksi Lokasi Tiruan
Beberapa perangkat dapat mengembalikan lokasi tiruan dari penyedia atau oleh aplikasi yang menyediakan lokasi tiruan. Anda dapat mendeteksi ini dengan menggunakan IsFromMockProvider
pada setiap Location
.
var request = new GeolocationRequest(GeolocationAccuracy.Medium);
var location = await Geolocation.GetLocationAsync(request);
if (location != null)
{
if(location.IsFromMockProvider)
{
// location is from a mock provider
}
}
Jarak antara Dua Lokasi
Kelas Location
dan LocationExtensions
menentukan CalculateDistance
metode yang memungkinkan Anda menghitung jarak antara dua lokasi geografis. Jarak terhitung ini tidak memperhitungkan jalan atau jalur lain, dan hanya jarak terpendek antara dua titik di sepanjang permukaan Bumi, juga dikenal sebagai jarak lingkaran besar atau kolektial, jarak "saat gagak terbang."
Berikut contohnya:
Location boston = new Location(42.358056, -71.063611);
Location sanFrancisco = new Location(37.783333, -122.416667);
double miles = Location.CalculateDistance(boston, sanFrancisco, DistanceUnits.Miles);
Location
Konstruktor memiliki argumen garis lintang dan bujur dalam urutan tersebut. Nilai garis lintang positif berada di utara khatulistiwa, dan nilai bujur positif berada di timur Prime Meridian. Gunakan argumen akhir untuk CalculateDistance
menentukan mil atau kilometer. Kelas ini UnitConverters
juga menentukan KilometersToMiles
metode dan MilesToKilometers
untuk mengonversi antara dua unit.
Perbedaan Platform
Ketinggian dihitung secara berbeda pada setiap platform.
Di Android, ketinggian, jika tersedia, dikembalikan dalam meter di atas elipsoid referensi WGS 84. Jika lokasi ini tidak memiliki ketinggian maka 0,0 dikembalikan.