Získání polohy uživatele

Pomocí rozhraní API Windows.Devices.Geolocation můžete v aplikaci pro Windows App SDK (WinUI 3) zjistit zeměpisnou polohu zařízení. Můžete získat jednorázovou opravu polohy nebo sledovat pozici uživatele v průběhu času. Tento článek se zabývá zpracováním oprávnění, jednorázovým a nepřetržitým čtením umístění a informacemi o tom, jak aktualizovat uživatelské rozhraní při změně umístění.

Note

Rozhraní API Windows.Devices.Geolocation jsou rozhraní API prostředí Windows Runtime (WinRT), která fungují jak v aplikacích UWP, tak i v desktopových aplikacích WinUI 3. Kód v tomto článku používá vzory WinUI 3 (například DispatcherQueue pro zařazování vláken).

Předpoklady

  • Projekt WinUI 3 vytvořený ze šablony Blank App, Packaged (WinUI 3 in Desktop).
  • Funkce Umístění deklarovaná v manifestu balíčku (viz Povolení funkce umístění).

Povolit funkci určování polohy

Vaše aplikace musí před přístupem k pozici uživatele deklarovat funkci Umístění .

  1. V Průzkumník řešení poklikejte na Package.appxmanifest a vyberte kartu Schopnosti.
  2. Zaškrtněte políčko „Umístění“.

Tím se do manifestu přidá následující položka:

<Capabilities>
    <DeviceCapability Name="location"/>
</Capabilities>

Tip

U rozbalených aplikací se v manifestu nevyžaduje funkce Umístění. Přesto ale musíte volat RequestAccessAsync a vyzvat uživatele k zadání oprávnění.

Získání aktuálního umístění

Pokud chcete provést jednorázové čtení, postupujte podle těchto kroků.

Žádost o přístup k umístění uživatele

Před přístupem k datům o poloze zavolejte Geolocator.RequestAccessAsync . Tato metoda při prvním spuštění vyzve uživatele k udělení oprávnění. Musíte ho volat z vlákna uživatelského rozhraní, když je vaše aplikace v popředí.

using Windows.Devices.Geolocation;

var accessStatus = await Geolocator.RequestAccessAsync();

Načíst polohu

Pokud uživatel udělí oprávnění, vytvořte geolokátor a zavolejte GetGeopositionAsync , abyste získali jednorázovou opravu pozice.

switch (accessStatus)
{
    case GeolocationAccessStatus.Allowed:
        var geolocator = new Geolocator { DesiredAccuracyInMeters = 50 };
        Geoposition position = await geolocator.GetGeopositionAsync();

        double latitude = position.Coordinate.Point.Position.Latitude;
        double longitude = position.Coordinate.Point.Position.Longitude;

        StatusText.Text = $"Location: {latitude:F4}, {longitude:F4}";
        break;

    case GeolocationAccessStatus.Denied:
        StatusText.Text = "Location access is denied.";
        break;

    case GeolocationAccessStatus.Unspecified:
        StatusText.Text = "An unspecified error occurred.";
        break;
}

Sledování polohy uživatele v průběhu času

Pokud chcete dostávat pravidelné aktualizace polohy, přihlaste se k odběru události PositionChanged . Nastavte ReportInterval pro sledování podle času nebo MovementThreshold pro sledování na základě vzdálenosti.

if (accessStatus == GeolocationAccessStatus.Allowed)
{
    var geolocator = new Geolocator { ReportInterval = 2000 }; // 2-second interval

    geolocator.PositionChanged += OnPositionChanged;
    geolocator.StatusChanged += OnStatusChanged;
}

Zpracování aktualizací pozice

Událost PositionChanged se aktivuje na vlákně na pozadí. Slouží DispatcherQueue k zařazování aktualizací uživatelského rozhraní zpět do hlavního vlákna.

private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
    DispatcherQueue.TryEnqueue(() =>
    {
        var position = args.Position.Coordinate.Point.Position;
        StatusText.Text = $"Updated: {position.Latitude:F4}, {position.Longitude:F4}";
    });
}

Zpracovat změny stavu

Sledujte StatusChanged, abyste zjistili, kdy uživatel zakáže služby určování polohy nebo dojde ke ztrátě signálu GPS.

private void OnStatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
    DispatcherQueue.TryEnqueue(() =>
    {
        switch (args.Status)
        {
            case PositionStatus.Ready:
                StatusText.Text = "Location is available.";
                break;
            case PositionStatus.Disabled:
                StatusText.Text = "Location is disabled. Check Settings.";
                break;
            case PositionStatus.NoData:
                StatusText.Text = "Unable to determine location.";
                break;
            case PositionStatus.NotAvailable:
                StatusText.Text = "Location is not available on this device.";
                break;
        }
    });
}

Nasměrovat uživatele na nastavení polohy

Pokud uživatel odepře přístup k poloze, zadejte odkaz na nastavení ochrany osobních údajů Windows, aby mohl změnit předvolby.

<HyperlinkButton Content="Open location settings"
                 NavigateUri="ms-settings:privacy-location" />

Stránku nastavení můžete otevřít také z kódu:

await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));

Zobrazit umístění na mapě

Po načtení pozice ji můžete zobrazit na WinUI 3 MapControl nastavením Center a přidáním MapIcon. Kompletní funkční příklad, který kombinuje geolokaci, zobrazení mapy a geofencing, najdete v přehledu map a umístění.

Troubleshooting

Pokud vaše aplikace nemůže získat polohu, zkontrolujte následující v Nastavení > Soukromí a zabezpečení > Poloha:

  • Služba zjišťování polohy je zapnutá.
  • Vaše aplikace je uvedená a nastavená na Zapnuto v části Povolit aplikacím přístup k vaší poloze.
  • Zařízení má funkční přijímač GPS nebo je k dispozici určování polohy pomocí sítě.