page.title=Acceso a directorios determinados page.keywords=preview,sdk,scoped directory access page.tags=androidn @jd:body
Las aplicaciones como las aplicaciones de fotografía generalmente solo necesitan acceso a directorios de
almacenamiento externo, como el directorio Pictures. Los métodos
existentes para acceder a almacenamiento externo no están diseñados para brindar un
acceso fácil a determinados directorios para estos tipos de aplicaciones. Por ejemplo:
Android N brinda una API nueva y simplificada para acceder a directorios de almacenamiento externo comunes.
Usa la clase StorageManager para obtener la instancia de
StorageVolume correcta. Luego, crea una intención llamando al
método StorageVolume.createAccessIntent() de esa instancia.
Usa esta intención 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.getVolumesList().
El siguiente fragmento de código 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.getPrimaryVolume(); 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:
Imagen 1. Una aplicación solicitando acceso al directorio Pictures.
Si el usuario otorga el acceso, el sistema llama a tu
invalidación de onActivityResult() con un código resultante de
Activity.RESULT_OK y datos de intención que contienen el URI. Usa
el URI brindado para acceder a la información del directorio. Es similar a usar URI
generados por el
framework
de acceso al almacenamiento.
Si el usuario no otorga el acceso, el sistema llama a tu
invalidación de onActivityResult() con un código resultante de
Activity.RESULT_CANCELED y datos de intención nulos.
Nota: obtener acceso a un directorio externo específico también otorga el acceso a los subdirectorios de ese directorio.
Para usar el acceso a directorios determinados para acceder a directorios de medios extraíbles, primero debes agregar un {@link android.content.BroadcastReceiver} que escuche la notificación{@link android.os.Environment#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{@link android.os.Environment#MEDIA_MOUNTED}. Esta notificación
brinda un objeto StorageVolume en los datos de intención que puedes
usar para acceder a directorios del medio extraíble. El siguiente ejemplo
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);
Cuando sea posible, sigue usando el URI de acceso a directorios externos de modo que no tengas
que solicitarle acceso al usuario continuamente. Una vez que el usuario haya otorgado el acceso, llama a
getContentResolver().takePersistableUriPermssion() con el
URI de acceso a directorios. El sistema continuará el URI, y las siguientes solicitudes
de acceso generarán RESULT_OK y no le mostrarán una IU de confirmación al
usuario.
Si el usuario deniega el acceso a un directorio externo, no vuelvas a solicitar el acceso inmediatamente. Hacer esto provocaría una mala experiencia de usuario.