Cómo otorgar acceso parcial a fotos y videos

Los usuarios que interactúan con tu app en dispositivos Android 14 ahora pueden otorgar acceso parcial a su biblioteca de medios visuales (fotos o videos) cuando una app solicita algún permiso para este tipo de contenido (READ_MEDIA_IMAGES o READ_MEDIA_VIDEO) que se introdujo en Android 13 (nivel de API 33).

El nuevo diálogo incluye las siguientes opciones:

  • Seleccionar fotos y videos: Novedad en Android 14. El usuario selecciona las fotos y los videos específicos que desea que estén disponibles para tu app.
  • Permitir todo: El usuario otorga acceso de biblioteca completa para todas las fotos y todos los videos del dispositivo.
  • No permitir: El usuario rechaza todo el acceso.

Si el usuario elige Seleccionar fotos y videos y, luego, tu app vuelve a solicitar READ_MEDIA_IMAGES o READ_MEDIA_VIDEO, el sistema muestra un diálogo diferente, lo que le da al usuario la oportunidad de otorgar acceso a fotos y videos adicionales.

Para permitir que las apps admitan los cambios nuevos, el sistema introduce un nuevo permiso: READ_MEDIA_VISUAL_USER_SELECTED.

Efectos de declarar el nuevo permiso

Si declaras el permiso READ_MEDIA_VISUAL_USER_SELECTED, y el usuario elige Seleccionar fotos y videos en el diálogo de permisos del sistema, ocurrirá lo siguiente:

  • Se rechazarán los permisos READ_MEDIA_IMAGES y READ_MEDIA_VIDEO.
  • Se proporcionará acceso temporal y parcial a las fotos y los videos del usuario para otorgar el permiso READ_MEDIA_VISUAL_USER_SELECTED.
  • Si tu app necesita acceder a otras fotos y videos, debes volver a solicitar, de forma manual, el permiso READ_MEDIA_IMAGES o READ_MEDIA_VIDEO (o ambos).

Ten en cuenta que READ_MEDIA_IMAGES y READ_MEDIA_VIDEO son los únicos otros permisos que se necesitan para acceder a la biblioteca de fotos y videos del usuario. Si declaras READ_MEDIA_VISUAL_USER_SELECTED, el controlador de permisos sabrá que la app admite que se vuelva a realizar una solicitud manual para seleccionar más fotos y videos.

Para evitar que los usuarios vean varios cuadros de diálogo del tiempo de ejecución del sistema, solicita los permisos READ_MEDIA_VISUAL_USER_SELECTED, ACCESS_MEDIA_LOCATION y "lectura de contenido multimedia" (READ_MEDIA_IMAGES, READ_MEDIA_VIDEO o ambos) en una sola operación.

Efectos de no declarar el nuevo permiso

Si no declaras el permiso READ_MEDIA_VISUAL_USER_SELECTED, se produce el siguiente comportamiento:

  • Los permisos READ_MEDIA_IMAGES y READ_MEDIA_VIDEO se otorgan durante la sesión de la app, lo que brinda una concesión de permiso temporal y acceso temporal a las fotos y los videos que selecciona el usuario. Cuando tu app pasa a segundo plano, o cuando el usuario la finaliza de manera activa, el sistema con el tiempo rechaza estos permisos. Este comportamiento es similar a cualquier otro permiso único.
  • Si tu app necesita acceder a fotos y videos adicionales más adelante, debes volver a solicitar el permiso READ_MEDIA_IMAGES o READ_MEDIA_VIDEO de forma manual. El sistema sigue el mismo flujo que en la solicitud de permiso inicial y les solicita a los usuarios que seleccionen fotos y videos.

El acceso a las fotos y los videos se conserva cuando se actualiza el dispositivo

En los casos en que tu app esté en un dispositivo que se actualice de una versión anterior de Android a Android 14, el sistema conservará el acceso completo a las fotos y los videos del usuario, y le otorgará algunos permisos automáticamente. El comportamiento exacto depende de los permisos que se le otorguen a tu app antes de que el dispositivo se actualice a Android 14.

Permisos de Android 13

Ten en cuenta la siguiente situación:

  1. Tu app se instaló en un dispositivo que ejecuta Android 13.
  2. El usuario otorgó los permisos READ_MEDIA_IMAGES y READ_MEDIA_VIDEO a tu app.
  3. Luego, el dispositivo se actualiza a Android 14 mientras la app está instalada.

En este caso, tu app todavía tiene acceso completo a las fotos y los videos del usuario. El sistema también mantiene automáticamente los permisos READ_MEDIA_IMAGES y READ_MEDIA_VIDEO para tu app.

Permisos de Android 12 y versiones anteriores

Ten en cuenta la siguiente situación:

  1. Tu app se instaló en un dispositivo que ejecuta Android 13.
  2. El usuario otorgó los permisos READ_EXTERNAL_STORAGE o WRITE_EXTERNAL_STORAGE a tu app.
  3. Luego, el dispositivo se actualiza a Android 14 mientras la app está instalada.

En este caso, tu app todavía tiene acceso completo a las fotos y los videos del usuario. El sistema también otorga los permisos READ_MEDIA_IMAGES y READ_MEDIA_VIDEO a tu app automáticamente.

Prácticas recomendadas

En esta sección, se incluyen varias prácticas recomendadas para usar el permiso READ_MEDIA_VISUAL_USER_SELECTED.

El procesamiento de contenido multimedia en segundo plano básicamente requiere el nuevo permiso

Si la app realiza procesamientos de contenido multimedia, como comprimir o subir contenido en segundo plano, ten en cuenta que los estados de los permiso READ_MEDIA_IMAGES y READ_MEDIA_VIDEO volver a ser rechazados en algún momento. Te recomendamos que agregues compatibilidad con READ_MEDIA_VISUAL_USER_SELECTED. Como alternativa, tu app debe verificar si tiene acceso a la foto o video específico, abriendo un objeto InputStream o realizando una consulta con ContentResolver.

No almacenes el estado del permiso de forma permanente

No almacenes el estado del permiso de forma permanente, lo que incluye SharedPreferences o DataStore. Es posible que el estado almacenado no esté sincronizado con el estado real. El estado del permiso puede cambiar después del restablecimiento del permiso, la hibernación de la app, un cambio que inicie el usuario en la configuración de la app, o cuando esta pasa a segundo plano. En su lugar, verifica los permisos de almacenamiento con ContextCompat.checkSelfPermission().

No supongas que tienes acceso completo a fotos y videos

En función de los cambios introducidos en Android 14, es posible que tu app solo tenga acceso parcial a la biblioteca de fotos del dispositivo. Si la app almacena en caché datos de MediaStore cuando se realiza una consulta con ContentResolver, es posible que la caché no esté actualizada.

  • Siempre consulta MediaStore con ContentResolver, en lugar de depender de una caché almacenada.
  • Mantén los resultados en la memoria mientras la app esté en primer plano.

Trata el acceso de URI como temporario

Si el usuario elige Seleccionar fotos y videos en el diálogo de permisos del sistema, tu app rechazará el acceso a las fotos y los videos seleccionados en algún momento. Tu app siempre debe controlar el caso de no tener acceso a ningún Uri, sin importar su autoridad.