Partager via


Services d’emplacement sur Android

Ce guide présente la prise en charge de l’emplacement dans les applications Android et montre comment obtenir l’emplacement de l’utilisateur à l’aide de l’API Android Location Service, ainsi que le fournisseur d’emplacement fusionné disponible avec l’API Google Location Services.

Android permet d’accéder à diverses technologies d’emplacement telles que l’emplacement de tour de cellule, le Wi-Fi et le GPS. Les détails de chaque technologie d’emplacement sont extraits par le biais de fournisseurs d’emplacements, ce qui permet aux applications d’obtenir des emplacements de la même façon que le fournisseur utilisé. Ce guide présente le fournisseur d’emplacement fusionné, une partie des services Google Play, qui détermine intelligemment la meilleure façon d’obtenir l’emplacement des appareils en fonction des fournisseurs disponibles et de la façon dont l’appareil est utilisé. L’API Du service d’emplacement Android et montre comment communiquer avec le service d’emplacement système à l’aide d’un LocationManager. La deuxième partie du guide explore l’API Android Location Services à l’aide du LocationManager.

En règle générale, les applications doivent préférer utiliser le fournisseur d’emplacement fusionné, en revenir à l’ancienne API du service d’emplacement Android uniquement si nécessaire.

Notions de base de l’emplacement

Dans Android, quelle que soit l’API que vous choisissez pour l’utilisation des données d’emplacement, plusieurs concepts restent identiques. Cette section présente les fournisseurs d’emplacements et les autorisations relatives à l’emplacement.

Fournisseurs d’emplacement

Plusieurs technologies sont utilisées en interne pour identifier l’emplacement de l’utilisateur. Le matériel utilisé dépend du type de fournisseur d’emplacement sélectionné pour le travail de collecte de données. Android utilise trois fournisseurs d’emplacement :

  • Fournisseur GPS : GPS donne l’emplacement le plus précis, utilise la plus grande puissance et fonctionne le mieux à l’extérieur. Ce fournisseur utilise une combinaison de GPS et de GPS assistés (aGPS), qui retourne les données GPS collectées par les tours cellulaires.

  • Fournisseur de réseau : fournit une combinaison de données Wi-Fi et cellulaires, y compris les données aGPS collectées par les tours de cellules. Il utilise moins de puissance que le fournisseur GPS, mais retourne des données d’emplacement de précision variable.

  • Fournisseur passif : option « piggyback » utilisant des fournisseurs demandés par d’autres applications ou services pour générer des données d’emplacement dans une application. Il s’agit d’une option moins fiable mais d’économie d’énergie idéale pour les applications qui ne nécessitent pas de mises à jour constantes de localisation pour fonctionner.

Les fournisseurs d’emplacement ne sont pas toujours disponibles. Par exemple, nous souhaitons peut-être utiliser gps pour notre application, mais le GPS peut être désactivé dans Paramètres, ou l’appareil peut ne pas avoir du GPS du tout. Si un fournisseur spécifique n’est pas disponible, le choix de ce fournisseur peut retourner null.

Autorisations d’emplacement

Une application prenant en compte l’emplacement a besoin d’accéder aux capteurs matériels d’un appareil pour recevoir des données GPS, Wi-Fi et cellulaires. L’accès est contrôlé par le biais des autorisations appropriées dans le manifeste Android de l’application. Il existe deux autorisations disponibles : en fonction des exigences de votre application et de votre choix d’API, vous souhaitez en autoriser une :

  • ACCESS_FINE_LOCATION : permet à une application d’accéder au GPS. Obligatoire pour les options fournisseur GPS et fournisseur passif (le fournisseur passif doit être autorisé à accéder aux données GPS collectées par une autre application ou service). Autorisation facultative pour le fournisseur de réseau.

  • ACCESS_COARSE_LOCATION : permet à une application d’accéder à l’emplacement Cellulaire et Wi-Fi. Obligatoire pour le fournisseur de réseau s’il ACCESS_FINE_LOCATION n’est pas défini.

Pour les applications qui ciblent l’API version 21 (Android 5.0 Lollipop) ou ultérieure, vous pouvez activer ACCESS_FINE_LOCATION et toujours exécuter sur des appareils qui n’ont pas de matériel GPS. Si votre application nécessite du matériel GPS, vous devez ajouter explicitement un android.hardware.location.gps uses-feature élément au manifeste Android. Pour plus d’informations, consultez la référence de l’élément d’utilisation d’Android.

Pour définir les autorisations, développez le dossier Propriétés dans le Panneau Solution et double-cliquez sur AndroidManifest.xml. Les autorisations sont répertoriées sous Autorisations requises :

