Remarque
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
Utilisez le Windows. API Devices.Geolocation pour détecter la position géographique de l'appareil dans une application SDK d'application Windows (WinUI 3). Vous pouvez obtenir un correctif d’emplacement unique ou suivre la position de l’utilisateur au fil du temps. Cet article traite de la gestion des autorisations, des lectures ponctuelles et continues des emplacements et explique comment mettre à jour votre interface utilisateur lorsque l’emplacement change.
Note
Les Windows.Devices.Geolocation API sont des API Windows Runtime (WinRT) qui fonctionnent à la fois dans les applications de bureau UWP et WinUI 3. Le code de cet article utilise des modèles WinUI 3 (tels que DispatcherQueue pour le marshaling de threads).
Prerequisites
- Un projet WinUI 3 créé à partir du modèle Application vide, empaquetée (WinUI 3 dans Desktop).
- Fonctionnalité d’emplacement déclarée dans le manifeste du package (voir Activer la fonctionnalité d’emplacement).
Activer la fonctionnalité d’emplacement
Votre application doit déclarer la fonctionnalité Emplacement avant de pouvoir accéder à la position de l’utilisateur.
- Dans Explorateur de solutions, double-cliquez sur Package.appxmanifest et sélectionnez l’onglet Fonctionnalités.
- Cochez la case pour l’emplacement.
Cela ajoute l’entrée suivante au manifeste :
<Capabilities>
<DeviceCapability Name="location"/>
</Capabilities>
Tip
Pour les applications non empaquetées, la fonctionnalité Emplacement n’est pas nécessaire dans un manifeste. Toutefois, vous devez toujours appeler RequestAccessAsync pour demander l’autorisation à l’utilisateur.
Obtenir l’emplacement actuel
Suivez ces étapes pour effectuer une lecture ponctuelle de la position.
Demander l’accès à l’emplacement de l’utilisateur
Appelez Geolocator.RequestAccessAsync avant d’accéder aux données d’emplacement. Cette méthode invite l’utilisateur à obtenir l’autorisation la première fois qu’il s’exécute. Vous devez l’appeler à partir du thread d’interface utilisateur pendant que votre application est au premier plan.
using Windows.Devices.Geolocation;
var accessStatus = await Geolocator.RequestAccessAsync();
Lire la position
Si l’utilisateur accorde l’autorisation, créez un Geolocator et appelez GetGeopositionAsync pour obtenir un correctif de position unique.
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;
}
Suivre l’emplacement de l’utilisateur au fil du temps
Pour recevoir des mises à jour d’emplacement périodiques, abonnez-vous à l’événement PositionChanged . Définissez ReportInterval pour le suivi basé sur le temps ou MovementThreshold pour le suivi basé sur la distance.
if (accessStatus == GeolocationAccessStatus.Allowed)
{
var geolocator = new Geolocator { ReportInterval = 2000 }; // 2-second interval
geolocator.PositionChanged += OnPositionChanged;
geolocator.StatusChanged += OnStatusChanged;
}
Gérer les mises à jour de position
L’événement PositionChanged se déclenche sur un thread d’arrière-plan. Utilisez DispatcherQueue pour rediriger les mises à jour de l’interface utilisateur vers le thread principal.
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}";
});
}
Gérer les modifications d’état
Surveillez StatusChanged pour détecter quand l’utilisateur désactive les services d’emplacement ou si le signal GPS est perdu.
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;
}
});
}
Diriger l’utilisateur vers les paramètres d’emplacement
Si l’utilisateur refuse l’accès à l’emplacement, fournissez un lien vers les paramètres de confidentialité Windows afin qu’il puisse modifier sa préférence.
<HyperlinkButton Content="Open location settings"
NavigateUri="ms-settings:privacy-location" />
Vous pouvez également ouvrir la page des paramètres à partir du code :
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
Afficher l’emplacement sur une carte
Après avoir récupéré une position, vous pouvez l’afficher sur un MapControl WinUI 3 en lui définissant Center et en ajoutant un MapIcon. Pour obtenir un exemple de travail complet qui combine la géolocalisation, l’affichage de carte et la géofencing, consultez la vue d’ensemble des cartes et de l’emplacement.
Résolution des problèmes
Si votre application ne peut pas récupérer un emplacement, vérifiez ce qui suit dans Paramètres > confidentialité et emplacement de sécurité >:
- Les services de localisationsont activés.
- Votre application est répertoriée et définie sur Activé sous Autoriser les applications à accéder à votre emplacement.
- L’appareil dispose d’un récepteur GPS opérationnel ou d’un positionnement basé sur le réseau.
Articles connexes
Windows developer