De locatie van de gebruiker ophalen

Gebruik de Windows. Devices.Geolocation-API's om de geografische positie van het apparaat in een winUI 3-app (Windows App SDK) te detecteren. U kunt een eenmalige locatie herstellen of de positie van de gebruiker in de loop van de tijd bijhouden. In dit artikel vindt u informatie over het verwerken van machtigingen, eenmalige en continue locatieleesbewerkingen en het bijwerken van uw gebruikersinterface wanneer de locatie wordt gewijzigd.

Note

De Windows.Devices.Geolocation API's zijn Windows Runtime (WinRT)-API's die werken in zowel UWP- als WinUI 3-bureaublad-apps. De code in dit artikel maakt gebruik van WinUI 3-patronen (zoals DispatcherQueue voor thread marshaling).

Vereiste voorwaarden

  • Een WinUI 3-project dat is gemaakt op basis van de sjabloon Blank App, Packaged (WinUI 3 in Desktop).
  • De mogelijkheid Locatie gedeclareerd in het pakketmanifest (zie De mogelijkheid voor locatie inschakelen).

De locatiemogelijkheid inschakelen

Uw app moet de mogelijkheid Locatie declareren voordat deze toegang heeft tot de positie van de gebruiker.

  1. Dubbelklik in Solution Explorer op Package.appxmanifest en selecteer het tabblad Capabilities.
  2. Schakel het selectievakje voor Locatie in.

Hiermee voegt u de volgende vermelding toe aan het manifest:

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

Tip

Voor uitgepakte apps is de mogelijkheid Locatie niet vereist in een manifest. U moet RequestAccessAsync echter nog steeds aanroepen om de gebruiker om toestemming te vragen.

De huidige locatie ophalen

Volg deze stappen om de positie eenmalig uit te lezen.

Toegang tot de locatie van de gebruiker aanvragen

Roep Geolocator.RequestAccessAsync aan voordat u toegang hebt tot locatiegegevens. Met deze methode wordt de gebruiker gevraagd om toestemming te geven wanneer deze voor het eerst wordt uitgevoerd. U moet deze aanroepen vanuit de UI-thread terwijl uw app zich op de voorgrond bevindt.

using Windows.Devices.Geolocation;

var accessStatus = await Geolocator.RequestAccessAsync();

De positie uitlezen

Als de gebruiker toestemming verleent, maakt u een Geolocator en roept u GetGeopositionAsync aan om een eenmalige positieherstel op te halen.

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;
}

De locatie van de gebruiker in de loop van de tijd bijhouden

Als u periodieke locatie-updates wilt ontvangen, abonneert u zich op de PositionChanged-gebeurtenis . Stel ReportInterval in voor tracering op basis van tijd of MovementThreshold voor tracering op afstand.

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

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

Positie-updates verwerken

De PositionChanged gebeurtenis wordt geactiveerd op een achtergrondthread. Gebruik DispatcherQueue om UI-updates terug naar de hoofdthread te sturen.

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}";
    });
}

Statuswijzigingen verwerken

Controleer StatusChanged om te detecteren wanneer de gebruiker locatieservices uitschakelt of het GPS-signaal verloren gaat.

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;
        }
    });
}

De gebruiker doorsturen naar locatie-instellingen

Als de gebruiker de toegang tot de locatie weigert, geeft u een koppeling op naar de Windows privacyinstellingen, zodat deze de voorkeur kan wijzigen.

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

U kunt de pagina Instellingen ook openen vanuit code:

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

De locatie op een kaart weergeven

Nadat u een positie hebt opgehaald, kunt u deze in een WinUI 3-MapControl weergeven door Center in te stellen en een MapIcon toe te voegen. Zie het overzicht van kaarten en locaties voor een volledig werkvoorbeeld waarin geolocatie, kaartweergave en geofencing worden gecombineerd.

Probleemoplossingsproces

Als uw app geen locatie kan ophalen, controleert u het volgende in Privacy- en beveiligingslocatie > voor instellingen>:

  • Locatieservicesis ingeschakeld.
  • Uw app wordt weergegeven en is ingesteld op Aan onder Apps toegang geven tot uw locatie.
  • Het apparaat heeft een werkende GPS-ontvanger of netwerkgebaseerde positionering is beschikbaar.