Xamarin.Essentials: Geografická poloha
Třída Geolocation poskytuje rozhraní API pro načtení aktuálních souřadnic geografické polohy zařízení.
Začínáme
Pokud chcete začít používat toto rozhraní API, přečtěte si úvodní příručkuXamarin.Essentials, abyste měli jistotu, že je knihovna správně nainstalovaná a nastavená ve vašich projektech.
Pro přístup k funkcím geografické polohy se vyžaduje následující nastavení specifické pro platformu:
Jsou vyžadována hrubá a jemné umístění a musí být nakonfigurována v projektu Android. Pokud vaše aplikace cílí na Android 5.0 (úroveň rozhraní API 21) nebo vyšší, musíte deklarovat, že vaše aplikace používá hardwarové funkce v souboru manifestu. Můžete ho přidat následujícími způsoby:
Otevřete soubor AssemblyInfo.cs ve složce Vlastnosti a přidejte:
[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)]
Nebo aktualizujte manifest Androidu:
Otevřete soubor AndroidManifest.xml ve složce Vlastnosti a přidejte do uzlu manifestu následující kód:
<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" />
Nebo klikněte pravým tlačítkem myši na projekt Android a otevřete vlastnosti projektu. V části Manifest pro Android vyhledejte požadovaná oprávnění: a zkontrolujte oprávnění ACCESS_COARSE_LOCATION a ACCESS_FINE_LOCATION . Tím se automaticky aktualizuje soubor AndroidManifest.xml .
Pokud vaše aplikace cílí na Android 10 – Q (rozhraní API úrovně 29 nebo vyšší) a žádá o locationAlways, musíte do AssemblyInfo.cs přidat také následující oprávnění:
[assembly: UsesPermission(Manifest.Permission.AccessBackgroundLocation)]
Nebo přímo do AndroidManifest.xml:
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />
Doporučujeme přečíst si dokumentaci k Androidu o aktualizacích umístění na pozadí, protože je potřeba zvážit mnoho omezení.
Toto rozhraní API používá oprávnění modulu runtime v Androidu. Ujistěte se, že Xamarin.Essentials je v aplikaci plně inicializováno a zpracování oprávnění.
V projektu MainLauncher
Androidu nebo v libovolném Activity
spuštěné Xamarin.Essentials aplikaci musí být inicializována OnCreate
metoda:
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
//...
}
Chcete-li zpracovávat oprávnění modulu runtime v Androidu, Xamarin.Essentials musí přijmout všechny OnRequestPermissionsResult
. Do všech Activity
tříd přidejte následující kód:
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);
}
Použití geografické polohy
Přidejte do Xamarin.Essentials předmětu odkaz:
using Xamarin.Essentials;
Rozhraní API geografické polohy také vyzve uživatele k zadání oprávnění v případě potřeby.
Poslední známou polohu zařízení můžete získat voláním GetLastKnownLocationAsync
metody. To je často rychlejší, než když provedete úplný dotaz, ale může být méně přesný a může se vrátit null
, pokud neexistuje umístění v mezipaměti.
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
}
K dotazování souřadnic umístění aktuálního zařízení je možné použítGetLocationAsync
. Nejlepší je předat plný GeolocationRequest
a CancellationToken
protože může nějakou dobu trvat, než se zařízení nachází.
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();
}
Všimněte si, že všechny hodnoty můžou být dostupné kvůli tomu, jak každý zařízení dotazuje geografickou polohu prostřednictvím různých poskytovatelů. Vlastnost může mít null
například Altitude
hodnotu 0 nebo kladnou hodnotu, která je v metrech nad mořem. Jiné hodnoty, které nemusí být zahrnuty Speed
a Course
.
Přesnost geografické polohy
Následující tabulka popisuje přesnost na platformu:
Nejnižší
Platforma | Vzdálenost (v metrech) |
---|---|
Android | 500 |
iOS | 3000 |
UWP | 1000 - 5000 |
Nízká
Platforma | Vzdálenost (v metrech) |
---|---|
Android | 500 |
iOS | 1000 |
UWP | 300 - 3000 |
Střední (výchozí)
Platforma | Vzdálenost (v metrech) |
---|---|
Android | 100 - 500 |
iOS | 100 |
UWP | 30-500 |
Vysoká
Platforma | Vzdálenost (v metrech) |
---|---|
Android | 0 - 100 |
iOS | 10 |
UWP | <= 10 |
Nejlepší
Platforma | Vzdálenost (v metrech) |
---|---|
Android | 0 - 100 |
iOS | ~0 |
UWP | <= 10 |
Zjišťování umístění napodobení
Některá zařízení můžou vrátit napodobené umístění od poskytovatele nebo aplikace, která poskytuje napodobená umístění. Můžete to zjistit pomocí libovolného IsFromMockProvider
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
}
}
Vzdálenost mezi dvěma umístěními
LocationExtensions
Třídy Location
definují CalculateDistance
metody, které umožňují vypočítat vzdálenost mezi dvěma geografickými umístěními. Tato počítaná vzdálenost nebere v úvahu cesty ani jiné cesty a je pouze nejkratší vzdáleností mezi dvěma body podél povrchu Země, označovanou také jako vzdálenost velkého kruhu nebo colloquily, vzdálenost "jako vračí mouchy".
Tady je příklad:
Location boston = new Location(42.358056, -71.063611);
Location sanFrancisco = new Location(37.783333, -122.416667);
double miles = Location.CalculateDistance(boston, sanFrancisco, DistanceUnits.Miles);
Konstruktor Location
má v daném pořadí argumenty zeměpisné šířky a délky. Kladné hodnoty zeměpisné šířky jsou sever od rovníku a kladné hodnoty délky jsou východně od prime meridianu. Pomocí posledního argumentu CalculateDistance
můžete zadat míle nebo kilometry. Třída UnitConverters
také definuje KilometersToMiles
a MilesToKilometers
metody pro převod mezi těmito dvěma jednotkami.
Rozdíly mezi platformami
Na každé platformě se výška počítá odlišně.
V Androidu je výška v případě, že je k dispozici, vrácena v metrech nad referenční elipsou WGS 84. Pokud toto umístění nemá výšku, vrátí se hodnota 0,0.