Cómo pedir permisos en Jetpack Compose

A
Antonio Leiva
2 min lectura

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 LaunchedEffectpara 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.