Skip to content

Most visited

Recently visited

navigation

Uso del acceso a directorios determinados

Las apps como las de fotografía generalmente solo necesitan acceso a directorios de almacenamiento externo específicos, como el directorio Pictures. Los métodos existentes para acceder a almacenamiento externo no están diseñados para brindar acceso sencillo a determinados directorios para estos tipos de apps. Por ejemplo:

Android 7.0 proporciona una API simplificada para acceder a directorios de almacenamiento externos comunes.

Acceso a un directorio de almacenamiento externo

Usa la clase StorageManager para obtener la instancia de StorageVolume correcta. Luego, crea una intent llamando al método StorageVolume.createAccessIntent() de esa instancia. Usa esa intent para acceder a directorios de almacenamiento externo. Para obtener una lista de todos los volúmenes disponibles, incluidos los volúmenes de medios extraíbles, usa StorageManager.getStorageVolumes().

Si tienes información sobre un archivo específico, usa StorageManager.getStorageVolume(File) para obtener el StorageVolume que contiene el archivo. Llama a createAccessIntent() en este StorageVolume para acceder al directorio de almacenamiento externo del archivo.

En el caso de los volúmenes secundarios, como las tarjetas SD externas, pasa un valor nulo cuando llames a createAccessIntent() para solicitar acceso al volumen completo, en lugar de un directorio específico. createAccessIntent() muestra un valor nulo si pasas un valor nulo para el volumen principal, o si pasas un nombre de directorio no válido.

El siguiente fragmento es un ejemplo de cómo abrir el directorio Pictures en el almacenamiento compartido principal:

StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE);
StorageVolume volume = sm.getPrimaryStorageVolume();
Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);

El sistema intenta otorgar acceso al directorio externo y, si es necesario, confirma el acceso con el usuario usando una IU simplificada:

Figura 1: Aplicación solicitando acceso al directorio Pictures.

Si el usuario otorga el acceso, el sistema llama a la anulación de onActivityResult() con un código de resultado de RESULT_OK y datos de intents que contienen el URI. Usa el URI proporcionado para acceder a la información del directorio. Esto es similar a usar URI generados por el framework de acceso al almacenamiento.

Si el usuario no otorga el acceso, el sistema llama a la anulación de onActivityResult() con un código de resultado de RESULT_CANCELED y datos de intents nulas.

Obtener acceso a un directorio externo específico también permite el acceso a los subdirectorios de ese directorio.

Acceso a un directorio de un medio extraíble

Para usar el acceso a directorios determinados para acceder a directorios de medios extraíbles, primero debes agregar un BroadcastReceiver que reciba la notificación MEDIA_MOUNTED. Por ejemplo:

<receiver
    android:name=".MediaMountedReceiver"
    android:enabled="true"
    android:exported="true" >
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_MOUNTED" />
        <data android:scheme="file" />
    </intent-filter>
</receiver>

Cuando el usuario conecta un medio extraíble, como una tarjeta SD, el sistema envía una notificación MEDIA_MOUNTED. Esta notificación proporciona un objeto StorageVolume en los datos de la intent que puedes usar para acceder a directorios del medio extraíble. En el siguiente ejemplo se accede al directorio Pictures de medios extraíbles:

// BroadcastReceiver has already cached the MEDIA_MOUNTED
// notification Intent in mediaMountedIntent
StorageVolume volume = (StorageVolume)
    mediaMountedIntent.getParcelableExtra(StorageVolume.EXTRA_STORAGE_VOLUME);
volume.createAccessIntent(Environment.DIRECTORY_PICTURES);
startActivityForResult(intent, request_code);

Prácticas recomendadas

Cuando sea posible, conserva el URI de acceso a directorios externos de modo que no debas solicitar acceso al usuario continuamente. Una vez que el usuario haya otorgado el acceso, llama a getContentResolver(), y con el ContentResolver que se muestre llama a takePersistableUriPermission() usando el URI de acceso a directorios. El sistema conservará el URI, y las solicitudes de acceso siguientes generarán RESULT_OK y no le mostrarán al usuario una IU de confirmación.

Si el usuario rechaza el acceso a un directorio externo, no vuelvas a solicitar acceso de inmediato. Insistir con la solicitud de acceso tendría efectos negativos en la experiencia del usuario. Si el usuario rechaza una solicitud y la app solicita acceso nuevamente, la IU mostrará una casilla de verificación Don't ask again:

Figura 1: Una aplicación realiza una segunda solicitud de acceso a medios extraíbles.

Si el usuario selecciona Don't ask again y rechaza la solicitud, todas las solicitudes futuras que presente la app para el directorio en cuestión se rechazarán automáticamente y el usuario no recibirá ninguna IU de solicitud.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Follow Google Developers on WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience.
(Sep 2017 survey)