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, y es posible que estas 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

En 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.

Luego la app podrá acceder a los datos relacionados durante un período que dependerá del comportamiento de tu app y de las acciones del usuario:

  • Mientras su actividad sea visible, la app podrá acceder a los datos.
  • Si el usuario lleva la app a segundo plano, esta podrá seguir accediendo a los datos durante un breve período de tiempo.
  • Si inicias un servicio en primer plano mientras la actividad está visible y el usuario lleva la app a segundo plano, esta puede continuar accediendo a los datos hasta que se detenga ese servicio.
  • Si el usuario revoca el permiso único (por ejemplo, en la configuración del sistema), la app no podrá acceder a los datos, independientemente de si iniciaste un servicio en primer plano. Al igual que con cualquier otro permiso, si el usuario revoca el permiso único de la app, finalizará el proceso.

La próxima vez que el usuario abra tu app y una función requiera acceso a la ubicación, el micrófono o la cámara, se le solicitará nuevamente el permiso.

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

Si tu app está orientada a Android 11 y no se usó durante algunos meses, el sistema restablece automáticamente los permisos de tiempo de ejecución sensibles que el usuario le había otorgado a fin de proteger sus datos. Esta acción tiene un efecto similar a cuando el usuario ve un permiso en la configuración del sistema y cambia el nivel de acceso de tu app a Denegar. Si tu 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.

Cómo solicitar al usuario que inhabilite el restablecimiento automático

Si es necesario, puedes pedirle al usuario que evite que el sistema restablezca los permisos de tu app. Esto es útil en situaciones en las que los usuarios esperan que tu app funcione principalmente en segundo plano, incluso sin que el usuario interactúe con ella, como en los siguientes casos prácticos:

Figura 1: El usuario inhabilitó el restablecimiento automático de permisos para una aplicación determinada.
  • Para brindar contenido apto para todo público
  • Para sincronizar datos
  • Para comunicarse con dispositivos inteligentes
  • Para vincularse con dispositivos complementarios

Para direccionar al usuario a la página de tu app en la configuración del sistema, invoca un intent que incluya la acción de intent Intent.ACTION_AUTO_REVOKE_PERMISSIONS. Desde esta pantalla, los usuarios pueden evitar que el sistema restablezca los permisos de tu app de la siguiente manera:

  1. Si se presiona la opción Permisos, que carga la pantalla de configuración Permisos de apps.
  2. Si se presiona la opción Quitar los permisos si la app está en desuso, como se muestra en la figura 1.

Cómo determinar si el restablecimiento automático está inhabilitado

Para comprobar si la función de restablecimiento automático está inhabilitada, llama a isAutoRevokeWhitelisted(). Si este método muestra true, el sistema no restablece automáticamente los permisos de tu app.

Cómo probar la función de restablecimiento automático

A fin de verificar si el sistema restablece los permisos de tu app, haz lo siguiente:

  1. Registra el tiempo predeterminado que el sistema espera para restablecer los permisos de una app. De esa manera, puedes restablecerla después de realizar las pruebas:

    threshold=$(adb shell device_config get permissions \
      auto_revoke_unused_threshold_millis2)
    
  2. Reduce el tiempo que el sistema espera para restablecer los permisos. En el siguiente ejemplo, se modifica el sistema de manera que restablezca los permisos de una app solo un segundo después de que dejas de interactuar con ella:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 1000
    
  3. Invoca el proceso de restablecimiento automático de forma manual, como se muestra en el siguiente fragmento. Antes de ejecutar este comando, asegúrate de que se haya activado durante unos segundos el dispositivo de prueba.

    adb shell cmd jobscheduler run -u 0 -f \
      com.google.android.permissioncontroller 2
    
  4. Verifica que tu app pueda controlar el evento de restablecimiento automático.

  5. Restablece el tiempo predeterminado que el sistema espera antes de restablecer automáticamente los permisos de una app:

    adb shell device_config put permissions \
      auto_revoke_unused_threshold_millis2 $threshold
    

Visibilidad del diálogo de permisos

En Android 11 no se recomienda solicitar permisos que los usuarios hayan denegado. Si el usuario presiona varias veces Denegar para un permiso específico durante la instalación de la app en un dispositivo, esta acción implica "no volver a preguntar".

Si tu app ya cumple las prácticas recomendadas para permisos, no es necesario que la modifiques para que sea compatible con este cambio de comportamiento.

Cambios en la ventana de alerta del sistema

Hay varios cambios en cómo se otorga el permiso SYSTEM_ALERT_WINDOW a las apps. 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 ya no es compatible con Android 11. Ahora, el usuario debe seleccionar primero la aplicación 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 se orienta a Android 11 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="READ_PHONE_STATE"
                     android:maxSdkVersion="29" />
    <uses-permission android:name="READ_PHONE_NUMBERS" />
</manifest>