Bagikan melalui


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.

API

Temukan video Xamarin lainnya di Channel 9 dan YouTube.