Nuta
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować się zalogować lub zmienić katalog.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Ważne
Interfejsy API platformy UWP MapControl i Windows Maps (Windows.Services.Maps.*) są przestarzałe i mogą nie być dostępne w przyszłych wersjach systemu Windows. Aby uzyskać więcej informacji, zobacz Zasoby dotyczące przestarzałych funkcji.
Ważne
Wycofanie usługi Mapy Bing dla przedsiębiorstw
MapControl platformy UWP i usługi map z przestrzeni nazw Windows.Services.Maps opierają się na mapach Bing. Mapy Bing dla przedsiębiorstw są przestarzałe i zostaną wycofane, wówczas kontrolka MapControl i usługi nie będą już odbierać danych.
Aby uzyskać więcej informacji, zobacz dokumentację Centrum deweloperów map Bing i Mapy Bing.
Uwaga / Notatka
MapControl i usługi mapowe wymagają klucza uwierzytelniania map o nazwie MapServiceToken. Aby uzyskać więcej informacji na temat pobierania i ustawiania klucza uwierzytelniania map, zobacz Żądanie klucza uwierzytelniania map.
Znajdź lokalizację użytkownika i odpowiedz na zmiany w lokalizacji. Dostęp do lokalizacji użytkownika jest zarządzany przez ustawienia prywatności w ustawieniach systemu Windows. W tym temacie pokazano również, jak sprawdzić, czy aplikacja ma uprawnienia dostępu do lokalizacji użytkownika.
Włączanie możliwości lokalizacji
- W Eksploratorze Rozwiązań kliknij dwukrotnie package.appxmanifest i wybierz kartę Możliwości.
- Na liście
Capabilities (Możliwości ) zaznacz pole wyboru Lokalizacja . Spowoduje to dodanie funkcjonalności urządzenialocationdo pliku manifestu pakietu.
<Capabilities>
<!-- DeviceCapability elements must follow Capability elements (if present) -->
<DeviceCapability Name="location"/>
</Capabilities>
Pobieranie bieżącej lokalizacji
W tej sekcji opisano sposób wykrywania lokalizacji geograficznej użytkownika przy użyciu interfejsów API w przestrzeni nazw Windows.Devices.Geolocation .
Krok 1. Żądanie dostępu do lokalizacji użytkownika
Jeśli aplikacja nie ma zdolności do określania przybliżonej lokalizacji (patrz uwaga), przed podjęciem próby uzyskania dostępu do lokalizacji użytkownika należy zażądać dostępu za pomocą metody RequestAccessAsync. Musisz wywołać metodę RequestAccessAsync z wątku interfejsu użytkownika, a aplikacja musi znajdować się na pierwszym planie. Aplikacja nie będzie mogła uzyskać dostępu do informacji o lokalizacji użytkownika, dopóki użytkownik nie udzieli uprawnień do aplikacji.*
using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();
Metoda RequestAccessAsync monituje użytkownika o uprawnienie dostępu do lokalizacji. Użytkownik jest powiadamiany tylko raz (na każdą aplikację). Po pierwszym udzieleniu lub odmowie uprawnień ta metoda nie prosi już użytkownika o pozwolenie. Aby ułatwić użytkownikowi zmianę uprawnień lokalizacji po wyświetleniu monitu, zalecamy podanie linku do ustawień lokalizacji, jak pokazano w dalszej części tego tematu.
Uwaga / Notatka
Funkcja przybliżonej lokalizacji umożliwia aplikacji uzyskanie celowo zniekształconej (niedokładnej) lokalizacji bez uzyskania wyraźnej zgody użytkownika (przełącznik lokalizacji całego systemu musi jednak być włączony). Aby dowiedzieć się, jak używać przybliżonej lokalizacji w aplikacji, zobacz metodę AllowFallbackToConsentlessPositions w klasie Geolocator.
Krok 2. Pobieranie lokalizacji użytkownika i rejestrowanie w celu uzyskania zmian w uprawnieniach do lokalizacji
Metoda GetGeopositionAsync wykonuje jednorazowy odczyt bieżącej lokalizacji. W tym miejscu instrukcja switch jest używana z parametrem accessStatus (z poprzedniego przykładu) do działania tylko wtedy, gdy dostęp do lokalizacji użytkownika jest dozwolony. Jeśli dostęp do lokalizacji użytkownika jest dozwolony, kod tworzy obiekt Geolocator , rejestruje się w celu zmiany uprawnień lokalizacji i żąda lokalizacji użytkownika.
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
_rootPage.NotifyUser("Waiting for update...", NotifyType.StatusMessage);
// If DesiredAccuracy or DesiredAccuracyInMeters are not set (or value is 0), DesiredAccuracy.Default is used.
Geolocator geolocator = new Geolocator { DesiredAccuracyInMeters = _desireAccuracyInMetersValue };
// Subscribe to the StatusChanged event to get updates of location status changes.
_geolocator.StatusChanged += OnStatusChanged;
// Carry out the operation.
Geoposition pos = await geolocator.GetGeopositionAsync();
UpdateLocationData(pos);
_rootPage.NotifyUser("Location updated.", NotifyType.StatusMessage);
break;
case GeolocationAccessStatus.Denied:
_rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
LocationDisabledMessage.Visibility = Visibility.Visible;
UpdateLocationData(null);
break;
case GeolocationAccessStatus.Unspecified:
_rootPage.NotifyUser("Unspecified error.", NotifyType.ErrorMessage);
UpdateLocationData(null);
break;
}
Krok 3. Obsługa zmian w uprawnieniach lokalizacji
Obiekt Geolocator wyzwala zdarzenie StatusChanged , aby wskazać, że ustawienia lokalizacji użytkownika zostały zmienione. To zdarzenie przekazuje odpowiedni status za pośrednictwem właściwości Status argumentu (typu PositionStatus). Należy pamiętać, że ta metoda nie jest wywoływana z wątku interfejsu użytkownika, a obiekt Dispatcher wywołuje zmiany interfejsu użytkownika.
using Windows.UI.Core;
...
async private void OnStatusChanged(Geolocator sender, StatusChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
// Show the location setting message only if status is disabled.
LocationDisabledMessage.Visibility = Visibility.Collapsed;
switch (e.Status)
{
case PositionStatus.Ready:
// Location platform is providing valid data.
ScenarioOutput_Status.Text = "Ready";
_rootPage.NotifyUser("Location platform is ready.", NotifyType.StatusMessage);
break;
case PositionStatus.Initializing:
// Location platform is attempting to acquire a fix.
ScenarioOutput_Status.Text = "Initializing";
_rootPage.NotifyUser("Location platform is attempting to obtain a position.", NotifyType.StatusMessage);
break;
case PositionStatus.NoData:
// Location platform could not obtain location data.
ScenarioOutput_Status.Text = "No data";
_rootPage.NotifyUser("Not able to determine the location.", NotifyType.ErrorMessage);
break;
case PositionStatus.Disabled:
// The permission to access location data is denied by the user or other policies.
ScenarioOutput_Status.Text = "Disabled";
_rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
// Show message to the user to go to location settings.
LocationDisabledMessage.Visibility = Visibility.Visible;
// Clear any cached location data.
UpdateLocationData(null);
break;
case PositionStatus.NotInitialized:
// The location platform is not initialized. This indicates that the application
// has not made a request for location data.
ScenarioOutput_Status.Text = "Not initialized";
_rootPage.NotifyUser("No request for location is made yet.", NotifyType.StatusMessage);
break;
case PositionStatus.NotAvailable:
// The location platform is not available on this version of the OS.
ScenarioOutput_Status.Text = "Not available";
_rootPage.NotifyUser("Location is not available on this version of the OS.", NotifyType.ErrorMessage);
break;
default:
ScenarioOutput_Status.Text = "Unknown";
_rootPage.NotifyUser(string.Empty, NotifyType.StatusMessage);
break;
}
});
}
Reagowanie na aktualizacje lokalizacji
W tej sekcji opisano sposób używania zdarzenia PositionChanged do odbierania aktualizacji lokalizacji użytkownika w danym okresie. Ponieważ użytkownik może odwołać dostęp do lokalizacji w dowolnym momencie, ważne jest wywołanie metody RequestAccessAsync i użycie zdarzenia StatusChanged , jak pokazano w poprzedniej sekcji.
Przyjęto założenie, że włączono już możliwości lokalizacyjne i wywołano RequestAccessAsync z poziomu wątku interfejsu użytkownika aplikacji pierwszego planu.
Krok 1. Definiowanie interwału raportu i rejestrowanie aktualizacji lokalizacji
W tym przykładzie instrukcja switch jest używana z parametrem accessStatus (z poprzedniego przykładu) do działania tylko wtedy, gdy dostęp do lokalizacji użytkownika jest dozwolony. Jeśli dostęp do lokalizacji użytkownika jest dozwolony, kod tworzy obiekt Geolocator , określa typ śledzenia i rejestruje się w celu aktualizacji lokalizacji.
Obiekt Geolocator może wyzwolić zdarzenie PositionChanged w oparciu o zmianę pozycji (śledzenie dystansowe) lub zmianę czasu (śledzenie okresowe na podstawie czasu).
- W przypadku śledzenia na podstawie odległości ustaw właściwość MovementThreshold.
- W przypadku śledzenia okresowego ustaw właściwość ReportInterval.
Jeśli żadna właściwość nie jest ustawiona, pozycja jest zwracana co sekundę (równoważne ReportInterval = 1000). W tym miejscu używany jest 2-sekundowy interwał raportu (ReportInterval = 2000).
using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
// Create Geolocator and define periodic-based tracking (2 second interval).
_geolocator = new Geolocator { ReportInterval = 2000 };
// Subscribe to the PositionChanged event to get location updates.
_geolocator.PositionChanged += OnPositionChanged;
// Subscribe to StatusChanged event to get updates of location status changes.
_geolocator.StatusChanged += OnStatusChanged;
_rootPage.NotifyUser("Waiting for update...", NotifyType.StatusMessage);
LocationDisabledMessage.Visibility = Visibility.Collapsed;
StartTrackingButton.IsEnabled = false;
StopTrackingButton.IsEnabled = true;
break;
case GeolocationAccessStatus.Denied:
_rootPage.NotifyUser("Access to location is denied.", NotifyType.ErrorMessage);
LocationDisabledMessage.Visibility = Visibility.Visible;
break;
case GeolocationAccessStatus.Unspecified:
_rootPage.NotifyUser("Unspecified error!", NotifyType.ErrorMessage);
LocationDisabledMessage.Visibility = Visibility.Collapsed;
break;
}
Krok 2. Obsługa aktualizacji lokalizacji
Obiekt Geolocator wyzwala zdarzenie PositionChanged , aby wskazać, że lokalizacja użytkownika uległa zmianie lub upływie czasu, w zależności od tego, jak została skonfigurowana. To zdarzenie przekazuje odpowiednią lokalizację za pośrednictwem właściwości Position argumentu (typu Geoposition). W tym przykładzie metoda nie jest wywoływana z wątku interfejsu użytkownika, a obiekt Dispatcher wywołuje zmiany w interfejsie użytkownika.
using Windows.UI.Core;
...
async private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs e)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
_rootPage.NotifyUser("Location updated.", NotifyType.StatusMessage);
UpdateLocationData(e.Position);
});
}
Zmienianie ustawień prywatności lokalizacji
Jeśli ustawienia prywatności lokalizacji nie zezwalają aplikacji na dostęp do lokalizacji użytkownika, zalecamy podanie wygodnego linku do ustawień prywatności lokalizacjiw ustawieniach. W tym przykładzie użyto kontrolki Hyperlink do przejścia do identyfikatora URI ms-settings:privacy-location.
<!--Set Visibility to Visible when access to location is denied -->
<TextBlock x:Name="LocationDisabledMessage" FontStyle="Italic"
Visibility="Collapsed" Margin="0,15,0,0" TextWrapping="Wrap">
<Run Text="This app is not able to access Location. Go to "/>
<Hyperlink NavigateUri="ms-settings:privacy-location">
<Run Text="Settings"/>
</Hyperlink>
<Run Text=" to check the location privacy settings."/>
</TextBlock>
Alternatywnie aplikacja może wywołać metodę LaunchUriAsync , aby uruchomić ustawienia z kodu. Aby uzyskać więcej informacji, zobacz Uruchamianie ustawień systemu Windows.
using Windows.System;
...
bool result = await Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
Rozwiązywanie problemów z aplikacją
Aby aplikacja mogła uzyskać dostęp do lokalizacji użytkownika, na urządzeniu musi być włączona lokalizacja . W obszarze Ustawienia sprawdź, czy następujące ustawienia prywatności lokalizacji są włączone:
- Lokalizacja dla tego urządzenia... jest włączona (nie dotyczy Windows 10 Mobile)
- Ustawienie usług lokalizacji Locationjest włączone
- W sekcji Wybierz aplikacje, które mogą korzystać z twojej lokalizacji, aplikacja jest ustawiona na w
Tematy pokrewne
- przykład geolokalizacji platformy UWP
- wskazówki dotyczące projektowania dla geofencingu
- wskazówki dotyczące projektowania dla aplikacji obsługujących lokalizację