Cómo pedir permisos en Jetpack Compose

Para pedir permisos en Jetpack Compose, se necesita la función rememberLauncherForActivityResult
.
Lo primero es crear el launcher con un ActivityResultContracts.RequestPermission()
:
val permissionLauncher =
rememberLauncherForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->
// Aquí se gestiona el resultado de pedir el permiso
}
Después, hay que llamar a permissionLauncher.launch()
pasándole el permiso que queremos pedir.
En este caso, vamos a poner por ejemplo que queremos la localización amplia:
permissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION)
A esta función la llamaremos por ejemplo cuando se haga click en un botón.
O si queremos que se produzca al cargar cierto composable (como una pantalla concreta), podemos usar un LaunchedEffect
:
LaunchedEffect(Unit) {
permissionLauncher.launch(Manifest.permission.ACCESS_COARSE_LOCATION)
}
Para algunos permisos, también será necesario añadirlos al AndroidManifest
. Si no los declaramos, por mucho que los pidamos no ocurrirá nada:
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
Comprobar si tienes otorgado un permiso
Cuando vayas a usar el permiso correspondiente, puedes comprobar si lo tienes disponible de la siguiente manera:
val granted = ContextCompat.checkSelfPermission(
application,
Manifest.permission.ACCESS_COARSE_LOCATION
) == PackageManager.PERMISSION_GRANTED
Cómo extraer el código a un Effect
Si se va a usar un LaunchedEffect
para pedir el permiso, esto se puede simplificar con una función que podemos llamar PermissionRequestEffect
:
@Composable
fun PermissionRequestEffect(permission: String, onResult: (Boolean) -> Unit) {
val permissionLauncher =
rememberLauncherForActivityResult(
ActivityResultContracts.RequestPermission()
) {
onResult(it)
}
LaunchedEffect(Unit) {
permissionLauncher.launch(permission)
}
}
Esto hará que ahora usarlo sea muy fácil, y podrás pedir cualquier permiso de esta forma:
PermissionRequestEffect(Manifest.permission.ACCESS_COARSE_LOCATION) { granted ->
// Ya tenemos el permiso pedido
}
Cómo seguir aprendiendo
Si te ha gustado este contenido, en este otro artículo te enseño cómo puedes recuperar la localización concreta (país, calle, etc) a partir de lo que nos ha devuelto esta petición.
Cómo conseguir la localización amplia en Android
Cómo pedir permisos en Jetpack Compose