Descubra cómo funciona el permiso MANAGE_EXTERNAL_STORAGE en Android y cómo implementarlo.

¿Cómo funciona el permiso MANAGE_EXTERNAL_STORAGE en Android?

En los últimos días he estado trabajando en el desarrollo de un plugin de CapacitorJS que permite lanzar un selector de archivos nativo y me enfrenté a una nueva problemática que parece estar teniendo una gran cantidad de desarrolladores de Android. Desde Android 11 (aplicaciones destinadas a la versión 30 del SDK), que es de forma predeterminada la API de destino de una nueva aplicación basada en CapacitorJS, hay una nueva actualización en las políticas de almacenamiento de las aplicaciones. La aplicación de Scoped Storage se implementó para mejorar la plataforma, brindando una mejor protección a su aplicación y los datos del usuario en el almacenamiento externo. Esto causará algunas modificaciones en como funcionan las aplicaciónes desde esta API como:

  • En Android 11, las aplicaciones ya no pueden acceder a los archivos en el  directorio dedicado y específico de  la aplicación de cualquier otra aplicación   dentro del almacenamiento externo.
  • Para proteger la privacidad del usuario, en dispositivos que ejecutan Android 11 o superior, el sistema restringe aún más el acceso de su aplicación a los directorios privados de otras aplicaciones.

La razón por la que enfrenté este problema es porque el complemento debería permitir seleccionar cualquier archivo posible en el dispositivo, ya que se usará dentro de una aplicación de editor de código.

Accediendo a todos los archivos

Existe la posibilidad de acceder a todos los archivos del dispositivo con el nuevo permiso. Sin embargo, esto automáticamente pondrá una restricción en su aplicación, ya que Google Play debería revisar si realmente necesita el permiso mencionado al intentar publicar la aplicación en Play Store . 

El permiso no se aplicará automáticamente a su aplicación sin la interacción del usuario, ya que el usuario debe otorgar obligatoriamente acceso a los archivos. Puedes hacer esto en Android siguiendo estos pasos:

1. Solicita el permiso MANAGE_EXTERNAL_STORAGE

Modifica tu archivo AndroidManifest.xml solicitando los siguientes permisos:

<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.ourcodeworld.plugins.capacitornativefilepicker"
    xmlns:tools="http://schemas.android.com/tools"
>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE" tools:ignore="ScopedStorage"/>
</manifest>

El permiso MANAGE_EXTERNAL_STORAGE permite a una aplicación un acceso amplio al almacenamiento externo en el almacenamiento de alcance. Diseñado para ser utilizado por pocas aplicaciones que necesitan administrar archivos en nombre de los usuarios.

2. Solicitar permisos de almacenamiento externo

Después de declarar los permisos, debes solicitar los permisos regulares READ_EXTERNAL_STORAGE WRITE_EXTERNAL_STORAGE. Ten en cuenta que no incluimos el MANAGE_EXTERNAL_STORAGE, porque si lo solicitas, al verificar si tiene acceso o no, el permiso mencionado siempre volverá denegado, aunque el usuario ya haya otorgado el acceso:

ActivityCompat.requestPermissions(
    this,
    new String[]{
        Manifest.permission.READ_EXTERNAL_STORAGE,
        Manifest.permission.MANAGE_EXTERNAL_STORAGE
    },
    1
);

La lógica de este paso depende de usted, ya que puede saber cómo solicitar permisos en su propia aplicación.

3. Comprobando el permiso de MANAGE_EXTERNAL_STORAGE

Ahora, en lugar de la solicitud de permisos habitual para manejar el permiso mencionado, debes verificar si el acceso al almacenamiento externo está permitido. En caso de que no sea así, debe iniciar una nueva actividad que muestre el cuadro de diálogo del sistema donde el usuario debe permitir manualmente el acceso al almacenamiento externo de su aplicación de esta manera:

import android.os.Environment;
import android.content.Intent;
import android.provider.Settings;
import android.net.Uri;

// Si tiene acceso al almacenamiento externo, haga lo que necesite
if (Environment.isExternalStorageManager()){

// Si no tienes acceso, inicia una nueva actividad para mostrar al usuario el cuadro de diálogo del sistema
// para permitir el acceso al almacenamiento externo
}else{
    Intent intent = new Intent();
    intent.setAction(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION);
    Uri uri = Uri.fromParts("package", this.getPackageName(), null);
    intent.setData(uri);
    startActivity(intent);
}

Entonces, cuando el usuario instala la aplicación e intenta acceder al selector de archivos, si aún no se otorga el acceso a todos los archivos, se lanzará la siguiente intención del sistema:

Allow Access to all Files Android

El usuario tendrá que permitir explícitamente el acceso a todos los archivos si desea leer archivos de cualquier fuente en el dispositivo y eso debería ser suficiente.

Que te diviertas ❤️!


Ingeniero de Software Senior en EPAM Anywhere. Interesado en la programación desde los 14 años, Carlos es un programador autodidacta, fundador y autor de la mayoría de los artículos de Our Code World.

Conviertete en un programador más sociable

Patrocinadores