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.
Por ejemplo, el caso práctico principal de una app antivirus podría requerir el análisis regular de muchos archivos en diferentes directorios. Si este análisis requiere interacciones repetidas del usuario para seleccionar directorios con el selector de archivos del sistema, podría proporcionar una mala experiencia del usuario. Otros casos de uso, como las apps de administración de archivos, las de copia de seguridad y restablecimiento, y las de administración de documentos, pueden requerir consideraciones similares.
Cómo solicitar acceso a todos los archivos
Una app puede solicitar al usuario acceso a Todos los archivos de la siguiente manera:
- Declara el permiso
MANAGE_EXTERNAL_STORAGE
en el manifiesto. - Usa la acción de intent
ACTION_MANAGE_ALL_FILES_ACCESS_PERMISSION
para dirigir a los usuarios a una página de configuración del sistema en la que puedan habilitar la siguiente opción para tu app: Permitir administrar todos los archivos.
Para determinar si a tu app se le otorgó el permiso MANAGE_EXTERNAL_STORAGE
, llama a Environment.isExternalStorageManager()
.
Operaciones permitidas por MANAGE_EXTERNAL_STORAGE
El permiso MANAGE_EXTERNAL_STORAGE
otorga lo siguiente:
Acceso de lectura y escritura a todos los archivos dentro del almacenamiento compartido
Acceso al contenido de la tabla
MediaStore.Files
Acceso al directorio raíz de la unidad USB sobre la marcha (OTG) y la tarjeta SD
Acceso de escritura a todos los directorios de almacenamiento interno, excepto
/Android/data/
,/sdcard/Android
y la mayoría de los subdirectorios de/sdcard/Android
(este acceso de escritura incluye el acceso a la ruta del archivo directa)Las apps a las que se les otorgó este permiso aún no pueden acceder a los directorios específicos de otras apps porque estos directorios aparecen como subdirectorios de
Android/data/
en un volumen de almacenamiento.
Cuando una app tiene el permiso MANAGE_EXTERNAL_STORAGE
, puede acceder a estos archivos y directorios adicionales mediante la API de MediaStore
o rutas de archivos directas. Sin embargo, cuando usas el framework de acceso al almacenamiento, solo puedes acceder a un archivo o directorio si puedes hacerlo sin el permiso MANAGE_EXTERNAL_STORAGE
.
Invocar la actividad de administración de almacenamiento de otra app
En Android 12 (nivel de API 31) y versiones posteriores, las apps que tienen tanto el permiso MANAGE_EXTERNAL_STORAGE
como QUERY_ALL_PACKAGES
, al igual que las apps de administración de archivos, pueden usar el getManageSpaceActivityIntent()
para dirigir a los usuarios a la actividad de administración de espacios personalizados de otra app.
El método getManageSpaceActivityIntent()
asimila el nombre de un paquete y el código de una solicitud, y muestra uno de los siguientes resultados:
PendingIntent
, si la app con el nombre del paquete especificado definió una actividad personalizada para "administrar el espacio". La app de administración de archivos que llamó al métodogetManageSpaceActivityIntent()
puede invocar el intent que se muestra para enviar a los usuarios a la actividad personalizada.null
, si la app con el nombre del paquete especificado no define una actividad para "administrar el espacio".
Habilitar MANAGE_EXTERNAL_STORAGE para pruebas
Para conocer cómo el permiso MANAGE_EXTERNAL_STORAGE
afecta a tu app, puedes habilitarlo con fines de prueba. Para hacerlo, ejecuta el siguiente comando en la máquina que está conectada a tu dispositivo de prueba:
adb shell appops set --uid PACKAGE_NAME MANAGE_EXTERNAL_STORAGE allow
Aviso de Google Play
Esta sección proporciona un aviso para los desarrolladores que publican apps en Google Play.
Para limitar el acceso amplio al almacenamiento compartido, Google Play Store actualizó su política a fin de evaluar las apps orientadas a Android 11 (nivel de API 30) o versiones posteriores, y solicitar el acceso a todos los archivos mediante el permiso MANAGE_EXTERNAL_STORAGE
. Esta política entró en vigencia en mayo de 2021.
Cuando tu app está orientada a Android 11 o versiones posteriores, y declara el permiso MANAGE_EXTERNAL_STORAGE
, Android Studio muestra la advertencia de lint que aparece en la Figura 1. Esta advertencia te recuerda que Google Play Store tiene una política que limita el uso del permiso.
MANAGE_EXTERNAL_STORAGE
.
Solicita el permiso MANAGE_EXTERNAL_STORAGE
solo cuando tu app no pueda usar las APIs más respetuosas de la privacidad, como el Framework de acceso al almacenamiento o la API de Media Store. Además, la utilización del permiso por parte de la app debe estar dentro de los usos permitidos y debe estar directamente vinculada a la funcionalidad principal de la app. Si tu app incluye un caso de uso similar a los siguientes ejemplos, es posible que se le permita solicitar el permiso MANAGE_EXTERNAL_STORAGE
:
- Administradores de archivos
- Apps de copia de seguridad y restablecimiento
- Apps antivirus
- Apps de administración de documentos
- Búsqueda de archivos en el dispositivo
- Encriptación de archivos y discos
- Migración de datos de un dispositivo a otro