Implementación de Permisos de Localización y Notificación en Android

Clase 21 de 33Curso de Android: Integración de APIs nativas

Resumen

Generar aplicaciones móviles que respeten las políticas de permisos en Android requiere un manejo claro y eficiente. Aprende cómo integrar permisos de localización y notificaciones usando intents y diálogos en tu mapa interactivo.

¿Cómo configurar los intents para gestionar permisos?

Lo primero es definir dos nuevos intents en el archivo Tracking Intent:

  1. Permisos de Localización: Incluye dos variables booleanas:
  2. AcceptedLocationPermission: indica si el usuario acepta los permisos.
  3. ShowLocationRationale: para saber cuándo mostrar justificación del permiso.

  4. Permisos de Notificación: Crea variables similares:

  5. AcceptedNotificationPermission.
  6. ShowNotificationRationale.

Ambos intents deben añadirse al ViewModel para actualizar el estado adecuadamente:

HasLocationPermission.value = intent.AcceptedLocationPermission
ShowLocationRationale = intent.ShowLocationRationale

¿Cómo manejar estos estados en el ViewModel?

En el estado TrackLocationState debes crear variables booleanas que controlen cuándo mostrar los Rationales:

var ShowLocationRationale = false
var ShowNotificationRationale = false

Con el estado actualizado, regresa al TrackingMapViewModel y asigna correctamente estos valores basándote en los intents recibidos.

Recuerda que mantener consistencia entre los nombres y tipos en estos estados es clave para evitar errores.

¿Cómo implementar un PermissionLauncher para múltiples permisos?

Para gestionar múltiples permisos desde tu MapScreen, necesitas traer el contexto actual y la actividad para aprovechar las extension functions de permisos que ya creaste:

val context = LocalContext.current
val activity = context as Activity

Ahora crea un PermissionLauncher utilizando rememberLauncherForActivityResult, ideal para manejar más de un permiso simultáneamente:

val permissionLauncher = rememberLauncherForActivityResult(
  ActivityResultContracts.RequestMultiplePermissions()
) { resultado ->
  // Aquí verificarás y manejarás cada permiso
  val hasLocation = activity.hasLocationPermission()
  val hasNotification = activity.NotificationPermission()
}

Cada vez que obtengas un resultado, utiliza las funciones previamente definidas para verificar y reaccionar en consecuencia.

¿Cuál es el rol de los diálogos Rationales?

Los Rationales son diálogos que informan al usuario por qué necesitas determinado permiso:

  • Si el estado del permiso indica que debes mostrar un rationale, dispara el diálogo correspondiente.
  • Luego, envía un intent que registre la decisión del usuario de aceptar o rechazar.

Al configurar tu diálogo, recuerda integrar métodos para aceptar y desestimar (onAccept y onDismiss) y actualizar estados al cerrar estos Rationales:

onDismiss -> trackingIntent.submitLocationPermissionInfo(context.hasLocationPermissions(), false)

Continuemos al próximo módulo para implementar estos lanzamientos de permisos exitosamente.