0Pricing
Android Academy · Lección

Cómo obtener la ubicación del usuario

Conceptos básicos del proveedor de ubicación fusionada

Cómo obtener la ubicación del usuario es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 2 de 4. Puedes leer la lección completa abajo gratuitamente — luego la practicas en el navegador con un editor de código integrado y un tutor de IA 24/7. Forma parte de la ruta de aprendizaje de Android Academy, y tu progreso se sincroniza en la web y la app de CoddyKit. El curso de Android Academy incluye 4 lecciones en total.

¿Dónde está el usuario?

La mayoría de las aplicaciones que utilizan la ubicación comienzan con una pregunta: ¿dónde está el dispositivo ahora mismo? Android responde mediante el Fused Location Provider, que forma parte de Google Play services.

En esta lección añadirá la dependencia, solicitará una ubicación puntual, escuchará actualizaciones continuas y mostrará el resultado en Compose.

Por qué usar el proveedor combinado

Android dispone de varias fuentes de ubicación: GPS, Wi‑Fi y torres de telefonía. El Fused Location Provider las combina de forma inteligente para ofrecerle la mejor ubicación con el menor consumo de batería.

Ya casi nunca se utiliza directamente LocationManager; el cliente combinado es más sencillo e inteligente.

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

Declarar el permiso

La ubicación es un recurso sensible. Declare el permiso en su AndroidManifest.xml. Use ACCESS_FINE_LOCATION para obtener una ubicación precisa o ACCESS_COARSE_LOCATION para una aproximada.

Declararlo es solo el primer paso: también debe solicitarlo durante la ejecución, como se explica en una lección posterior.

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

Crear el cliente combinado

Obtenga un FusedLocationProviderClient desde LocationServices. En Compose, obtenga el contexto con LocalContext.current y recuerde el cliente para que no se vuelva a crear en cada recomposición.

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

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

Obtener la última ubicación conocida

La respuesta más rápida es lastLocation: la ubicación más reciente que el sistema ya tiene almacenada en caché. Devuelve un Task, por lo que debe añadir un listener de éxito.

Puede ser null si ninguna aplicación ha solicitado una ubicación recientemente, así que compruebe siempre si es nulo.

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

Esperar el Task con corrutinas

Los callbacks se anidan rápidamente. La biblioteca kotlinx-coroutines-play-services añade .await(), para que pueda leer una ubicación mediante código suspendible y claro.

import kotlinx.coroutines.tasks.await

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

Solicitar una ubicación actualizada

lastLocation puede estar desactualizada. Para obtener una ubicación reciente, llame a getCurrentLocation con una prioridad. PRIORITY_HIGH_ACCURACY utiliza el GPS; PRIORITY_BALANCED_POWER_ACCURACY ahorra batería.

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()
}

Actualizaciones continuas de ubicación

Para la navegación o el seguimiento necesita un flujo de actualizaciones. Cree un LocationRequest con un intervalo y, después, registre un LocationCallback mediante requestLocationUpdates.

Detenga siempre las actualizaciones cuando termine de utilizarlas para ahorrar batería.

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 */ }
    }
}

Actualizaciones como Flow

Un patrón claro consiste en envolver las actualizaciones en un callbackFlow, de modo que los consumidores recopilen las ubicaciones y las actualizaciones se detengan automáticamente cuando finalice la recopilación mediante 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) }
}

Mostrar la ubicación en Compose

Recopile el resultado en un componible usando LaunchedEffect para una lectura única, o collectAsStateWithLifecycle para un flujo. Después, muestre las coordenadas.

@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..."
    )
}

Compromisos entre batería y precisión

La ubicación es uno de los mayores consumidores de batería en las aplicaciones móviles. Elija la menor precisión que siga cubriendo sus necesidades, use el intervalo de actualización más largo que resulte aceptable y detenga siempre las actualizaciones cuando la pantalla deje de estar visible.

La alta precisión combinada con actualizaciones frecuentes agota la batería rápidamente; resérvela para la navegación activa.

Comprobación rápida

Necesita obtener ahora mismo la posición actual más precisa posible mediante una función suspendible. ¿Qué enfoque es el más adecuado?

Resumen

Ahora puede leer la ubicación del dispositivo:

  • Añada play-services-location y declare ACCESS_FINE/COARSE_LOCATION.
  • Obtenga un FusedLocationProviderClient desde LocationServices.
  • Use lastLocation para obtener una ubicación almacenada en caché y getCurrentLocation para obtener una actualizada.
  • Reciba actualizaciones mediante requestLocationUpdates / un callbackFlow y deténgalas para ahorrar batería.

A continuación: dibujar marcadores y mover la cámara a esas coordenadas.

Preguntas frecuentes

¿La lección «Cómo obtener la ubicación del usuario» es gratis?

Sí — el texto completo de «Cómo obtener la ubicación del usuario» es gratis para leer aquí en la web. Para practicarla de forma interactiva (editor de código integrado y tutor de IA 24/7) y desbloquear el resto del curso de Android Academy, actualiza a CoddyKit PRO. El curso de Android Academy incluye 4 lecciones en total.

¿Qué aprenderé en «Cómo obtener la ubicación del usuario»?

Conceptos básicos del proveedor de ubicación fusionada Practicas Android Academy con código real que ejecutas directamente en el navegador, y un tutor de IA 24/7 responde tus preguntas mientras trabajas en la lección.

¿Necesito experiencia previa para empezar Android Academy?

No se requiere experiencia previa. Android Academy en CoddyKit está estructurado para principiantes hasta estudiantes avanzados, así que puedes empezar aquí o desde el inicio y avanzar a tu ritmo. Esta es la lección 2 de 4.

¿Cuánto tiempo toma la lección «Cómo obtener la ubicación del usuario»?

La mayoría de las lecciones de CoddyKit toman alrededor de 5–10 minutos. Cada una es compacta e interactiva, así que avanzas constantemente y retomas exactamente por donde dejaste en la web y la app.

¿Puedo escribir y ejecutar código en esta lección de Android Academy?

Sí. Cada lección de Android Academy incluye un editor de código integrado, así que escribes y ejecutas código real directamente en tu navegador y obtienes retroalimentación instantánea de IA — sin configuración local necesaria.

Todas las lecciones de este curso

  1. Cómo mostrar un mapa
  2. Cómo obtener la ubicación del usuario
  3. Marcadores y cámara
  4. Permisos de ubicación correctamente implementados
← Volver a Android Academy