Demander des mises à jour de la position géographique

Une utilisation appropriée des informations de localisation peut être bénéfique pour les utilisateurs de votre application. Ainsi, si votre application les aide à trouver leur chemin lorsqu'ils circulent à pied ou en voiture, ou si elle suit la position des ressources, elle doit obtenir la position de l'appareil à intervalles réguliers. Outre l'emplacement géographique (latitude et longitude), vous pouvez donner à l'utilisateur des informations telles que le relèvement (direction horizontale du déplacement), l'altitude ou encore la vitesse de l'appareil. Ces informations, ainsi que d'autres, sont disponibles dans l'objet Location que votre application peut récupérer auprès de l'API Fused Location Provider. En réponse, l'API met régulièrement à jour votre application avec la meilleure position disponible, en fonction des fournisseurs de position disponibles tels que le Wi-Fi et le GPS (Global Positioning System). La précision de la position dépend des fournisseurs, des autorisations d'accès à la position que vous avez demandées et des options que vous avez définies dans la requête de localisation.

Cette leçon vous explique comment demander des mises à jour régulières de la position d'un appareil à l'aide de la méthode requestLocationUpdates() dans Fused Location Provider.

Obtenir la dernière position connue

La dernière position connue de l'appareil constitue un bon point de départ. Elle garantit que l'application dispose d'une position connue avant de commencer les mises à jour régulières de la position. La leçon Obtenir la dernière position connue vous explique comment obtenir la dernière position connue en appelant getLastLocation(). Les extraits des sections suivantes partent du principe que votre application a déjà récupéré la dernière position connue et l'a stockée en tant qu'objet Location dans la variable globale mCurrentLocation.

Effectuer une requête de localisation

Avant de demander des mises à jour de la position, votre application doit se connecter aux services de localisation et effectuer une requête localisation. Pour savoir comment procéder, consultez la leçon Modifier les paramètres de localisation. Une fois qu'une requête de localisation a été créée, vous pouvez commencer les mises à jour régulières en appelant requestLocationUpdates().

Selon la forme de la requête, l'API Fused Location Provider peut soit appeler la méthode de rappel LocationCallback.onLocationResult() et lui transmettre une liste d'objets Location, soit émettre un PendingIntent contenant la position dans ses données étendues. La précision et la fréquence des mises à jour dépendent des autorisations d'accès à la position que vous avez demandées et des options que vous avez définies dans l'objet de requête de localisation.

Cette leçon vous explique comment obtenir la mise à jour à l'aide de l'approche de rappel LocationCallback. Appelez requestLocationUpdates() en lui transmettant votre instance de l'objet LocationRequest et LocationCallback. Définissez une méthode startLocationUpdates() comme indiqué dans l'exemple de code suivant :

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

private fun startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper())
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

private void startLocationUpdates() {
    fusedLocationClient.requestLocationUpdates(locationRequest,
            locationCallback,
            Looper.getMainLooper());
}

Notez que l'extrait de code ci-dessus fait référence à un indicateur booléen, requestingLocationUpdates, utilisé pour déterminer si l'utilisateur a activé ou désactivé les mises à jour de la position. Si l'utilisateur a désactivé ces mises à jour, vous pouvez l'informer des exigences de votre application concernant la localisation. Pour savoir comment conserver la valeur de l'indicateur booléen entre les instances de l'activité, consultez Enregistrer l'état de l'activité.

Définir le rappel de mise à jour de la position

L'API Fused Location Provider appelle la méthode de rappel LocationCallback.onLocationResult(). L'argument entrant contient une liste d'objets Location avec la latitude et la longitude du lieu. L'extrait de code suivant montre comment implémenter l'interface LocationCallback et définir la méthode, puis obtenir le code temporel de la mise à jour de la position, et afficher la latitude, la longitude et le code temporel sur l'interface utilisateur de votre application :

Kotlin

private lateinit var locationCallback: LocationCallback

// ...

override fun onCreate(savedInstanceState: Bundle?) {
    // ...

    locationCallback = object : LocationCallback() {
        override fun onLocationResult(locationResult: LocationResult?) {
            locationResult ?: return
            for (location in locationResult.locations){
                // Update UI with location data
                // ...
            }
        }
    }
}

Java

private LocationCallback locationCallback;

// ...

@Override
protected void onCreate(Bundle savedInstanceState) {
    // ...

    locationCallback = new LocationCallback() {
        @Override
        public void onLocationResult(LocationResult locationResult) {
            if (locationResult == null) {
                return;
            }
            for (Location location : locationResult.getLocations()) {
                // Update UI with location data
                // ...
            }
        }
    };
}