Capture d’écran des paramètres d’autorisations requises du manifeste Android

La définition de l’une de ces autorisations indique à Android que votre application a besoin d’une autorisation de l’utilisateur pour accéder aux fournisseurs d’emplacement. Les appareils qui exécutent le niveau d’API 22 (Android 5.1) ou inférieur demandent à l’utilisateur d’accorder ces autorisations chaque fois que l’application est installée. Sur les appareils exécutant le niveau d’API 23 (Android 6.0) ou version ultérieure, l’application doit effectuer une vérification des autorisations d’exécution avant d’effectuer une demande du fournisseur d’emplacement.

Remarque

Remarque : Le paramètre ACCESS_FINE_LOCATION implique l’accès aux données d’emplacement grossières et fines. Vous ne devez jamais avoir à définir les deux autorisations, seule l’autorisation minimale nécessaire à votre application pour fonctionner.

Cet extrait de code montre comment vérifier qu’une application dispose d’une autorisation pour l’autorisation ACCESS_FINE_LOCATION :

 if (ContextCompat.CheckSelfPermission(this, Manifest.Permission.AccessFineLocation) == Permission.Granted)
{
    StartRequestingLocationUpdates();
    isRequestingLocationUpdates = true;
}
else
{
    // The app does not have permission ACCESS_FINE_LOCATION 
}

Les applications doivent être tolérantes au scénario dans lequel l’utilisateur n’accorde pas d’autorisation (ou a révoqué l’autorisation) et dispose d’un moyen de traiter correctement cette situation. Pour plus d’informations sur l’implémentation des vérifications d’autorisation au moment de l’exécution, consultez le guide des autorisations dans Xamarin.Android.

Utilisation du fournisseur d’emplacement fusionné

Le fournisseur d’emplacement fusionné est le moyen préféré pour les applications Android de recevoir les mises à jour d’emplacement de l’appareil, car il sélectionne efficacement le fournisseur d’emplacement pendant l’exécution pour fournir les meilleures informations d’emplacement de manière efficace sur la batterie. Par exemple, un utilisateur se promenant à l’extérieur obtient le meilleur emplacement de lecture avec GPS. Si l’utilisateur marche ensuite à l’intérieur, où le GPS fonctionne mal (le cas échéant), le fournisseur d’emplacement fusionné peut basculer automatiquement vers le Wi-Fi, ce qui fonctionne mieux à l’intérieur.

L’API fournisseur d’emplacement fusionné fournit un large éventail d’autres outils pour permettre aux applications prenant en charge l’emplacement, notamment la géofencing et la surveillance des activités. Dans cette section, nous allons nous concentrer sur les principes fondamentaux de la configuration, de l’établissement LocationClientdes fournisseurs et de l’obtention de l’emplacement de l’utilisateur.

Le fournisseur d’emplacement fusionné fait partie de Google Play Services. Le package Google Play Services doit être installé et configuré correctement dans l’application pour que l’API fournisseur d’emplacement fusionnée fonctionne, et l’appareil doit avoir installé l’APK google Play Services.

Avant qu’une application Xamarin.Android puisse utiliser le fournisseur d’emplacement fusionné, elle doit ajouter le package Xamarin.GooglePlayServices.Location au projet. En outre, les instructions suivantes using doivent être ajoutées à tous les fichiers sources qui référencent les classes décrites ci-dessous :

using Android.Gms.Common;
using Android.Gms.Location;

Vérification de l’installation de Google Play Services

Un Xamarin.Android se bloque s’il tente d’utiliser le fournisseur d’emplacement fusionné lorsque Google Play Services n’est pas installé (ou obsolète), une exception d’exécution se produit. Si Google Play Services n’est pas installé, l’application doit revenir au service d’emplacement Android décrit ci-dessus. Si Google Play Services est obsolète, l’application peut afficher un message à l’utilisateur lui demandant de mettre à jour la version installée de Google Play Services.

Cet extrait de code est un exemple de la façon dont une activité Android peut vérifier par programmation si Google Play Services est installé :

bool IsGooglePlayServicesInstalled()
{
    var queryResult = GoogleApiAvailability.Instance.IsGooglePlayServicesAvailable(this);
    if (queryResult == ConnectionResult.Success)
    {
        Log.Info("MainActivity", "Google Play Services is installed on this device.");
        return true;
    }

    if (GoogleApiAvailability.Instance.IsUserResolvableError(queryResult))
    {
        // Check if there is a way the user can resolve the issue
        var errorString = GoogleApiAvailability.Instance.GetErrorString(queryResult);
        Log.Error("MainActivity", "There is a problem with Google Play Services on this device: {0} - {1}",
                  queryResult, errorString);

        // Alternately, display the error to the user.
    }

    return false;
}

