Freigeben über


Abrufen der Position eines Benutzers

Wichtig

Einstellung des Bing Maps for Enterprise-Diensts

Die UWP-MapControl- und Kartendienste aus dem Windows.Services.Maps-Namespace basieren auf Bing Maps. Bing Maps for Enterprise ist veraltet und wird eingestellt, zu diesem Zeitpunkt empfangen mapControl und Dienste keine Daten mehr.

Weitere Informationen finden Sie in der Bing Maps Developer Center - und Bing Maps-Dokumentation.

Hinweis

MapControl und Kartendienste erfordern einen Kartenauthentifizierungsschlüssel namens MapServiceToken. Weitere Informationen zum Abrufen und Festlegen eines Kartenauthentifizierungsschlüssels finden Sie unter Anfordern eines Kartenauthentifizierungsschlüssels.

Suchen Sie den Standort des Benutzers, und reagieren Sie auf Änderungen am Standort. Der Zugriff auf den Standort des Benutzers wird durch Datenschutzeinstellungen in der Windows-Einstellungs-App verwaltet. In diesem Thema wird auch gezeigt, wie Sie überprüfen können, ob Ihre App über die Berechtigung für den Zugriff auf den Standort des Benutzers verfügt.

Aktivieren der Standortfunktion

  1. Doppelklicken Sie in Projektmappen-Explorer auf "package.appxmanifest", und wählen Sie die Registerkarte "Funktionen" aus.
  2. Aktivieren Sie in der Liste "Funktionen " das Kontrollkästchen für "Speicherort". Dadurch wird der Paketmanifestdatei die location Gerätefunktion hinzugefügt.
  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Abrufen der aktuellen Position

In diesem Abschnitt wird beschrieben, wie Sie den geografischen Standort des Benutzers mithilfe von APIs im Windows.Devices.Geolocation-Namespace erkennen.

Schritt 1: Anfordern des Zugriffs auf den Standort des Benutzers

Sofern Ihre App nicht über eine grobe Standortfunktion verfügt (siehe Hinweis), müssen Sie den Zugriff auf den Standort des Benutzers mithilfe der RequestAccessAsync-Methode anfordern, bevor Sie versuchen, auf den Speicherort zuzugreifen. Sie müssen die RequestAccessAsync-Methode aus dem UI-Thread aufrufen, und Ihre App muss sich im Vordergrund befinden. Ihre App kann erst dann auf die Standortinformationen des Benutzers zugreifen, nachdem der Benutzer die Berechtigung für Ihre App erteilt hat.*

using Windows.Devices.Geolocation;
...
var accessStatus = await Geolocator.RequestAccessAsync();

Die RequestAccessAsync-Methode fordert den Benutzer zur Berechtigung für den Zugriff auf seinen Standort auf. Der Benutzer wird nur einmal aufgefordert (pro App). Nach dem ersten Erteilen oder Verweigern der Berechtigung fordert diese Methode den Benutzer nicht mehr zur Berechtigung auf. Um den Benutzer bei der Änderung der Standortberechtigungen zu unterstützen, nachdem er dazu aufgefordert wurde, empfehlen wir, einen Link zu den Standorteinstellungen bereitzustellen, wie weiter unten in diesem Thema gezeigt.

Hinweis

Mit der groben Positionsfunktion kann Ihre App eine absichtlich verschleierte (ungenaue) Position erhalten, ohne die explizite Berechtigung des Benutzers zu erhalten (der systemweite Positionsschalter muss jedoch weiterhin aktiviert sein). Informationen zum Verwenden der groben Position in Ihrer App finden Sie unter der AllowFallbackToConsentlessPositions-Methode in der Geolocator-Klasse.

Schritt 2: Abrufen des Standorts des Benutzers und Registrieren für Änderungen an Standortberechtigungen

Die GetGeopositionAsync-Methode führt ein einmaliges Lesen des aktuellen Speicherorts durch. Hier wird eine switch Anweisung mit accessStatus (aus dem vorherigen Beispiel) verwendet, um nur zu handeln, wenn der Zugriff auf den Standort des Benutzers zulässig ist. Wenn der Zugriff auf den Standort des Benutzers zulässig ist, erstellt der Code ein Geolocator-Objekt , registriert sich für Änderungen an Standortberechtigungen und fordert den Standort des Benutzers an.

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

