Android 11 (nivel de API 30) mejora aún más la plataforma, ya que brinda mayor protección a los datos de las apps y del usuario en el almacenamiento externo. Esta versión incorpora varias mejoras, como el acceso a la ruta de archivos sin procesar, las operaciones de edición por lotes para contenido multimedia y una IU actualizada para el framework de acceso al almacenamiento.
La versión también ofrece mejoras al almacenamiento específico, que permite a los desarrolladores migrar con mayor facilidad a este modelo de almacenamiento.
Aplicación de almacenamiento específico
Las apps que se ejecutan en Android 11, pero que se orientan a Android 10 (nivel de API 29), aún pueden solicitar el atributo requestLegacyExternalStorage
. Esta marca permite que las aplicaciones inhabiliten temporalmente los cambios asociados con el almacenamiento específico, como otorgar acceso a diferentes directorios y a distintos tipos de archivos multimedia. Después de que actualices tu app para que se oriente a Android 11, el sistema ignorará la marca requestLegacyExternalStorage
.
Cómo mantener la compatibilidad con Android 10
Si tu app inhabilita el almacenamiento específico cuando se ejecuta en dispositivos Android 10, se recomienda que configures requestLegacyExternalStorage
como true
en el archivo de manifiesto de tu app. De esta manera, tu app puede seguir comportándose como se espera en los dispositivos que ejecutan Android 10.
Cómo migrar datos a directorios visibles cuando uses el almacenamiento específico
Si tu app usa el modelo de almacenamiento heredado y antes estaba orientada a Android 10 o versiones anteriores, es posible que estés almacenando datos en un directorio al que tu app no puede acceder cuando se habilita el modelo de almacenamiento específico. Antes de orientarla a Android 11, migra los datos a un directorio que sea compatible con el almacenamiento específico.
Prueba el almacenamiento específico
Para habilitar el almacenamiento específico en tu app, independientemente de los valores de la marca de manifiesto y la versión del SDK de destino de la app, habilita las siguientes marcas de compatibilidad de apps:
DEFAULT_SCOPED_STORAGE
(habilitada para todas las apps de forma predeterminada)FORCE_ENABLE_SCOPED_STORAGE
(inhabilitada para todas las apps de forma predeterminada)
Para inhabilitar el almacenamiento específico y usar el modelo de almacenamiento heredado, desactiva ambas marcas.
Cómo administrar el almacenamiento del dispositivo
A partir de Android 11, las apps que usen el modelo de almacenamiento específico solo podrán acceder a los archivos de caché propios de la app. Si tu app necesita administrar el almacenamiento del dispositivo, sigue las instrucciones para consultar el espacio libre.
- Para comprobar el espacio libre, invoca la acción de intent
ACTION_MANAGE_STORAGE
. Si no hay suficiente espacio libre en el dispositivo, pídele al usuario que dé su consentimiento para borrar todas las cachés. Para ello, invoca la acción de intent
ACTION_CLEAR_APP_CACHE
.
Directorio específico de la app en el almacenamiento externo
A partir de Android 11, las apps no podrán crear su propio directorio específico de la app en el almacenamiento externo. Para acceder al directorio que proporciona el sistema a tu app, llama al método getExternalFilesDirs()
.
Acceso a archivos multimedia
Para facilitar el acceso al contenido sin perder la privacidad del usuario, en Android 11 se agregaron las siguientes funciones.
Cómo realizar operaciones por lotes
A fin de garantizar la coherencia en todos los dispositivos y aumentar la comodidad del usuario, en Android 11, se agregaron varios métodos que facilitan la administración de grupos de archivos multimedia.
Cómo acceder a archivos mediante rutas de archivos directas y bibliotecas nativas
A fin de ayudar a que tu app funcione sin problemas con las bibliotecas multimedia de terceros, Android 11 permite que uses API distintas de la de MediaStore
para acceder a los archivos multimedia desde el almacenamiento compartido mediante rutas de acceso a archivos directas. Entre estas API, se encuentran las siguientes:
- La API de
File
- Bibliotecas nativas, como
fopen()
Cómo acceder a datos de otras apps
Con el fin de proteger la privacidad del usuario, en los dispositivos que ejecutan Android 11 o versiones posteriores, el sistema restringe aún más el acceso de tu app a los directorios privados de otras apps.
Cómo acceder a directorios de datos en el almacenamiento interno
Android 9 (nivel de API 28) comenzó a restringir las apps que podían hacer que los archivos de sus directorios de datos en el almacenamiento interno fueran accesibles para todo el mundo en otras apps. Las apps orientadas a Android 9 o versiones posteriores no pueden hacer que los archivos de sus directorios de datos sean accesibles para el mundo.
Android 11 expande esta restricción. Si tu app está orientada a Android 11, no podrá acceder a los archivos de ningún directorio de datos de la app, incluso si la otra app está orientada a Android 8.1 (nivel de API 27) o versiones anteriores, y estableció los archivos en su directorio de datos como legibles para todos.
Cómo acceder a directorios específicos de la app en el almacenamiento externo
En Android 11, las apps ya no pueden acceder a los archivos en cualquier directorio dedicado y específico de la app dentro del almacenamiento externo.
Restricciones de acceso a documentos
Para que los desarrolladores puedan realizar pruebas, solo se aplican los siguientes cambios relacionados con el framework de acceso a almacenamiento (SAF) si tu app está orientada a Android 11 o a una versión posterior.
Acceso a los directorios
Ya no puedes usar la acción del intent ACTION_OPEN_DOCUMENT_TREE
para solicitar acceso a los siguientes directorios:
- El directorio raíz del volumen de almacenamiento interno
- El directorio raíz de cada volumen de la tarjeta SD que el fabricante del dispositivo considera confiable, sin importar si la tarjeta está emulada o es extraíble. Un volumen confiable es aquel al que una app puede acceder correctamente la mayor parte del tiempo.
- El directorio
Download
.
Acceso a los archivos
Ya no puedes usar las acciones de intent ACTION_OPEN_DOCUMENT_TREE
o ACTION_OPEN_DOCUMENT
para solicitar al usuario que seleccione archivos individuales de los siguientes directorios:
- El directorio
Android/data/
y todos los subdirectorios - El directorio
Android/obb/
y todos los subdirectorios.
Cómo probar el cambio
Para probar este cambio de comportamiento, haz lo siguiente:
- Invoca un intent con la acción
ACTION_OPEN_DOCUMENT
. Comprueba que no aparezcan los directoriosAndroid/data/
yAndroid/obb/
. - Realiza alguna de las siguientes acciones:
- Habilita la marca de compatibilidad de la app
RESTRICT_STORAGE_ACCESS_FRAMEWORK
. - Orienta a Android 11 o a versiones posteriores.
- Habilita la marca de compatibilidad de la app
- Invoca un intent con la acción
ACTION_OPEN_DOCUMENT_TREE
. Verifica que aparezca el directorioDownload
y que esté inhabilitado el botón de acción asociado con el directorio.
Permisos
Android 11 incluye los siguientes cambios relacionados con los permisos de almacenamiento.
Orientación a cualquier versión
Los siguientes cambios entran en vigor en Android 11, independientemente de la versión del SDK de destino de tu app:
- Se cambió el nombre del permiso de tiempo de ejecución de Almacenamiento a Archivos y contenido multimedia.
Si tu app no inhabilitó el almacenamiento específico y solicitó el permiso
READ_EXTERNAL_STORAGE
, los usuarios verán un cuadro de diálogo diferente al de Android 10. El cuadro de diálogo indica que tu app solicita acceso a fotos y contenido multimedia, como se muestra en la figura 1.Los usuarios pueden ver qué apps tienen el permiso
READ_EXTERNAL_STORAGE
en la configuración del sistema. En la página Configuración > Privacidad > Administrador de permisos > Archivos y contenido multimedia, cada app que tiene el permiso aparece en Se permite para todos los archivos. Si tu app está orientada a Android 11, ten en cuenta que este acceso a "todos los archivos" es de solo lectura. Para leer y escribir en todos los archivos del almacenamiento compartido con esta app, debes tener el permiso de acceso a todos los archivos.
Orientación a Android 11
Si tu app está orientada a Android 11, ni el permiso WRITE_EXTERNAL_STORAGE
ni el permiso con privilegios WRITE_MEDIA_STORAGE
otorgan acceso adicional.
Ten en cuenta que, en dispositivos que ejecutan Android 10 (API nivel 29) o versiones posteriores, tu app puede contribuir a colecciones de contenido multimedia bien definidas, como MediaStore.Downloads
, sin solicitar permisos relacionados con el almacenamiento. Obtén más información sobre cómo solicitar solamente los permisos necesarios cuando trabajas con archivos multimedia en tu app.
Acceso a todos los archivos
La mayoría de las apps que requieren acceso a almacenamiento compartido pueden seguir las prácticas recomendadas para compartir archivos multimedia y compartir archivos que no son multimedia. Sin embargo, algunas apps tienen un caso de uso principal que requiere un acceso amplio a los archivos de un dispositivo, pero no pueden hacerlo de manera eficiente si siguen las prácticas recomendadas de almacenamiento que respetan la privacidad. Para estas situaciones, Android dispone de un acceso especial a apps llamado Acceso a todos los archivos. Si deseas obtener más información, consulta la guía para administrar todos los archivos en un dispositivo de almacenamiento.
Recursos adicionales
Para obtener más información sobre los cambios en el almacenamiento en Android 11, consulta los siguientes materiales: