Cómo administrar todos los archivos de un dispositivo de almacenamiento

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.

Solicitar acceso a todos los archivos

Una app puede solicitar al usuario acceso a Todos los archivos de la siguiente manera:

  1. Declara el permiso MANAGE_EXTERNAL_STORAGE en el manifiesto.
  2. 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().

Permitir operaciones 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étodo getManageSpaceActivityIntent() 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 entrará 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.

Figura 1: Advertencia de lint en Android Studio que te recuerda la política de Google Play sobre el permiso MANAGE_EXTERNAL_STORAGE.

Debes solicitar el permiso MANAGE_EXTERNAL_STORAGE solo cuando tu app no pueda usar de manera eficaz las API más respetuosas de la privacidad, como el Framework de acceso al almacenamiento o la API de MediaStore. 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