Xamarin.Essentials:Geolocation

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 nullnapří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 IsFromMockProviderLocation.

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.

rozhraní API

Další videa o Xamarinu najdete na Channel 9 a YouTube.