Pedir permisos en Android usando Kotlin


Google a realizado cambios con la petición de permisos incluidos en las novedades de privacy en Android 11, a partir de ahora se debe usar la nueva forma para solicitar los permisos dentro de una app, se hacen usando la nueva API Register Activity for Result que llega a reemplazar el antiguo startActivityForResult.

Solicitar permiso individual

Método para solicitar un permiso único y que solo debemos computar si está permitido o no

private val requestOnePermission =
    registerForActivityResult(ActivityResultContracts.RequestPermission()){
    if (it) {
        Log.d(TAG, "onActivityResult: PERMISSION GRANTED")
    } else {
        Log.e(TAG, "onActivityResult: PERMISSION DENIED")
    }
}

Para solicitar el permiso

requestOnePermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE)

Controlar la solicitud del permiso

Al solicitar por primera vez un permiso al usuario, pueda que no lo quiera otorgar, se puede detectar cuando el usuario denega el permiso por primera vez para informarle que uso se le da al permiso. Se hace con la opción shouldShowRequestPermissionRationale.

La próxima solicitud del permiso si el usuario a selecionado no preguntar más siempre nos devolverá la última opción, es donde podemos aprovechar para mostrar que debe ir a opciones del sistema para otorgar el permiso.

private val requestOnePermission =
    registerForActivityResult(ActivityResultContracts.RequestPermission()) { granted ->

            when {
                granted -> {
                    Log.d(TAG, "onActivityResult: PERMISSION GRANTED")
                    playRingTone()
                }
                shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE) -> {
                    //this option is available starting in API 23
                    Log.w(TAG, "onActivityResult: PERMISSION NEEDED")
                }
                else -> {
                    Log.e(TAG, "onActivityResult: PERMISSION DENIED PERMANENTLY")

                }
            }

    }

// su uso
requestOnePermission.launch(Manifest.permission.READ_EXTERNAL_STORAGE)

Solicitud de multiples permisos

Se puede agrupar la solicitud de varios permisos y pedirlos juntos, para ello se usará

ActivityResultContracts.RequestMultiplePermissions()
private val requestPermissions =
    registerForActivityResult(ActivityResultContracts.RequestMultiplePermissions()) { permissions ->

        val granted = permissions.entries.all {
            it.value == true
        }
        if (granted) {
            Log.d(TAG, "onActivityResult: PERMISSIONS ALL GRANTED")
        } else {
            Log.e(TAG, "onActivityResult: PERMISSION ALL DENIED")

        }

    }

En la solicitud de los permisos

requestPermissions.launch(
    arrayOf(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    )
)

Comprobación si un permiso está otorgado

Si se desea saber si está otorgado un permiso o un grupo de ellos

private fun hasPermissions(context: Context, permissions: Array<String>): Boolean = permissions.all {
    ActivityCompat.checkSelfPermission(context, it) == PackageManager.PERMISSION_GRANTED
}

Su uso

if (hasPermissions(
    arrayOf(
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.WRITE_EXTERNAL_STORAGE
    )
)) {
    Log.d(TAG, "onActivityResult: PERMISSIONS ALL GRANTED")
}
Anuncio publicitario

Publicado por Codelaby

Mobile DevDesigner

Deja una respuesta

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Salir /  Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Salir /  Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Salir /  Cambiar )

Conectando a %s

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.

A %d blogueros les gusta esto: