Actualizaciones de permisos en Android 11

Android 11 brinda a los usuarios la capacidad de especificar permisos más detallados de ubicación, uso del micrófono y cámara. Además, el sistema restablece los permisos de las apps sin usar que se orientan a Android 11 o versiones posteriores, y es posible que estas apps deban actualizar los permisos que declaran si usan la ventana de alerta del sistema o leen información relacionada con los números de teléfono.

Permisos únicos

A partir de Android 11, cada vez que la app solicita un permiso relacionado con la ubicación, el micrófono o la cámara, el diálogo de permisos para el usuario contiene una opción llamada Solo esta vez. Si el usuario selecciona esta opción, se le otorgará un permiso único temporal a la app.

Descubre cómo el sistema controla los permisos únicos.

Permisos de restablecimiento automático de apps que no se usan

Si tu app está orientada a Android 11 o a versiones posteriores y no se usó durante algunos meses, el sistema restablecerá automáticamente los permisos de tiempo de ejecución sensibles que el usuario otorgó a la app a fin de proteger sus datos. Esta acción tiene el mismo efecto que si el usuario viera un permiso en la configuración del sistema y cambiara el nivel de acceso de tu app a Rechazar. Si la app sigue las prácticas recomendadas para solicitar permisos en el tiempo de ejecución, no deberías hacer ningún cambio. Esto se debe a que, a medida que el usuario interactúa con las funciones de tu app, debes verificar que estas tengan los permisos que necesitan.

Obtén más información sobre la manera en que el sistema restablece automáticamente los permisos de las apps que no se usan.

Visibilidad del diálogo de permisos

A partir de Android 11, si el usuario presiona Rechazar para un permiso específico más de una vez durante la instalación de la app en un dispositivo, no verá el diálogo de permisos del sistema si tu app solicita ese permiso nuevamente. La acción del usuario implica "no volver a preguntar". En versiones anteriores, los usuarios veían el diálogo de permisos del sistema cada vez que tu app solicitaba un permiso a menos que el usuario hubiera seleccionado una opción o casilla de verificación de "no volver a preguntar". Este cambio en el comportamiento de Android 11 desalienta las solicitudes reiteradas de permisos que los usuarios decidieron rechazar.

Para identificar si una app tiene permisos denegados de manera permanente (con fines de depuración y prueba), usa el siguiente comando:

adb shell dumpsys package PACKAGE_NAME

Donde PACKAGE_NAME es el nombre del paquete que se inspeccionará.

El resultado del comando contiene secciones que se ven de la siguiente manera:

...
runtime permissions:
  android.permission.POST_NOTIFICATIONS: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.ACCESS_FINE_LOCATION: granted=false, flags=[ USER_SET|USER_FIXED|USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
  android.permission.BLUETOOTH_CONNECT: granted=false, flags=[ USER_SENSITIVE_WHEN_GRANTED|USER_SENSITIVE_WHEN_DENIED]
...

USER_SET marca los permisos que el usuario rechazó. USER_FIXED marca los permisos que se rechazaron de forma permanente cuando se selecciona Rechazar dos veces.

Durante las pruebas, te recomendamos que restablezcas estas marcas para asegurarte de que los verificadores no se sorprendan cuando no se muestre el diálogo de la solicitud. Para ello, usa el siguiente comando:

adb shell pm clear-permission-flags PACKAGE_NAME PERMISSION_NAME user-set user-fixed

PERMISSION_NAME es el nombre del permiso que deseas restablecer. Para ver una lista completa de los permisos de la app para Android, visita la página de referencia de la API de permisos.

Obtén más información para controlar el rechazo de permisos en tu app.

Cambios en la ventana de alerta del sistema

En Android 11, se presentan varios cambios en la forma en que las apps reciben el permiso SYSTEM_ALERT_WINDOW. Los cambios están diseñados para hacer que el permiso sea más intencional y proteger a los usuarios.

Algunas apps reciben el permiso SYSTEM_ALERT_WINDOW automáticamente a pedido

Algunas clases de apps reciben el permiso SYSTEM_ALERT_WINDOW automáticamente a pedido:

  • Cualquier app que tenga ROLE_CALL_SCREENING y solicite SYSTEM_ALERT_WINDOW recibe el permiso automáticamente. Si la app pierde ROLE_CALL_SCREENING, pierde el permiso.

  • Cualquier app que esté capturando la pantalla mediante un MediaProjection y solicite SYSTEM_ALERT_WINDOW recibe automáticamente el permiso, a menos que el usuario lo haya denegado de forma explícita. Cuando la app deja de capturar la pantalla, pierde el permiso. Este caso de uso está destinado principalmente a apps para transmitir juegos en vivo.

Estas apps no necesitan enviar ACTION_MANAGE_OVERLAY_PERMISSION para obtener el permiso SYSTEM_ALERT_WINDOW. Pueden solicitar SYSTEM_ALERT_WINDOW directamente.

Los intents MANAGE_OVERLAY_PERMISSION siempre llevan al usuario a la pantalla de permisos del sistema

A partir de Android 11, los intents ACTION_MANAGE_OVERLAY_PERMISSION siempre llevan al usuario a la pantalla Configuración de nivel superior, donde puede otorgar o revocar los permisos SYSTEM_ALERT_WINDOW de las apps. Se ignoran todos los datos de package: del intent.

En las versiones anteriores de Android, el intent ACTION_MANAGE_OVERLAY_PERMISSION podía especificar un paquete, que llevaba al usuario a una pantalla específica de la app para administrar el permiso. Esta función no es compatible a partir de Android 11. Ahora, el usuario debe seleccionar primero la app a la que desea otorgar o revocar el permiso. Este cambio se implementó para proteger a los usuarios y hacer que el otorgamiento de permisos sea más intencional.

Números de teléfono

Android 11 cambia el permiso relacionado con el teléfono que usa tu app cuando lee números de teléfono.

Si tu app está orientada a Android 11 o versiones posteriores y necesita acceder a las API de números de teléfono que se muestran en la siguiente lista, debes solicitar el permiso READ_PHONE_NUMBERS, en lugar de READ_PHONE_STATE.

Si la app declara que READ_PHONE_STATE llama a métodos distintos de los de la lista anterior, puedes seguir solicitando READ_PHONE_STATE en todas las versiones de Android. Sin embargo, si usas el permiso READ_PHONE_STATE solo para los métodos de la lista anterior, actualiza el archivo de manifiesto de la siguiente manera:

  1. Cambia la declaración de READ_PHONE_STATE para que tu app use el permiso solo en Android 10 (nivel 29 de API) y versiones anteriores.
  2. Agrega el permiso READ_PHONE_NUMBERS.

El siguiente fragmento de declaración de manifiesto ejemplifica el proceso:

<manifest>
    <!-- Grants the READ_PHONE_STATE permission only on devices that run
         Android 10 (API level 29) and lower. -->
    <uses-permission android:name="android.permission.READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="android.permission.READ_PHONE_NUMBERS" />
</manifest>

Recursos adicionales

Para obtener más información sobre los cambios en los permisos de Android 11, consulta los siguientes materiales:

Videos

Cómo desarrollar con los cambios de privacidad más recientes en Android 11