Schritt 3: Behandeln von Änderungen an Standortberechtigungen

Das Geolocator-Objekt löst das StatusChanged-Ereignis aus, um anzugeben, dass sich die Standorteinstellungen des Benutzers geändert haben. Dieses Ereignis übergibt den entsprechenden Status über die Status-Eigenschaft des Arguments (vom Typ PositionStatus). Beachten Sie, dass diese Methode nicht über den UI-Thread aufgerufen wird und das Dispatcher-Objekt die UI-Änderungen aufruft.

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

Reagieren auf Standortupdates

In diesem Abschnitt wird beschrieben, wie Sie das PositionChanged-Ereignis verwenden, um Aktualisierungen des Standorts des Benutzers über einen bestimmten Zeitraum zu empfangen. Da der Benutzer den Zugriff auf den Standort jederzeit widerrufen kann, ist es wichtig, RequestAccessAsync aufzurufen und das StatusChanged-Ereignis zu verwenden, wie im vorherigen Abschnitt gezeigt.

In diesem Abschnitt wird davon ausgegangen, dass Sie die Standortfunktion bereits aktiviert und "RequestAccessAsync" aus dem UI-Thread Der Vordergrund-App aufgerufen haben.

Schritt 1: Definieren des Berichtsintervalls und Registrieren für Positionsupdates

In diesem Beispiel wird eine switch Anweisung mit accessStatus (aus dem vorherigen Beispiel) verwendet, um nur zu handeln, wenn der Zugriff auf die Position des Benutzers zulässig ist. Wenn der Zugriff auf den Standort des Benutzers zulässig ist, erstellt der Code ein Geolocator-Objekt , gibt den Tracking-Typ an und registriert sich für Standortupdates.

Das Geolocator-Objekt kann das PositionChanged-Ereignis basierend auf einer Änderung der Position (entfernungsbasierte Nachverfolgung) oder einer Zeitänderung (periodische Nachverfolgung) auslösen.

Wenn keine eigenschaft festgelegt ist, wird eine Position alle 1 Sekunde zurückgegeben (entspricht ReportInterval = 1000). Hier wird ein Berichtsintervall von 2 Sekunden (ReportInterval = 2000) verwendet.

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

Schritt 2: Behandeln von Positionsupdates

Das Geolocator-Objekt löst das PositionChanged-Ereignis aus, um anzugeben, dass sich der Standort des Benutzers geändert hat oder die Zeit vergangen ist, je nachdem, wie Sie es konfiguriert haben. Dieses Ereignis übergibt die entsprechende Position über die Position-Eigenschaft des Arguments (vom Typ Geoposition). In diesem Beispiel wird die Methode nicht aus dem UI-Thread aufgerufen, und das Dispatcher-Objekt ruft die UI-Änderungen auf.

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

Ändern der Datenschutzeinstellungen für Den Standort

Wenn die Datenschutzeinstellungen für den Standort Ihrer App nicht den Zugriff auf den Standort des Benutzers zulassen, empfehlen wir, einen bequemen Link zu den Datenschutzeinstellungen für den Standort in der Einstellungs-App bereitzustellen. In diesem Beispiel wird ein Hyperlink-Steuerelement verwendet, um zum ms-settings:privacy-location URI zu navigieren.

<!--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>

Alternativ kann Ihre App die LaunchUriAsync-Methode aufrufen, um die Einstellungs-App über Code zu starten. Weitere Informationen finden Sie unter Starten der Windows-Einstellungen.

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

Behandeln von Problemen mit Ihrer App

Bevor Ihre App auf den Standort des Benutzers zugreifen kann, muss der Standort auf dem Gerät aktiviert sein. Überprüfen Sie in der Einstellungs-App , ob die folgenden Datenschutzeinstellungen für den Speicherort aktiviert sind:

  • Speicherort für dieses Gerät... ist aktiviert (nicht anwendbar in Windows 10 Mobile)
  • Die Einstellung "Standortdienste" ist aktiviert.
  • Unter " Apps auswählen", die Ihren Standort verwenden können, ist Ihre App auf "Ein" festgelegt.