FusedLocationProviderClient

Pour interagir avec le fournisseur d’emplacement fusionné, une application Xamarin.Android doit avoir une instance du FusedLocationProviderClient. Cette classe expose les méthodes nécessaires pour s’abonner aux mises à jour d’emplacement et récupérer le dernier emplacement connu de l’appareil.

La OnCreate méthode d’une activité est un endroit approprié pour obtenir une référence à l’extrait FusedLocationProviderClientde code suivant :

public class MainActivity: AppCompatActivity
{
    FusedLocationProviderClient fusedLocationProviderClient;

    protected override void OnCreate(Bundle bundle) 
    {
        fusedLocationProviderClient = LocationServices.GetFusedLocationProviderClient(this);
    }
}

Obtention du dernier emplacement connu

La FusedLocationProviderClient.GetLastLocationAsync() méthode fournit un moyen simple et non bloquant pour une application Xamarin.Android d’obtenir rapidement le dernier emplacement connu de l’appareil avec une surcharge de codage minimale.

Cet extrait de code montre comment utiliser la GetLastLocationAsync méthode pour récupérer l’emplacement de l’appareil :

async Task GetLastLocationFromDevice()
{
    // This method assumes that the necessary run-time permission checks have succeeded.
    getLastLocationButton.SetText(Resource.String.getting_last_location);
    Android.Locations.Location location = await fusedLocationProviderClient.GetLastLocationAsync();

    if (location == null)
    {
        // Seldom happens, but should code that handles this scenario
    }
    else
    {
        // Do something with the location 
        Log.Debug("Sample", "The latitude is " + location.Latitude);
    }
}

Abonnement aux mises à jour d’emplacement

Une application Xamarin.Android peut également s’abonner aux mises à jour d’emplacement à partir du fournisseur d’emplacement fusionné à l’aide de la FusedLocationProviderClient.RequestLocationUpdatesAsync méthode, comme illustré dans cet extrait de code :

await fusedLocationProviderClient.RequestLocationUpdatesAsync(locationRequest, locationCallback);

Cette méthode prend deux paramètres :

  • Android.Gms.Location.LocationRequest : un LocationRequest objet est la façon dont une application Xamarin.Android transmet les paramètres sur le fonctionnement du fournisseur d’emplacement fusionné. Les LocationRequest données contiennent des informations telles que la fréquence à laquelle les demandes doivent être effectuées ou l’importance d’une mise à jour d’emplacement précise. Par exemple, une demande d’emplacement importante entraîne l’utilisation du GPS par l’appareil, et par conséquent plus de puissance, lors de la détermination de l’emplacement. Cet extrait de code montre comment créer un LocationRequest emplacement avec une précision élevée, en vérifiant environ toutes les cinq minutes pour une mise à jour d’emplacement (mais pas plus de deux minutes entre les requêtes). Le fournisseur d’emplacement fusionné utilise un LocationRequest guide pour le fournisseur d’emplacement à utiliser lors de la tentative de détermination de l’emplacement de l’appareil :

    LocationRequest locationRequest = new LocationRequest()
                                      .SetPriority(LocationRequest.PriorityHighAccuracy)
                                      .SetInterval(60 * 1000 * 5)
                                      .SetFastestInterval(60 * 1000 * 2);
    
  • Android.Gms.Location.LocationCallback : pour recevoir les mises à jour d’emplacement, une application Xamarin.Android doit sous-classer la LocationProvider classe abstraite. Cette classe a exposé deux méthodes qui peuvent être appelées par le fournisseur d’emplacement fusionné pour mettre à jour l’application avec des informations d’emplacement. Cela sera abordé plus en détail ci-dessous.

Pour notifier une application Xamarin.Android d’une mise à jour d’emplacement, le fournisseur d’emplacements fusionné appellera le LocationCallBack.OnLocationResult(LocationResult result). Le Android.Gms.Location.LocationResult paramètre contient les informations d’emplacement de mise à jour.

Lorsque le fournisseur d’emplacement fusionné détecte une modification de la disponibilité des données d’emplacement, il appelle la LocationProvider.OnLocationAvailability(LocationAvailability locationAvailability) méthode. Si la LocationAvailability.IsLocationAvailable propriété retourne true, il peut être supposé que les résultats de l’emplacement de l’appareil signalés par OnLocationResult sont aussi précis et aussi à jour que requis par le LocationRequest. Si IsLocationAvailable la valeur est false, aucun résultat d’emplacement ne sera retourné par OnLocationResult.

