Un permiso especial protege el acceso a los recursos del sistema que son particularmente sensibles o no están relacionados directamente con la privacidad del usuario. Estos permisos son diferentes de los permisos en el momento de la instalación y los permisos de tiempo de ejecución.
Estos son algunos ejemplos de permisos especiales:
- Programar alarmas exactas
- Mostrar otras apps y dibujar sobre ellas
- Acceder a todos los datos de almacenamiento
Las apps que declaran un permiso especial se muestran en la página Acceso especial de apps en la configuración del sistema (Figura 1). Para otorgar un permiso especial de la app, los usuarios deben navegar a esta página: Configuración > Apps > Acceso especial de apps.
Flujo de trabajo
Para solicitar un permiso especial, haz lo siguiente:
- En el archivo de manifiesto de la app, declara los permisos especiales que la app podría necesitar.
- Diseña la UX de tu app para que se asocien determinadas acciones con permisos especiales específicos. Permite que los usuarios sepan qué acciones pueden requerir la habilitación de un permiso para que la app acceda a sus datos privados.
- Espera a que el usuario invoque la tarea o acción de la app que requiere acceso a datos privados específicos. En ese momento, la app puede solicitar el permiso especial necesario para acceder a esos datos.
- Verifica si el usuario ya otorgó el permiso especial que requiere la app. Para ello, usa la función de verificación personalizada de cada permiso. De ser así, esta ya puede acceder a los datos privados del usuario. De lo contrario, continúa con el paso siguiente. Nota: Debes verificar si tienes el permiso cada vez que realices una operación que lo requiera.
- Presenta una justificación al usuario en un elemento de la IU que explique claramente a qué datos intenta acceder la app y qué beneficios puede proporcionarle si otorga el permiso especial. Además, debido a que tu app envía a los usuarios a la configuración del sistema para otorgar el permiso, también debes incluir instrucciones breves que expliquen cómo los usuarios pueden otorgar el permiso allí. La IU de justificación debe proporcionar una opción clara para que el usuario rechace la concesión del permiso. Después de que el usuario acepte la justificación, continúa con el siguiente paso.
- Solicita el permiso especial que requiere tu app para poder acceder a los datos privados del usuario. Es probable que esto implique un intent en la página correspondiente de la configuración del sistema en la que el usuario puede otorgar el permiso. A diferencia de los permisos de tiempo de ejecución, no hay diálogos emergentes para el permiso.
- En el método
onResume()
, verifica la respuesta del usuario, ya sea que haya elegido otorgar o rechazar el permiso especial. - Si el usuario otorgó el permiso a tu app, esta podrá acceder a sus datos privados. En cambio, si el usuario rechazó el permiso, deberás degradar la experiencia en la app de forma elegante para que siga proporcionando funcionalidad al usuario, sin la información protegida por ese permiso.
Cómo solicitar permisos especiales
A diferencia de los permisos de tiempo de ejecución, el usuario debe otorgar permisos especiales desde la página Acceso especial de apps en la configuración del sistema. Las apps pueden enviar a los usuarios allí con un intent, que detiene la app e inicia la página de configuración correspondiente para un permiso especial determinado.
Después de que el usuario vuelve a la app, esta puede verificar si se otorgó el permiso en la función onResume()
.
En el siguiente código de muestra, se indica cómo solicitar el permiso especial SCHEDULE_EXACT_ALARMS
a los usuarios:
val alarmManager = getSystemService<AlarmManager>()!!
when {
// if permission is granted, proceed with scheduling exact alarms…
alarmManager.canScheduleExactAlarms() -> {
alarmManager.setExact(...)
}
else -> {
// ask users to grant the permission in the corresponding settings page
startActivity(Intent(ACTION_REQUEST_SCHEDULE_EXACT_ALARM))
}
}
Código de muestra para verificar el permiso y controlar las decisiones del usuario en onResume()
:
override fun onResume() {
// ...
if (alarmManager.canScheduleExactAlarms()) {
// proceed with the action (setting exact alarms)
alarmManager.setExact(...)
}
else {
// permission not yet approved. Display user notice and gracefully degrade
your app experience.
alarmManager.setWindow(...)
}
}
Prácticas recomendadas y sugerencias
En las siguientes secciones, se proporcionan algunas prácticas recomendadas y consideraciones para solicitar permisos especiales.
Cada permiso tiene su propio método de verificación
Los permisos especiales funcionan de manera diferente que los permisos de tiempo de ejecución. En su lugar, consulta la página de referencia de la API de permisos y usa las funciones personalizadas de verificación de acceso para cada permiso especial. Los ejemplos incluyen AlarmManager#canScheduleExactAlarms()
para el permiso SCHEDULE_EXACT_ALARMS
y Environment#isExternalStorageManager()
para el permiso MANAGE_EXTERNAL_STORAGE
.
Solicitud en contexto
Al igual que los permisos de tiempo de ejecución, las apps deben solicitar permisos especiales en contexto cuando el usuario solicita una acción específica que lo requiere. Por ejemplo, espera a solicitar el permiso SCHEDULE_EXACT_ALARMS
hasta que el usuario programe un correo electrónico para que se envíe a una hora específica.
Explica la solicitud
Proporciona una justificación antes de redireccionar a la configuración del sistema. Dado que los usuarios abandonan la app temporalmente para otorgar permisos especiales, muestra una IU integrada en la app antes de iniciar el intent en la página Acceso especial de apps, en la configuración del sistema. Esta IU debe explicar claramente por qué la app necesita el permiso y cómo el usuario debe otorgarlo en la página de configuración.