Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
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.
- W Eksplorator rozwiązań kliknij dwukrotnie plik Package.appxmanifest i wybierz kartę Możliwości.
- 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.