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")
}