Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Verwenden Sie die Windows. Devices.Geolocation-APIs zum Erkennen der geografischen Position des Geräts in einer Windows App SDK (WinUI 3)-App. Sie können eine Einmalige Standortkorrektur erhalten oder die Position des Benutzers im Laufe der Zeit nachverfolgen. Dieser Artikel behandelt den Umgang mit Berechtigungen, das einmalige und kontinuierliche Abrufen des Standorts sowie die Aktualisierung Ihrer Benutzeroberfläche bei Standortänderungen.
Note
Die Windows.Devices.Geolocation APIs sind Windows-Runtime (WinRT)-APIs, die sowohl in UWP- als auch winUI 3-Desktop-Apps funktionieren. Der Code in diesem Artikel verwendet WinUI 3-Muster (wie z. B. DispatcherQueue für das Thread-Marshaling).
Voraussetzungen
- Ein WinUI 3-Projekt, das aus der Vorlage "Leere App, Verpackt" (WinUI 3 in Desktop) erstellt wurde.
- Die im Paketmanifest deklarierte Standortfunktion (siehe Aktivieren der Standortfunktion).
Aktivieren der Standortfunktion
Ihre App muss die Standortfunktion deklarieren, bevor sie auf die Position des Benutzers zugreifen kann.
- Doppelklicken Sie in Projektmappen-Explorer auf "Package.appxmanifest", und wählen Sie die Registerkarte "Funktionen" aus.
- Aktivieren Sie das Kontrollkästchen für "Speicherort".
Dadurch wird dem Manifest der folgende Eintrag hinzugefügt:
<Capabilities>
<DeviceCapability Name="location"/>
</Capabilities>
Tip
Bei entpackten Apps ist die Standortfunktion in einem Manifest nicht erforderlich. Sie müssen jedoch weiterhin RequestAccessAsync aufrufen, um den Benutzer zur Berechtigung aufzufordern.
Aktuellen Standort abrufen
Führen Sie die folgenden Schritte aus, um eine einmalige Positionsabfrage durchzuführen.
Anfordern des Zugriffs auf den Standort des Benutzers
Rufen Sie Geolocator.RequestAccessAsync auf, bevor Sie auf Standortdaten zugreifen. Diese Methode bittet den Benutzer bei der ersten Ausführung um Erlaubnis. Sie müssen ihn aus dem UI-Thread aufrufen, während sich Ihre App im Vordergrund befindet.
using Windows.Devices.Geolocation;
var accessStatus = await Geolocator.RequestAccessAsync();
Position lesen
Wenn der Benutzer die Berechtigung erteilt, erstellen Sie einen Geolocator , und rufen Sie GetGeopositionAsync auf, um eine einmalige Positionskorrektur zu erhalten.
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;
}
Nachverfolgen des Standorts des Benutzers im Laufe der Zeit
Um regelmäßige Positionsupdates zu erhalten, abonnieren Sie das PositionChanged-Ereignis . Legen Sie ReportInterval für zeitbasierte Nachverfolgung oder MovementThreshold für die entfernungsbasierte Nachverfolgung fest.
if (accessStatus == GeolocationAccessStatus.Allowed)
{
var geolocator = new Geolocator { ReportInterval = 2000 }; // 2-second interval
geolocator.PositionChanged += OnPositionChanged;
geolocator.StatusChanged += OnStatusChanged;
}
Positionsaktualisierungen verarbeiten
Das PositionChanged Ereignis wird in einem Hintergrundthread ausgelöst. Verwenden Sie DispatcherQueue, um UI-Aktualisierungen wieder an den Hauptthread zu übergeben.
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}";
});
}
Behandeln von Statusänderungen
Überwachen Sie StatusChanged , um zu erkennen, wenn der Benutzer Standortdienste deaktiviert oder das GPS-Signal verloren geht.
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;
}
});
}
Leiten sie den Benutzer an die Standorteinstellungen weiter
Wenn der Benutzer den Standortzugriff verweigert, stellen Sie einen Link zu den Windows Datenschutzeinstellungen bereit, damit er seine Einstellung ändern kann.
<HyperlinkButton Content="Open location settings"
NavigateUri="ms-settings:privacy-location" />
Sie können die Einstellungsseite auch über Code öffnen:
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
Anzeigen der Position auf einer Karte
Nachdem Sie eine Position abgerufen haben, können Sie sie in einem WinUI 3 MapControl anzeigen, indem Sie Center festlegen und MapIcon hinzufügen. Ein vollständiges Arbeitsbeispiel, das Geolocation, Kartenanzeige und Geofencing kombiniert, finden Sie unter " Karten und Standortübersicht".
Troubleshooting
Wenn Ihre App keinen Standort abrufen kann, überprüfen Sie Folgendes unter Einstellungen > Datenschutz & Sicherheit > Standort:
- Standortdienstesind aktiviert.
- Ihre App ist aufgelistet und unter Apps den Zugriff auf Ihren Standort erlauben auf Ein eingestellt.
- Das Gerät verfügt über einen funktionierenden GPS-Empfänger oder eine netzwerkbasierte Positionierung.
Verwandte Artikel
Windows developer