Hämta användarens plats

Använd Windows. Devices.Geolocation-API:er för att identifiera enhetens geografiska position i en Windows App SDK-app (WinUI 3). Du kan få en engångsplatskorrigering eller spåra användarens position över tid. Den här artikeln beskriver behörighetshantering, engångs- och kontinuerliga platsläsningar och hur du uppdaterar användargränssnittet när platsen ändras.

Note

Windows.Devices.Geolocation API:erna är Windows Runtime (WinRT) API:er som fungerar i både UWP- och WinUI 3-skrivbordsappar. Koden i den här artikeln använder WinUI 3-mönster (till exempel DispatcherQueue för att dirigera anrop mellan trådar).

Förutsättningar

  • Ett WinUI 3-projekt som skapats från mallen Tom app, Paketerad (WinUI 3 i Desktop).
  • Platsfunktionen som deklareras i paketmanifestet (se Aktivera platsfunktionen).

Aktivera platsfunktionen

Appen måste deklarera platsfunktionen innan den kan komma åt användarens position.

  1. I Prieskumník riešení dubbelklickar du på Package.appxmanifest och väljer fliken Funktioner.
  2. Markera kryssrutan för Plats.

Detta lägger till följande post i manifestet:

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

Tip

För opaketerade appar krävs inte platsbehörigheten i ett manifest. Du måste dock fortfarande anropa RequestAccessAsync för att be användaren om behörighet.

Hämta den aktuella platsen

Följ dessa steg för att utföra en engångspositionsläsning.

Begär åtkomst till användarens plats

Anropa Geolocator.RequestAccessAsync innan du får åtkomst till platsdata. Den här metoden ber användaren om behörighet första gången den körs. Du måste anropa den från användargränssnittstråden medan appen är i förgrunden.

using Windows.Devices.Geolocation;

var accessStatus = await Geolocator.RequestAccessAsync();

Läs positionen

Om användaren beviljar behörighet skapar du en Geolocator och anropar GetGeopositionAsync för att få en engångspositionskorrigering.

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

Spåra användarens plats över tid

Om du vill få regelbundna platsuppdateringar prenumererar du på händelsen PositionChanged . Ange ReportInterval för tidsbaserad spårning eller MovementThreshold för avståndsbaserad spårning.

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

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

Hantera positionsuppdateringar

PositionChanged-händelsen utlöses på en bakgrundstråd. Använd DispatcherQueue för att konvertera UI-uppdateringar tillbaka till huvudtråden.

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

Hantera statusändringar

Övervaka StatusChanged för att identifiera när användaren inaktiverar platstjänster eller gps-signalen går förlorad.

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

Dirigera användaren till platsinställningar

Om användaren nekar platsåtkomst anger du en länk till Windows sekretessinställningar så att de kan ändra sina inställningar.

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

Du kan också öppna inställningssidan från kod:

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

Visa platsen på en karta

När du har hämtat en position kan du visa den på en WinUI 3 MapControl genom att ange dess Center och lägga till en MapIcon. Ett komplett arbetsexempel som kombinerar geoplats, kartvisning och geofencing finns i Översikt över kartor och plats.

Troubleshooting

Om appen inte kan hämta en plats kontrollerar du följande i Inställningar > Sekretess och säkerhetsplats>:

  • Platstjänster är aktiverade.
  • Din app visas och är inställd på På under Låt appar komma åt din plats.
  • Enheten har en fungerande GPS-mottagare eller nätverksbaserad positionering är tillgänglig.