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-locationet déclarezACCESS_FINE/COARSE_LOCATION. - Obtenez un
FusedLocationProviderClientdepuisLocationServices. - Utilisez
lastLocationpour une position mise en cache etgetCurrentLocationpour une position récente. - Diffusez les mises à jour via
requestLocationUpdatesou uncallbackFlow, 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
- Afficher une carte
- Obtenir la position de l’utilisateur
- Marqueurs et caméra
- Bien gérer les autorisations de localisation