0Pricing
Android Academy · Leçon

Obtenir la position de l’utilisateur

Principes du fournisseur de position fusionnée.

Obtenir la position de l’utilisateur est une leçon Android Academy gratuite sur CoddyKit. Ceci est la leçon 2 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Android Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Android Academy comprend 4 leçons au total.

Où est l'utilisateur ?

La plupart des applications utilisant la localisation commencent par une question : où se trouve l'appareil en ce moment ? Android répond à cette question grâce au Fused Location Provider, qui fait partie des services Google Play.

Dans cette leçon, vous ajouterez la dépendance, demanderez une position unique, écouterez les mises à jour continues et afficherez le résultat dans Compose.

Pourquoi utiliser le fournisseur fusionné

Android dispose de plusieurs sources de localisation : GPS, Wi-Fi et antennes-relais. Le Fused Location Provider les combine intelligemment pour fournir la meilleure position tout en consommant le moins de batterie possible.

Vous n'utilisez presque plus jamais directement LocationManager : le client fusionné est plus simple et plus intelligent.

// build.gradle.kts (module)
dependencies {
    implementation("com.google.android.gms:play-services-location:21.3.0")
}

Déclarer l'autorisation

La localisation est une ressource sensible. Déclarez l'autorisation dans votre AndroidManifest.xml. Utilisez ACCESS_FINE_LOCATION pour une position précise ou ACCESS_COARSE_LOCATION pour une position approximative.

La déclarer n'est que la première étape : vous devez également la demander lors de l'exécution (ce point sera abordé dans une prochaine leçon).

<!-- AndroidManifest.xml -->
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

Créer le client fusionné

Obtenez un FusedLocationProviderClient depuis LocationServices. Dans Compose, récupérez le contexte avec LocalContext.current et mémorisez le client afin qu'il ne soit pas recréé à chaque recomposition.

import com.google.android.gms.location.LocationServices

@Composable
fun rememberFusedClient() = run {
    val context = LocalContext.current
    remember {
        LocationServices.getFusedLocationProviderClient(context)
    }
}

Récupérer la dernière position connue

La réponse la plus rapide est lastLocation : la position la plus récente déjà mise en cache par le système. Elle renvoie une Task, à laquelle vous devez donc associer un écouteur de réussite.

Elle peut être null si aucune application n'a demandé de position récemment ; vérifiez donc toujours la valeur nulle.

@SuppressLint("MissingPermission")
fun fetchLastLocation(
    client: FusedLocationProviderClient,
    onResult: (Location?) -> Unit
) {
    client.lastLocation
        .addOnSuccessListener { location -> onResult(location) }
        .addOnFailureListener { onResult(null) }
}

Attendre la tâche avec les coroutines

Les rappels s'imbriquent rapidement. La bibliothèque kotlinx-coroutines-play-services ajoute .await(), ce qui vous permet de lire une position avec un code suspendu clair.

import kotlinx.coroutines.tasks.await

@SuppressLint("MissingPermission")
suspend fun currentLastLocation(
    client: FusedLocationProviderClient
): Location? {
    return client.lastLocation.await()
}

Demander une position récente

lastLocation peut être obsolète. Pour obtenir une position à jour, appelez getCurrentLocation avec une priorité. PRIORITY_HIGH_ACCURACY utilise le GPS ; PRIORITY_BALANCED_POWER_ACCURACY économise la batterie.

import com.google.android.gms.location.Priority
import com.google.android.gms.location.CurrentLocationRequest

@SuppressLint("MissingPermission")
suspend fun freshLocation(
    client: FusedLocationProviderClient
): Location? {
    val request = CurrentLocationRequest.Builder()
        .setPriority(Priority.PRIORITY_HIGH_ACCURACY)
        .build()
    return client.getCurrentLocation(request, null).await()
}

Mises à jour continues de la position

Pour la navigation ou le suivi, vous avez besoin d'un flux de mises à jour. Construisez une LocationRequest avec un intervalle, puis enregistrez un LocationCallback via requestLocationUpdates.