Cet extrait de code est un exemple d’implémentation de l’objet LocationCallback :

public class FusedLocationProviderCallback : LocationCallback
{
    readonly MainActivity activity;

    public FusedLocationProviderCallback(MainActivity activity)
    {
        this.activity = activity;
    }

    public override void OnLocationAvailability(LocationAvailability locationAvailability)
    {
        Log.Debug("FusedLocationProviderSample", "IsLocationAvailable: {0}",locationAvailability.IsLocationAvailable);
    }

    public override void OnLocationResult(LocationResult result)
    {
        if (result.Locations.Any())
        {
            var location = result.Locations.First();
            Log.Debug("Sample", "The latitude is :" + location.Latitude);
        }
        else
        {
            // No locations to work with.
        }
    }
}

Utilisation de l’API Du service d’emplacement Android

Le service d’emplacement Android est une API plus ancienne pour utiliser les informations d’emplacement sur Android. Les données d’emplacement sont collectées par des capteurs matériels et collectées par un service système, accessible dans l’application avec une classe et un LocationManager ILocationListener.

Le service d’emplacement convient le mieux aux applications qui doivent s’exécuter sur des appareils qui n’ont pas de services Google Play installés.

Le service d’emplacement est un type spécial de service géré par le système. Un service système interagit avec le matériel de l’appareil et est toujours en cours d’exécution. Pour accéder aux mises à jour d’emplacement dans notre application, nous vous abonnerons aux mises à jour d’emplacement à partir du service d’emplacement système à l’aide d’un appel et d’un LocationManager RequestLocationUpdates appel.

Pour obtenir l’emplacement de l’utilisateur à l’aide du service d’emplacement Android, vous devez effectuer plusieurs étapes :

  1. Obtenez une référence au LocationManager service.
  2. Implémentez l’interface ILocationListener et gérez les événements lorsque l’emplacement change.
  3. Utilisez les mises à jour d’emplacement pour demander des LocationManager mises à jour d’emplacement pour un fournisseur spécifié. L’étape ILocationListener précédente sera utilisée pour recevoir des rappels du LocationManager.
  4. Arrêtez les mises à jour d’emplacement lorsque l’application n’est plus appropriée pour recevoir des mises à jour.

Gestionnaire d’emplacements

Nous pouvons accéder au service d’emplacement système avec une instance de la LocationManager classe. LocationManager est une classe spéciale qui nous permet d’interagir avec le service d’emplacement système et d’appeler des méthodes dessus. Une application peut obtenir une référence à l’appel LocationManager GetSystemService et au passage d’un type de service, comme indiqué ci-dessous :

LocationManager locationManager = (LocationManager) GetSystemService(Context.LocationService);

OnCreate est un bon endroit pour obtenir une référence au LocationManager. Il est judicieux de conserver la LocationManager variable de classe en tant que variable de classe, afin que nous puissions l’appeler à différents points du cycle de vie de l’activité.

Demander des mises à jour d’emplacement à partir de LocationManager

Une fois l’application référencée LocationManager, elle doit indiquer le type d’informations d’emplacement requises et la LocationManager fréquence à laquelle ces informations doivent être mises à jour. Pour ce faire, appelez RequestLocationUpdates l’objet LocationManager et transmettez certains critères pour les mises à jour et un rappel qui recevra les mises à jour d’emplacement. Ce rappel est un type qui doit implémenter l’interface ILocationListener (décrit plus en détail plus loin dans ce guide).

La RequestLocationUpdates méthode indique au service d’emplacement système que votre application souhaite commencer à recevoir des mises à jour d’emplacement. Cette méthode vous permet de spécifier le fournisseur, ainsi que les seuils de temps et de distance pour contrôler la fréquence de mise à jour. Par exemple, la méthode ci-dessous demande des mises à jour d’emplacement du fournisseur d’emplacement GPS toutes les 2 000 millisecondes, et uniquement lorsque l’emplacement change de plus de 1 mètre :

// For this example, this method is part of a class that implements ILocationListener, described below
locationManager.RequestLocationUpdates(LocationManager.GpsProvider, 2000, 1, this);

Une application doit demander des mises à jour d’emplacement uniquement aussi souvent que nécessaire pour que l’application fonctionne correctement. Cela permet de préserver la durée de vie de la batterie et de créer une meilleure expérience pour l’utilisateur.

Réponse aux mises à jour à partir de LocationManager

