Xamarin.Essentials: Coğrafi konum

Geolocation sınıfı, cihazın geçerli coğrafi konum koordinatlarını almak için API'ler sağlar.

başlarken

Bu API'yi kullanmaya başlamak için kitaplığın projelerinize düzgün bir şekilde yük olduğundan ve ayar olduğundan emin olmak için başlangıç kılavuzunu okuyun.

Coğrafi Konum işlevine erişmek için aşağıdaki platforma özgü kurulum gereklidir:

Kaba ve İnce Konum izinleri gereklidir ve Android projesinde yapılandırılması gerekir. Ayrıca, uygulamanız Android 5.0 (API düzeyi 21) veya daha yüksek bir sürümü hedeflerse, uygulamanın bildirim dosyasındaki donanım özelliklerini kullandığını bildirebilirsiniz. Bu, aşağıdaki yollarla eklenebilir:

Properties klasörünün altındaki AssemblyInfo.csdosyasını açın ve şunları ekleyin:

[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)]

Veya Android bildirimini güncelleştirin:

Özellikler AndroidManifest.xmldosyanın altındaki dosyanın adını açın ve bildirim düğümünün içine aşağıdakini ekleyin:

<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" />

Veya Android projesine sağ tıklayın ve projenin özelliklerini açın. Android Bildirimi'nin altında Gerekli izinler: alanına bakın ve ACCESS_COARSE_LOCATION ve ACCESS_FINE_LOCATION denetleyin. Bu, dosyanın AndroidManifest.xml güncelleştirmesi.

Uygulamanız Android 10 - Q (API Düzeyi 29 veya sonraki bir sürümü) hedeflese ve LocationAlways'italep ediyorsa, AssemblyInfo.csdosyasına aşağıdaki izni de eklemeniz gerekir:

[assembly: UsesPermission(Manifest.Permission.AccessBackgroundLocation)]

Veya doğrudan AndroidManifest.xml:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Dikkate alınacak birçok kısıtlama olduğu için arka plan konumu güncelleştirmeleri ile ilgili Android belgelerini okuması önerilir.

Bu API, Android'de çalışma zamanı izinlerini kullanır. Lütfen tamamen Xamarin.Essentials başlatılmış olduğundan ve uygulamanıza izin işlemenin ayar olduğundan emin olur.

Android projesinin veya MainLauncher başlatılan herhangi bir ActivityXamarin.Essentials projesinin yönteminde başlatılması OnCreate gerekir:

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
    //...
}    

Android'de çalışma zamanı izinlerini işlemek için Xamarin.Essentials herhangi bir al OnRequestPermissionsResult gerekir. Aşağıdaki kodu tüm sınıflara Activity ekleyin:

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);
}

Coğrafi Konum Kullanma

sınıfınıza Xamarin.Essentials bir başvuru ekleyin:

using Xamarin.Essentials;

Coğrafi Konum API'si gerektiğinde kullanıcıdan izinler de istenir.

yöntemini çağırarak cihazın bilinen son konumunu elde edebilirsiniz. Bu genellikle tam sorguyu daha hızlıdır, ancak daha az doğru olabilir ve önbelleğe alınmış null bir konum yoksa geri dönebilirsiniz.

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
}

Geçerli cihazın konum koordinatlarını sorgulamak için kullanılabilir. En iyisi tam geçiş yapmaktır GeolocationRequest ve cihazın konumunu almak biraz zaman CancellationToken alalır.

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();
}

Her cihazın farklı sağlayıcılar aracılığıyla coğrafi konum sorgulaması nedeniyle tüm değerlerin kullanılabilir olduğunu unutmayın. Örneğin, özelliği 0 değerine sahip veya deniz seviyesinin metre üzerinde olan pozitif bir Altitudenull değere sahip olabilir. Mevcut olmayacak diğer değerler ve değerlerini SpeedCourse içerir.

Coğrafi Konum Doğruluğu

Aşağıdaki tabloda platform başına doğruluk özetlemektedir:

En düşük

Platform Uzaklık (metre)
Android 500
iOS 3000
UWP 1000 - 5000

Düşük

Platform Uzaklık (metre)
Android 500
iOS 1000
UWP 300 - 3000

Orta (Varsayılan)

Platform Uzaklık (metre)
Android 100 - 500
iOS 100
UWP 30-500

Yüksek

Platform Uzaklık (metre)
Android 0 - 100
iOS 10
UWP <= 10

En iyi

Platform Uzaklık (metre)
Android 0 - 100
iOS ~0
UWP <= 10

Sahte Konumları Algılama

Bazı cihazlar sağlayıcıdan veya sahte konumlar sağlayan bir uygulama tarafından sahte bir konum dönüşebilir. Herhangi bir üzerinde kullanarak bunu IsFromMockProviderLocation algılanabilir.

var request = new GeolocationRequest(GeolocationAccuracy.Medium);
var location = await Geolocation.GetLocationAsync(request);

if (location != null)
{
    if(location.IsFromMockProvider)
    {
        // location is from a mock provider
    }
}

İki Konum Arasındaki Uzaklık

ve LocationLocationExtensions sınıfları, CalculateDistance iki coğrafi konum arasındaki mesafeyi hesaplamaya olanak sağlayan yöntemleri tanımlar. Bu hesaplanmış mesafe yolları veya diğer yolları hesaba katmaz ve dünya yüzeyindeki iki nokta arasındaki en kısa mesafedir ve büyük daire uzaklığı veya harmanlamalı olarak da bilinen mesafedir ."

Aşağıda bir örnek verilmiştir:

Location boston = new Location(42.358056, -71.063611);
Location sanFrancisco = new Location(37.783333, -122.416667);
double miles = Location.CalculateDistance(boston, sanFrancisco, DistanceUnits.Miles);

Oluşturucu Location bu sırada enlem ve boylam bağımsız değişkenlerine sahip. Pozitif enlem değerleri ekvator'ın kuzeyidir ve pozitif boylam değerleri Asal Meridyen'in doğusu olur. Mil veya kilometre belirtmek için CalculateDistance son bağımsız değişkeni kullanın. sınıfı UnitConverters ayrıca iki birim arasında dönüştürme için ve yöntemlerini KilometersToMilesMilesToKilometers tanımlar.

Platform farkları

Yükseklik her platformda farklı şekilde hesaplanır.

Android 'de, varsa Yükseklik, wgs 84 Reference ellipsoid üzerinde ölçü olarak döndürülür. Bu konumun bir yüksekliği yoksa 0,0 döndürülür.

API

Channel 9 ve YouTube'da daha fazla Xamarin videoları bulun.