Windows Dev Center

Language: HTML | XAML

Reagieren auf Positionsupdates (XAML)

[Einige Informationen beziehen sich auf die Vorabversion, die vor der kommerziellen Freigabe grundlegend geändert werden kann. Microsoft übernimmt keine Garantie, weder ausdrücklich noch stillschweigend, für die hier bereitgestellten Informationen.]

Erfahren Sie, wie Sie Positionsupdates des Benutzers über einen Zeitraum empfangen. In diesem Thema werden Codebeispiele auf der Basis des Geolocation-Beispiels verwendet, um die wichtigsten Punkte zu veranschaulichen. Um weitere Informationen zu erhalten, laden Sie das Beispiel herunter, und führen Sie es aus.

Roadmap: Wie hängt dieses Thema mit anderen zusammen? Siehe:

Schritt 1: Überprüfen, ob Positionsdienste aktiviert sind

Bevor Ihre App auf Positionsdaten zugreifen kann, muss Position auf dem Gerät aktiviert sein. Vergewissern Sie sich in der Einstellungs-App, dass die folgenden Datenschutzeinstellungen für den Standort aktiviert sind:

  • Position für dieses Gerät ... ist aktiviert (gilt nicht für Windows 10 Mobile Insider Preview)
  • Die Einstellung Position der Positionsdienste ist aktiviert.
  • Ihre App hat unter Diese Apps dürfen meinen Standort verwenden die Einstellung Ein.

Schritt 2: Aktivieren der Positionsfunktion

Doppelklicken Sie im Projektmappen-Explorer auf package.appxmanifest, und wählen Sie die Registerkarte Funktionen aus. Aktivieren Sie dann in der Liste Funktionen die Option Position. Dadurch wird der Paketmanifestdatei die Gerätefunktion Location hinzugefügt.


  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

Schritt 3: Anfordern des Zugriffs auf die Position des Benutzers

Fordern Sie den Zugriff auf die Position des Benutzers mit der RequestAccessAsync-Methode an.

Wichtig  Ab Windows 10 Insider Preview rufen Sie vor dem Zugriff auf den Standort des Benutzers die RequestAccessAsync auf. Zu diesem Zeitpunkt muss sich Ihre App im Vordergrund befinden, und RequestAccessAsync muss vom UI-Thread aufgerufen werden. Solange der Benutzer Ihrer App keinen Zugriff auf seine Position gewährt hat, kann Ihre App nicht auf Positionsdaten zugreifen.


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

Die RequestAccessAsync-Methode fordert vom Benutzer die Berechtigung für den Zugriff auf seine Position an. Der Benutzer wird nur einmal (pro App) aufgefordert. Nachdem die Berechtigung erstmalig gewährt oder verweigert wurde, fordert die Methode keine Berechtigung mehr an. Um dem Benutzer das Ändern von Positionsberechtigungen nach der Aufforderung zu erleichtern, empfehlen wir, einen Link zu den Positionseinstellungen bereitzustellen, wie weiter unten in diesem Thema beschrieben.

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

In diesem Beispiel wird eine switch-Anweisung mit accessStatus (aus dem vorherigen Beispiel) verwendet, die nur wirksam ist, wenn der Zugriff auf die Position gewährt wird. Sofern zulässig, werden vom Code ein Geolocator-Objekt erstellt, der Nachverfolgungstyp angegeben und eine Registrierung für Positionsupdates ausgeführt.

Das Geolocator-Objekt kann das PositionChanged-Ereignis basierend auf einer Positionsänderung (entfernungsbasierte Nachverfolgung) oder Zeitänderung (zeitraumbasierte Nachverfolgung) auslösen. Für die entfernungsbasierte Nachverfolgung legen Sie die MovementThreshold-Eigenschaft fest. Für die zeitraumbasierte Nachverfolgung legen Sie ReportInterval fest. Wenn keine der beiden Eigenschaften festgelegt wird, wird jede Sekunde eine Position zurückgegeben (äquivalent zu ReportInterval = 1000). Hier wird ein Berichtsintervall von zwei Sekunden verwendet.


switch (accessStatus)
{
    case GeolocationAccessStatus.Allowed:
        // Create Geolocator and define perodic-based tracking (2 second interval)
        _geolocator = new Geolocator { ReportInterval = 2000 };

        // Subscribe to 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("Unspecificed error!", NotifyType.ErrorMessage);
        LocationDisabledMessage.Visibility = Visibility.Collapsed;
        break;
}

Schritt 5: Behandeln von Positionsupdates

Das Geolocator-Objekt löst das PositionChanged-Ereignis aus, um anzugeben, dass sich die Benutzerposition geändert hat bzw. dass Zeit vergangen ist, je nachdem, welche Eigenschaft Sie konfiguriert haben. Das Ereignis übergibt die entsprechende Position über die Position-Argumenteigenschaft (vom Typ Geoposition). In diesem Beispiel wird die Methode nicht vom UI-Thread aufgerufen, die UI-Änderungen werden durch das Dispatcher-Objekt aufgerufen.


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

Schritt 6: Behandeln von Änderungen an Positionsberechtigungen

Das Geolocator-Objekt löst das StatusChanged-Ereignis aus, um anzugeben, dass sich die Positionseinstellungen des Benutzers geändert haben. Das Ereignis übergibt den entsprechenden Status über die Status-Argumenteigenschaft (vom Typ PositionStatus). Auch hier wird die Methode nicht vom UI-Thread aufgerufen, die UI-Änderungen werden durch das Dispatcher-Objekt aufgerufen.



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 cached location data if any
                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;
        }
    });
}

Schritt 7: Unterstützen des Benutzers beim Ändern von Positionseinstellungen

Wenn Ihre App gemäß den Positionseinstellungen nicht auf die Position des Benutzers zugreifen darf, wird empfohlen, einen praktischen 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 per Code zu starten. Weitere Informationen finden Sie unter So wird's gemacht: Starten der Einstellungs-App.


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

Verwandte Themen

Geolocation-Beispiel für Windows 10 Insider Preview
Geolocation-Beispiel für Windows 8.1
Bing Karten SDK – Beispiele
Windows.Devices.Geolocation
Richtlinien für die Verwendung von Geräten mit sensiblen Daten

 

 

Anzeigen:
© 2015 Microsoft