Arrêtez toujours les mises à jour lorsque vous avez terminé afin d'économiser la batterie.

import com.google.android.gms.location.LocationRequest
import com.google.android.gms.location.LocationResult
import com.google.android.gms.location.LocationCallback

val request = LocationRequest.Builder(
    Priority.PRIORITY_HIGH_ACCURACY,
    5000L // 5 seconds
).build()

val callback = object : LocationCallback() {
    override fun onLocationResult(result: LocationResult) {
        result.lastLocation?.let { /* use it */ }
    }
}

Les mises à jour sous forme de flux

Une approche claire consiste à encapsuler les mises à jour dans un callbackFlow : les consommateurs collectent les positions, et les mises à jour s'arrêtent automatiquement lorsque la collecte se termine via awaitClose.

import kotlinx.coroutines.channels.awaitClose
import kotlinx.coroutines.flow.callbackFlow

@SuppressLint("MissingPermission")
fun FusedLocationProviderClient.locationFlow(request: LocationRequest) = callbackFlow {
    val cb = object : LocationCallback() {
        override fun onLocationResult(result: LocationResult) {
            result.lastLocation?.let { trySend(it) }
        }
    }
    requestLocationUpdates(request, cb, Looper.getMainLooper())
    awaitClose { removeLocationUpdates(cb) }
}

Afficher la position dans Compose

Collectez le résultat dans un composable en utilisant LaunchedEffect pour une lecture unique, ou collectAsStateWithLifecycle pour un flux. Affichez ensuite les coordonnées.

@Composable
fun LocationLabel(client: FusedLocationProviderClient) {
    var location by remember { mutableStateOf<Location?>(null) }
    LaunchedEffect(Unit) {
        location = freshLocation(client)
    }
    Text(
        location?.let { "Lat ${it.latitude}, Lng ${it.longitude}" }
            ?: "Locating..."
    )
}

Compromis entre batterie et précision

La localisation est l'une des fonctions les plus gourmandes en batterie dans les applications mobiles. Choisissez la précision la plus faible qui répond à vos besoins, utilisez l'intervalle de mise à jour le plus long acceptable et arrêtez toujours les mises à jour lorsque l'écran n'est plus affiché.

Une précision élevée associée à des mises à jour fréquentes décharge rapidement la batterie : réservez cette configuration à la navigation active.

Vérification rapide

Vous avez besoin immédiatement de la position actuelle la plus précise possible, en utilisant une fonction suspendue. Quelle approche convient le mieux ?

Récapitulatif

Vous savez maintenant lire la position de l'appareil :

  • Ajoutez play-services-location et déclarez ACCESS_FINE/COARSE_LOCATION.
  • Obtenez un FusedLocationProviderClient depuis LocationServices.
  • Utilisez lastLocation pour une position mise en cache et getCurrentLocation pour une position récente.
  • Diffusez les mises à jour via requestLocationUpdates ou un callbackFlow, puis arrêtez-les pour économiser la batterie.

Ensuite : dessiner des marqueurs et déplacer la caméra vers ces coordonnées.

Questions Fréquemment Posées

La leçon « Obtenir la position de l’utilisateur » est-elle gratuite ?

Oui — le texte complet de « Obtenir la position de l’utilisateur » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Android Academy, passe à CoddyKit PRO. Le cours Android Academy comprend 4 leçons au total.

Qu'est-ce que j'apprendrai dans « Obtenir la position de l’utilisateur » ?

Principes du fournisseur de position fusionnée. Tu pratiques Android Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.

Dois-je avoir de l'expérience pour commencer Android Academy ?

Aucune expérience préalable n'est requise. Android Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 2 sur 4.

Combien de temps prend la leçon « Obtenir la position de l’utilisateur » ?

La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.

Peux-tu écrire et exécuter du code dans cette leçon Android Academy ?

Oui. Chaque leçon Android Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.

Toutes les leçons de ce cours

  1. Afficher une carte
  2. Obtenir la position de l’utilisateur
  3. Marqueurs et caméra
  4. Bien gérer les autorisations de localisation
← Retour à Android Academy