Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
Pomocí rozhraní API Windows.Devices.Geolocation můžete v aplikaci pro Windows App SDK (WinUI 3) zjistit zeměpisnou polohu zařízení. Můžete získat jednorázovou opravu polohy nebo sledovat pozici uživatele v průběhu času. Tento článek se zabývá zpracováním oprávnění, jednorázovým a nepřetržitým čtením umístění a informacemi o tom, jak aktualizovat uživatelské rozhraní při změně umístění.
Note
Rozhraní API Windows.Devices.Geolocation jsou rozhraní API prostředí Windows Runtime (WinRT), která fungují jak v aplikacích UWP, tak i v desktopových aplikacích WinUI 3. Kód v tomto článku používá vzory WinUI 3 (například DispatcherQueue pro zařazování vláken).
Předpoklady
- Projekt WinUI 3 vytvořený ze šablony Blank App, Packaged (WinUI 3 in Desktop).
- Funkce Umístění deklarovaná v manifestu balíčku (viz Povolení funkce umístění).
Povolit funkci určování polohy
Vaše aplikace musí před přístupem k pozici uživatele deklarovat funkci Umístění .
- V Průzkumník řešení poklikejte na Package.appxmanifest a vyberte kartu Schopnosti.
- Zaškrtněte políčko „Umístění“.
Tím se do manifestu přidá následující položka:
<Capabilities>
<DeviceCapability Name="location"/>
</Capabilities>
Tip
U rozbalených aplikací se v manifestu nevyžaduje funkce Umístění. Přesto ale musíte volat RequestAccessAsync a vyzvat uživatele k zadání oprávnění.
Získání aktuálního umístění
Pokud chcete provést jednorázové čtení, postupujte podle těchto kroků.
Žádost o přístup k umístění uživatele
Před přístupem k datům o poloze zavolejte Geolocator.RequestAccessAsync . Tato metoda při prvním spuštění vyzve uživatele k udělení oprávnění. Musíte ho volat z vlákna uživatelského rozhraní, když je vaše aplikace v popředí.
using Windows.Devices.Geolocation;
var accessStatus = await Geolocator.RequestAccessAsync();
Načíst polohu
Pokud uživatel udělí oprávnění, vytvořte geolokátor a zavolejte GetGeopositionAsync , abyste získali jednorázovou opravu pozice.
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;
}
Sledování polohy uživatele v průběhu času
Pokud chcete dostávat pravidelné aktualizace polohy, přihlaste se k odběru události PositionChanged . Nastavte ReportInterval pro sledování podle času nebo MovementThreshold pro sledování na základě vzdálenosti.
if (accessStatus == GeolocationAccessStatus.Allowed)
{
var geolocator = new Geolocator { ReportInterval = 2000 }; // 2-second interval
geolocator.PositionChanged += OnPositionChanged;
geolocator.StatusChanged += OnStatusChanged;
}
Zpracování aktualizací pozice
Událost PositionChanged se aktivuje na vlákně na pozadí. Slouží DispatcherQueue k zařazování aktualizací uživatelského rozhraní zpět do hlavního vlákna.
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}";
});
}
Zpracovat změny stavu
Sledujte StatusChanged, abyste zjistili, kdy uživatel zakáže služby určování polohy nebo dojde ke ztrátě signálu 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;
}
});
}
Nasměrovat uživatele na nastavení polohy
Pokud uživatel odepře přístup k poloze, zadejte odkaz na nastavení ochrany osobních údajů Windows, aby mohl změnit předvolby.
<HyperlinkButton Content="Open location settings"
NavigateUri="ms-settings:privacy-location" />
Stránku nastavení můžete otevřít také z kódu:
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
Zobrazit umístění na mapě
Po načtení pozice ji můžete zobrazit na WinUI 3 MapControl nastavením Center a přidáním MapIcon. Kompletní funkční příklad, který kombinuje geolokaci, zobrazení mapy a geofencing, najdete v přehledu map a umístění.
Troubleshooting
Pokud vaše aplikace nemůže získat polohu, zkontrolujte následující v Nastavení > Soukromí a zabezpečení > Poloha:
- Služba zjišťování polohy je zapnutá.
- Vaše aplikace je uvedená a nastavená na Zapnuto v části Povolit aplikacím přístup k vaší poloze.
- Zařízení má funkční přijímač GPS nebo je k dispozici určování polohy pomocí sítě.
Související články
Windows developer