Permisos de ubicación correctamente implementados
Ubicación en primer plano y ubicación precisa
Permisos de ubicación correctamente implementados es una lección gratuita de Android Academy en CoddyKit. Esta es la lección 4 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.
Los permisos son obligatorios
La ubicación es uno de los permisos más sensibles de Android. Declararla en el manifiesto no es suficiente: en las versiones modernas de Android debe solicitarla durante la ejecución y gestionar correctamente cada respuesta.
Esta lección abarca los niveles de permisos, cómo solicitarlos en Compose y cómo gestionar las denegaciones, así como las nuevas reglas de ubicación precisa frente a aproximada y de ubicación en segundo plano.
Los tres permisos de ubicación
Android divide la ubicación en niveles:
ACCESS_COARSE_LOCATION— aproximada (aproximadamente, una manzana).ACCESS_FINE_LOCATION— precisa (nivel GPS).ACCESS_BACKGROUND_LOCATION— acceso mientras su aplicación no está en primer plano.
Solicite únicamente lo que realmente necesite. El acceso en segundo plano está sujeto a un mayor escrutinio en Play Store.
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<!-- only if truly needed: -->
<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />Solicitar permisos en Compose
Las API de Activity Result le proporcionan un launcher para los diálogos de permisos. En Compose, use rememberLauncherForActivityResult con el contrato RequestMultiplePermissions.
import androidx.activity.compose.rememberLauncherForActivityResult
import androidx.activity.result.contract.ActivityResultContracts
val launcher = rememberLauncherForActivityResult(
ActivityResultContracts.RequestMultiplePermissions()
) { result ->
val fine = result[Manifest.permission.ACCESS_FINE_LOCATION] == true
val coarse = result[Manifest.permission.ACCESS_COARSE_LOCATION] == true
// react to the user's choice
}Iniciar la solicitud
Abra el diálogo llamando a launch() con el array de permisos, normalmente como respuesta al toque de un botón y no automáticamente al cargar la pantalla.
Button(onClick = {
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
}) {
Text("Enable location")
}Comprobar si ya se concedió el permiso
No vuelva a solicitar el permiso si ya se ha concedido. Compruébelo con ContextCompat.checkSelfPermission antes de iniciar la solicitud.
import androidx.core.content.ContextCompat
import android.content.pm.PackageManager
fun hasFineLocation(context: Context): Boolean {
return ContextCompat.checkSelfPermission(
context,
Manifest.permission.ACCESS_FINE_LOCATION
) == PackageManager.PERMISSION_GRANTED
}Ubicación precisa frente a aproximada
Desde Android 12 (API 31), los usuarios pueden conceder acceso a la ubicación aproximada aunque usted haya solicitado la precisa. Por tanto, debe solicitar ambas juntas y aceptar que el usuario puede limitar el permiso a la ubicación aproximada.
Diseñe la función para que funcione correctamente con una ubicación aproximada siempre que sea posible.
// Request both — the system shows a Precise/Approximate toggle
launcher.launch(
arrayOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
// If only COARSE comes back granted, you got approximate location.Mostrar una justificación
Si el usuario deniega el permiso una vez, Android le permite comprobar shouldShowRequestPermissionRationale. Cuando devuelve true, muestre una explicación clara de por qué necesita la ubicación antes de volver a solicitarla.
import androidx.core.app.ActivityCompat
val shouldExplain = ActivityCompat.shouldShowRequestPermissionRationale(
activity,
Manifest.permission.ACCESS_FINE_LOCATION
)
if (shouldExplain) {
// show a dialog: "We use your location to find nearby stores"
}Gestionar una denegación permanente
Si el usuario selecciona No volver a preguntar (o deniega el permiso dos veces), el sistema deja de mostrar el diálogo. La única opción es enviarlo a los ajustes de la aplicación para que lo habilite manualmente.
import android.content.Intent
import android.provider.Settings
import android.net.Uri
fun openAppSettings(context: Context) {
val intent = Intent(
Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", context.packageName, null)
)
context.startActivity(intent)
}Usar Accompanist Permissions
La biblioteca accompanist-permissions encapsula todo esto en un estado adaptado a Compose. rememberMultiplePermissionsState realiza un seguimiento del estado de los permisos y expone una llamada launchMultiplePermissionRequest().
import com.google.accompanist.permissions.rememberMultiplePermissionsState
val permissions = rememberMultiplePermissionsState(
listOf(
Manifest.permission.ACCESS_FINE_LOCATION,
Manifest.permission.ACCESS_COARSE_LOCATION
)
)
if (permissions.allPermissionsGranted) {
// show the map / read location
} else {
Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
Text("Grant location")
}
}Reglas de ubicación en segundo plano
La ubicación en segundo plano requiere un flujo de dos pasos: primero conceda el acceso en primer plano (preciso/aproximado) y, después, solicite por separado ACCESS_BACKGROUND_LOCATION, lo que abre la configuración del sistema en Android 11 y versiones posteriores. Play Store exige una justificación clara y una política de privacidad.
Solicítelo únicamente si su aplicación realmente necesita acceder a la ubicación cuando está cerrada, por ejemplo, para geovallas o seguimiento de actividad física.
// Step 1: request foreground first and confirm it's granted.
// Step 2: only then request background:
launcher.launch(
arrayOf(Manifest.permission.ACCESS_BACKGROUND_LOCATION)
)
// On Android 11+ this sends the user to settings to pick "Allow all the time".Un mapa protegido por permisos
Integre todo protegiendo el mapa según el estado del permiso. Muestre el mapa únicamente cuando se haya concedido el permiso; de lo contrario, muestre una solicitud. Este es el patrón estándar y respetuoso con el usuario.
@Composable
fun LocationGate(permissions: MultiplePermissionsState) {
when {
permissions.allPermissionsGranted -> MapScreen()
else -> Column {
Text("We need location to show nearby places.")
Button(onClick = { permissions.launchMultiplePermissionRequest() }) {
Text("Allow location")
}
}
}
}Comprobación rápida
Desde Android 12, el usuario puede elegir una ubicación aproximada en lugar de una ubicación precisa. ¿Qué implica esto para su solicitud?
Resumen
Ahora sabe cómo solicitar acceso a la ubicación de forma responsable:
- Declare los permisos de ubicación aproximada/precisa (y de segundo plano solo si son esenciales) en el manifiesto.
- Solicítelos durante la ejecución con las API de Activity Result o
accompanist-permissions. - Solicite los permisos preciso y aproximado juntos para admitir el selector de ubicación precisa/aproximada.
- Muestre una justificación y dirija a los usuarios que hayan denegado el permiso permanentemente a la configuración de la aplicación.
- Gestione la ubicación en segundo plano como un flujo independiente de dos pasos y debidamente justificado.
Con esto finaliza Mapas y servicios de ubicación: ya puede mostrar un mapa, encontrar al usuario, colocar marcadores y solicitar permisos de la forma adecuada.
Aprende Kotlin con un tutor de IA — gratis
Escribe y ejecuta código real en tu navegador, obtén ayuda instantánea de un tutor de IA disponible 24/7 y continúa donde lo dejaste en la web o en la aplicación.
- Cursos
- 36
- Lecciones
- 152
Preguntas frecuentes
¿La lección «Permisos de ubicación correctamente implementados» es gratis?
Sí — el texto completo de «Permisos de ubicación correctamente implementados» 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 «Permisos de ubicación correctamente implementados»?
Ubicación en primer plano y ubicación precisa 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 4 de 4.
¿Cuánto tiempo toma la lección «Permisos de ubicación correctamente implementados»?
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
- Cómo mostrar un mapa
- Cómo obtener la ubicación del usuario
- Marcadores y cámara
- Permisos de ubicación correctamente implementados