Arrêter les mises à jour de la position

Vous pouvez choisir d'arrêter les mises à jour de la position lorsque l'activité n'est plus active, c'est-à-dire lorsque l'utilisateur bascule, par exemple, vers une autre application ou vers une autre activité dans la même application. Cela peut s'avérer utile pour réduire la consommation d'énergie, à condition que l'application ne doive pas collecter d'informations, même lorsqu'elle s'exécute en arrière-plan. Cette section vous explique comment arrêter les mises à jour dans la méthode onPause() de l'activité.

Pour arrêter les mises à jour de la position, appelez removeLocationUpdates() en lui transmettant un LocationCallback, comme indiqué dans l'exemple de code ci-dessous :

Kotlin

override fun onPause() {
    super.onPause()
    stopLocationUpdates()
}

private fun stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback)
}

Java

@Override
protected void onPause() {
    super.onPause();
    stopLocationUpdates();
}

private void stopLocationUpdates() {
    fusedLocationClient.removeLocationUpdates(locationCallback);
}

Utilisez une valeur booléenne, requestingLocationUpdates, pour déterminer si les mises à jour de la position sont actuellement activées. Dans la méthode onResume() de l'activité, vérifiez si les mises à jour de la position sont actives. Si elles ne le sont pas, activez-les :

Kotlin

override fun onResume() {
    super.onResume()
    if (requestingLocationUpdates) startLocationUpdates()
}

Java

@Override
protected void onResume() {
    super.onResume();
    if (requestingLocationUpdates) {
        startLocationUpdates();
    }
}

Enregistrer l'état de l'activité

Une modification de la configuration de l'appareil, telle qu'un changement d'orientation ou de langue, peut entraîner la destruction de l'activité en cours. Votre application doit donc stocker toutes les informations dont elle a besoin pour recréer l'activité. Pour ce faire, vous pouvez, par exemple, utiliser un état d'instance stocké dans un objet Bundle.

L'exemple de code suivant montre comment utiliser le rappel onSaveInstanceState() de l'activité pour enregistrer l'état d'instance :

Kotlin

override fun onSaveInstanceState(outState: Bundle?) {
    outState?.putBoolean(REQUESTING_LOCATION_UPDATES_KEY, requestingLocationUpdates)
    super.onSaveInstanceState(outState)
}

Java

@Override
protected void onSaveInstanceState(Bundle outState) {
    outState.putBoolean(REQUESTING_LOCATION_UPDATES_KEY,
            requestingLocationUpdates);
    // ...
    super.onSaveInstanceState(outState);
}

Définissez une méthode updateValuesFromBundle() pour restaurer les valeurs enregistrées à partir de l'instance précédente de l'activité, si elles sont disponibles. Appelez la méthode à partir de la méthode onCreate() de l'activité, comme indiqué dans l'exemple de code suivant :

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    updateValuesFromBundle(savedInstanceState)
}

private fun updateValuesFromBundle(savedInstanceState: Bundle?) {
    savedInstanceState ?: return

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY)
    }

    // ...

    // Update UI to match restored state
    updateUI()
}

Java

@Override
public void onCreate(Bundle savedInstanceState) {
    // ...
    updateValuesFromBundle(savedInstanceState);
}

private void updateValuesFromBundle(Bundle savedInstanceState) {
    if (savedInstanceState == null) {
        return;
    }

    // Update the value of requestingLocationUpdates from the Bundle.
    if (savedInstanceState.keySet().contains(REQUESTING_LOCATION_UPDATES_KEY)) {
        requestingLocationUpdates = savedInstanceState.getBoolean(
                REQUESTING_LOCATION_UPDATES_KEY);
    }

    // ...

    // Update UI to match restored state
    updateUI();
}

Pour savoir comment enregistrer un état d'instance, consultez la documentation de référence de la classe Activité Android.

Remarque : Pour un stockage plus persistant, vous pouvez stocker les préférences de l'utilisateur dans l'objet SharedPreferences de votre application. Définissez la préférence partagée dans la méthode onPause() de votre activité, puis récupérez-la dans onResume(). Pour savoir comment enregistrer des préférences, consultez Enregistrer des ensembles de clés-valeurs.

Ressources supplémentaires

Pour en savoir plus, consultez les ressources suivantes :

Exemples

  • Application exemple pour démontrer comment recevoir des notifications de position sur Android