Generalidades

Manejo de permisos en Android 11.Autor: Sachin Rajput | Bits móviles locales | Junio ​​de 2021

Sachin Rajput
1*x7INxAwTxCRdx w1sL7Vag

Hola a todos 🙂 Estoy escribiendo este blog para resumir mi experiencia de un proceso extraño al migrar nuestra aplicación al soporte de Android 11.

Empecemos por las cosas extrañas

En Android 11, noté que esta ventana emergente de permisos de proceso se puede cerrar. Cuando el usuario cierra cualquier ventana emergente de permisos, recibiremos una devolución de llamada como «No preguntar de nuevo» seleccionada por el usuario.

Veamos qué devoluciones de llamada se reciben y comenzamos desde el principio, el usuario hace clic en un botón para solicitar permiso de la cámara y, una vez que el sistema operativo muestra el cuadro de diálogo de permiso. El usuario simplemente hace clic fuera de este cuadro de diálogo y lo cierra, y luego recibiremos una devolución de llamada en lugar de «No volver a preguntar».

Aquí hay un video de depuración

Como podemos notar, cuando el usuario ni siquiera niega el permiso y simplemente hace clic fuera de este cuadro de diálogo de permiso para cerrarlo, aún recibimos dicha devolución de llamada.

Desafortunadamente, cuando el usuario selecciona «No vuelvas a preguntar«, entonces, ¿cómo nos ocupamos de:

Podemos verificar cuándo se «niega» el permiso y el método para determinar este estado «no más preguntas» shouldShowRequestPermissionRationale () Falso retorno

Si el usuario no permite el permiso (es decir, se negó una vez antes) y shouldShowRequestPermissionRationale Regreso false Entonces esto significa que el usuario ha seleccionado el permiso «No volver a preguntar».

Para hacer esto, podemos crear una variable en las preferencias y hacerla verdadera cuando el usuario niegue el permiso por primera vez.

if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) 
setCameraDenied()
showPermissionDeniedDialog(Manifest.permission.CAMERA, REQUEST_CODE_CAMERA)

Luego, podemos agregar una verificación de combinación agregando estos dos para detectar si podemos mostrar una ventana emergente que requiera permisos obligatorios como este:

if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && (AppPreferences.cameraPermissionDeniedOnce)) 
showMandatoryPermissionsNeedDialog()

Todas estas condiciones combinadas se ven así:

override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
when (requestCode) {
REQUEST_CODE_CAMERA ->
if (grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED)
findViewById<TextView>(R.id.tvStatus).text = getString(R.string.permission_granted)
else
if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA))
setCameraDenied()
showPermissionDeniedDialog(Manifest.permission.CAMERA, REQUEST_CODE_CAMERA)
else
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA) && (AppPreferences.cameraPermissionDeniedOnce))
showMandatoryPermissionsNeedDialog()




}
}

Al agregar estas comprobaciones, nuestro flujo de permisos funcionará como se esperaba.

Si ha estado conmigo, espero que le resulte útil 🙂 Si es así, no dude en hacer clic en el botón Me gusta. Puede encontrar el código completo relacionado con este ejemplo aquí.

Publicaciones relacionadas

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Botón volver arriba