Une fois qu’une application a demandé des mises à jour à partir du LocationManagerservice, elle peut recevoir des informations du service en implémentant l’interface ILocationListener . Cette interface fournit quatre méthodes pour écouter le service d’emplacement et le fournisseur d’emplacement. OnLocationChanged Le système appelle OnLocationChanged lorsque l’emplacement de l’utilisateur change suffisamment pour être qualifié de changement d’emplacement en fonction des critères définis lors de la demande de mises à jour de l’emplacement.

Le code suivant montre les méthodes de l’interface ILocationListener :

public class MainActivity : AppCompatActivity, ILocationListener
{
    TextView latitude;
    TextView longitude;
    
    public void OnLocationChanged (Location location)
    {
        // called when the location has been updated.
    }
    
    public OnProviderDisabled(string locationProvider)
    {
        // called when the user disables the provider
    }
    
    public OnProviderEnabled(string locationProvider)
    {
        // called when the user enables the provider
    }
    
    public OnStatusChanged(string locationProvider, Availability status, Bundle extras)
    {
        // called when the status of the provider changes (there are a variety of reasons for this)
    }
}

Désinscrire des mises à jour locationManager

Pour conserver les ressources système, une application doit se désabonner des mises à jour d’emplacement dès que possible. La RemoveUpdates méthode indique à l’arrêt de l’envoi LocationManager de mises à jour à notre application. Par exemple, une activité peut appeler RemoveUpdates dans la méthode afin que nous puissions conserver la OnPause puissance si une application n’a pas besoin de mises à jour d’emplacement alors que son activité n’est pas à l’écran :

protected override void OnPause ()
{
    base.OnPause ();
    locationManager.RemoveUpdates (this);
}

Si votre application doit obtenir des mises à jour d’emplacement en arrière-plan, vous devez créer un service personnalisé qui s’abonne au service d’emplacement système. Pour plus d’informations, consultez le guide d’arrière-plan des services Android.

Détermination du meilleur fournisseur d’emplacement pour LocationManager

L’application ci-dessus définit le GPS comme fournisseur d’emplacement. Toutefois, le GPS peut ne pas être disponible dans tous les cas, par exemple si l’appareil est à l’intérieur ou n’a pas de récepteur GPS. Si c’est le cas, le résultat est un null retour pour le fournisseur.

Pour que votre application fonctionne quand le GPS n’est pas disponible, vous utilisez la GetBestProvider méthode pour demander le meilleur fournisseur d’emplacement disponible (pris en charge par l’appareil et activé par l’utilisateur) au lancement de l’application. Au lieu de passer un fournisseur spécifique, vous pouvez indiquer GetBestProvider les exigences du fournisseur , telles que la précision et la puissance , avec un Criteria objet. GetBestProvider retourne le meilleur fournisseur pour les critères donnés.

Le code suivant montre comment obtenir le meilleur fournisseur disponible et l’utiliser lors de la demande de mises à jour d’emplacement :

Criteria locationCriteria = new Criteria();   
locationCriteria.Accuracy = Accuracy.Coarse;
locationCriteria.PowerRequirement = Power.Medium;

locationProvider = locationManager.GetBestProvider(locationCriteria, true);

if(locationProvider != null)
{
    locationManager.RequestLocationUpdates (locationProvider, 2000, 1, this);
}
else
{
    Log.Info(tag, "No location providers available");
}

Remarque

Si l’utilisateur a désactivé tous les fournisseurs d’emplacement, GetBestProvider retourne null. Pour voir comment ce code fonctionne sur un appareil réel, veillez à activer gps, Wi-Fi et réseaux cellulaires sous le mode d’emplacement > des paramètres > Google, comme illustré dans cette capture d’écran :

Écran Mode d’emplacement des paramètres sur un téléphone Android

La capture d’écran ci-dessous illustre l’application d’emplacement en cours d’exécution à l’aide GetBestProviderde :

Application GetBestProvider affichant la latitude, la longitude et le fournisseur

N’oubliez pas que GetBestProvider le fournisseur ne change pas dynamiquement. Il détermine plutôt le meilleur fournisseur disponible une fois pendant le cycle de vie de l’activité. Si l’état du fournisseur change une fois qu’il a été défini, l’application nécessite du code supplémentaire dans les ILocationListener méthodes ( OnProviderEnabledet OnProviderDisabledOnStatusChanged – pour gérer toutes les possibilités liées au commutateur de fournisseur.

Résumé

Ce guide a abordé l’obtention de l’emplacement de l’utilisateur à l’aide du service d’emplacement Android et du fournisseur d’emplacement fusionné à partir de l’API Google Location Services.