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.
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:
[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:
<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:
[assembly: UsesPermission(Manifest.Permission.AccessBackgroundLocation)]
Veya doğrudan AndroidManifest.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:
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 OnRequestPermissionsResult
almalıdır. Aşağıdaki kodu tüm Activity
sınıflara 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);
}
Sınıfınızda için Xamarin.Essentials bir başvuru ekleyin:
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
.
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.
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 Course
değerlerini içerirSpeed
.
Aşağıdaki tabloda platform başına doğruluk özetlenmiştir:
Platform | Mesafe (metre olarak) |
---|---|
Android | 500 |
iOS | 3000 |
UWP | 1000 - 5000 |
Platform | Mesafe (metre olarak) |
---|---|
Android | 500 |
iOS | 1000 |
UWP | 300 - 3000 |
Platform | Mesafe (metre olarak) |
---|---|
Android | 100 - 500 |
iOS | 100 |
UWP | 30-500 |
Platform | Mesafe (metre olarak) |
---|---|
Android | 0 - 100 |
iOS | 10 |
UWP | <= 10 |
Platform | Mesafe (metre olarak) |
---|---|
Android | 0 - 100 |
iOS | ~0 |
UWP | <= 10 |
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.
var request = new GeolocationRequest(GeolocationAccuracy.Medium);
var location = await Geolocation.GetLocationAsync(request);
if (location != null)
{
if(location.IsFromMockProvider)
{
// location is from a mock provider
}
}
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:
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
.
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.
Channel 9 ve YouTube'da daha fazla Xamarin videosu bulun.