İngilizce dilinde oku

Aracılığıyla paylaş


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.

Kullanmaya başlayın

Bu API'yi kullanmaya başlamak için kitaplığın projelerinizde düzgün yüklendiğinden ve ayarlandığından emin olmak için Xamarin.Essentials kullanmaya başlama 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ılmalıdır. Ayrıca, uygulamanız Android 5.0 (API düzeyi 21) veya üzerini hedeflediyse, uygulamanızın bildirim dosyasındaki donanım özelliklerini kullandığını bildirmeniz gerekir. Bu, aşağıdaki yollarla eklenebilir:

Özellikler klasörünün altındaki AssemblyInfo.cs dosyasını açın ve aşağıdakileri ekleyin:

C#
[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 klasörünün altındaki AndroidManifest.xml dosyasını açın ve bildirim düğümünün içine aşağıdakileri ekleyin:

XML
<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ıp projenin özelliklerini açın. Android Bildirimi altında Gerekli izinler: alanını bulun ve ACCESS_COARSE_LOCATION ve ACCESS_FINE_LOCATION izinlerini denetleyin. Bu, AndroidManifest.xml dosyasını otomatik olarak güncelleştirir.

Uygulamanız Android 10 - Q 'yi (API Düzeyi 29 veya üzeri) hedefliyorsa ve LocationAlways isteğinde bulunuyorsa, AssemblyInfo.cs aşağıdaki izni de eklemeniz gerekir:

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

Veya doğrudan AndroidManifest.xml:

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

Dikkate alınması gereken birçok kısıtlama olduğundan, arka plan konumu güncelleştirmeleriyle ilgili Android belgelerinin okunmasını öneririz.

Bu API, Android'de çalışma zamanı izinlerini kullanır. Lütfen tam olarak başlatıldığından Xamarin.Essentials ve uygulamanızda izin işlemenin ayarlandığından emin olun.

Android projesinde MainLauncher veya başlatılan Xamarin.Essentials herhangi bir Activity proje yönteminde OnCreate başlatılmalıdır:

C#
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 herhangi Xamarin.Essentials bir OnRequestPermissionsResultalmalıdır. Aşağıdaki kodu tüm Activity sınıflara ekleyin:

C#
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ızda için Xamarin.Essentials bir başvuru ekleyin:

C#
using Xamarin.Essentials;

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

yöntemini çağırarak cihazın bilinen son konumunu alabilirsiniz.GetLastKnownLocationAsync Bu genellikle tam sorgu yaparken daha hızlıdır, ancak daha az doğru olabilir ve önbelleğe alınmış bir konum yoksa döndürebilir null .

C#
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 GetLocationAsync için kullanılabilir. Tam olarak geçirmek GeolocationRequest en iyisidir ve CancellationToken cihazın konumunu almak biraz zaman alabileceğinden.

C#
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 olabileceğini unutmayın. Örneğin, Altitude özelliği 0 değerine sahip veya deniz seviyesinden metre yüksek olan pozitif bir değere sahip olabilir null. Mevcut olmayabilecek diğer değerler ve Coursedeğerlerini içerirSpeed.

Coğrafi Konum Doğruluğu

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

En Düşük

Platform Mesafe (metre olarak)
Android 500
iOS 3000
UWP 1000 - 5000

Düşük

Platform Mesafe (metre olarak)
Android 500
iOS 1000
UWP 300 - 3000

Orta (Varsayılan)

Platform Mesafe (metre olarak)
Android 100 - 500
iOS 100
UWP 30-500

Yüksek

Platform Mesafe (metre olarak)
Android 0 - 100
iOS 10
UWP <= 10

En iyi

Platform Mesafe (metre olarak)
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 konum döndürebilir. Bunu herhangi bir Locationüzerinde kullanarak IsFromMockProvider algılayabilirsiniz.

C#
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 sınıfları, Location iki coğrafi konum arasındaki mesafeyi hesaplamanıza olanak sağlayan yöntemleri tanımlarCalculateDistance.LocationExtensions Bu hesaplanan mesafe yolları veya diğer yolları dikkate almaz ve dünya yüzeyindeki iki nokta arasındaki en kısa mesafedir, büyük daire uzaklığı olarak da bilinir veya eş zamanlı olarak, mesafe "karga uçarken".

Bir örnek aşağıda verilmiştir:

C#
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şturucunun Location enlem ve boylam bağımsız değişkenleri bu sıradadır. Pozitif enlem değerleri ekvatorun kuzeyinde, pozitif boylam değerleri ise Prime Meridian'ın doğusundadır. Mil veya kilometre belirtmek için CalculateDistance son bağımsız değişkeni kullanın. UnitConverters sınıfı ayrıca ve MilesToKilometers iki birim arasında dönüştürme yöntemlerini tanımlarKilometersToMiles.

Platform Farkları

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

Android'de, varsa rakım WGS 84 referans elipsoidinin metreler içinde döndürülür. Bu konumun yüksekliği yoksa 0,0 döndürülür.

API

Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.