Pobieranie lokalizacji użytkownika

Użyj Windows. Devices.Geolocation APIs do wykrywania położenia geograficznego urządzenia w aplikacji Zestaw SDK do aplikacji systemu Windows (WinUI 3). Możesz uzyskać jednorazową poprawkę lokalizacji lub śledzić pozycję użytkownika w czasie. W tym artykule opisano obsługę uprawnień, operacje odczytu jednorazowej i ciągłej lokalizacji oraz sposób aktualizowania interfejsu użytkownika po zmianie lokalizacji.

Note

Interfejsy API Windows.Devices.Geolocation to interfejsy API środowiska środowisko wykonawcze systemu Windows (WinRT), które działają zarówno w aplikacjach UWP, jak i aplikacjach klasycznych WinUI 3. Kod w tym artykule używa wzorców WinUI 3 (na przykład DispatcherQueue do marshalingu wątków).

Prerequisites

  • Projekt WinUI 3 utworzony z szablonu Pusta aplikacja w pakiecie (WinUI 3 na pulpicie).
  • Funkcja Lokalizacja zadeklarowana w manifeście pakietu (zobacz Włączanie możliwości lokalizacji).

Włączanie możliwości lokalizacji

Aplikacja musi zadeklarować możliwość lokalizacji , aby mogła uzyskać dostęp do pozycji użytkownika.

  1. W Eksplorator rozwiązań kliknij dwukrotnie plik Package.appxmanifest i wybierz kartę Możliwości.
  2. Zaznacz pole wyboru Lokalizacja.

Spowoduje to dodanie następującego wpisu do manifestu:

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

Wskazówka

W przypadku aplikacji rozpakowanych funkcja Lokalizacja nie jest wymagana w manifeście. Jednak nadal musisz wywołać metodę RequestAccessAsync , aby wyświetlić monit o uprawnienie użytkownika.

Pobieranie bieżącej lokalizacji

Wykonaj poniższe czynności, aby przeprowadzić jednorazowy odczyt położenia.

Żądanie dostępu do lokalizacji użytkownika

Przed uzyskaniem dostępu do danych lokalizacji wywołaj metodę Geolocator.RequestAccessAsync . Ta metoda monituje użytkownika o uprawnienie przy pierwszym uruchomieniu. Należy wywołać go z wątku interfejsu użytkownika, gdy aplikacja znajduje się na pierwszym planie.

using Windows.Devices.Geolocation;

var accessStatus = await Geolocator.RequestAccessAsync();

Odczytaj pozycję

Jeśli użytkownik udziela uprawnień, utwórz obiekt Geolocator i wywołaj metodę GetGeopositionAsync , aby uzyskać jednorazową poprawkę położenia.

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

Śledzenie lokalizacji użytkownika w czasie

Aby otrzymywać okresowe aktualizacje lokalizacji, zasubskrybuj zdarzenie PositionChanged . Ustaw ReportInterval do śledzenia opartego na czasie lub MovementThreshold do śledzenia zależnego od odległości.

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

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

Obsługuj aktualizacje pozycji

Zdarzenie PositionChanged jest wywoływane w wątku działającym w tle. Użyj DispatcherQueue, aby przekazać aktualizacje interfejsu użytkownika z powrotem do wątku głównego.

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

Obsługa zmian stanu

Monitoruj zdarzenie StatusChanged, aby wykryć, gdy użytkownik wyłączy usługi lokalizacyjne lub zostanie utracony sygnał 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;
        }
    });
}

Kierowanie użytkownika do ustawień lokalizacji

Jeśli użytkownik odmówi dostępu do lokalizacji, podaj link do ustawień prywatności Windows, aby mógł zmienić swoje preferencje.

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

Możesz również otworzyć stronę ustawień z poziomu kodu:

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

Pokaż lokalizację na mapie

Po pobraniu pozycji można wyświetlić ją w kontrolce MapControl WinUI 3, ustawiając jej Center i dodając element MapIcon. Aby zobaczyć kompletny działający przykład, który łączy geolokalizację, wyświetlanie map i geostrefy, zobacz sekcję Omówienie map i lokalizacji.

Troubleshooting

Jeśli aplikacja nie może pobrać lokalizacji, sprawdź następujące informacje w obszarze Ustawienia > Prywatność i lokalizacja zabezpieczeń>:

  • Usługi lokalizacjisą włączone.
  • Aplikacja jest wyświetlana na liście i ustawiona na wartość Włączone w obszarze Zezwalaj aplikacjom na dostęp do lokalizacji.
  • Urządzenie ma działający odbiornik GPS lub pozycjonowanie oparte na sieci jest dostępne.