page.title=Доступ к выделенным каталогам page.keywords=preview,sdk,scoped directory access page.tags=androidn @jd:body
Некоторым приложениям (например, фотоприложениям) обычно требуется доступ только к отдельным каталогам
внешнего хранилища, например, к каталогу Pictures. Существующие
методы доступа к внешним хранилищам не предназначены для обеспечения приложениям такого типа удобного
доступа к выделенным каталогам. Например:
Android N предоставляет новый упрощенный API для доступа к распространенным каталогам внешнего хранилища.
Используйте класс StorageManager для получения соответствующего экземпляра
StorageVolume. Затем создайте намерение, вызвав метод
StorageVolume.createAccessIntent() этого экземпляра.
Используйте это намерение для доступа к каталогам внешнего хранилища. Чтобы получить список
всех доступных томов, в том числе томов на съемных носителях, используйте
StorageManager.getVolumesList().
В следующем фрагменте кода приведен пример того, как открывать каталог
Pictures в главном общем хранилище:
StorageManager sm = (StorageManager)getSystemService(Context.STORAGE_SERVICE); StorageVolume volume = sm.getPrimaryVolume(); Intent intent = volume.createAccessIntent(Environment.DIRECTORY_PICTURES); startActivityForResult(intent, request_code);
Система пытается предоставить доступ к внешнему каталогу и, при необходимости, запрашивает подтверждение доступа у пользователя с помощью упрощенного пользовательского интерфейса:
Рисунок 1. Приложение запрашивает доступ к каталогу Pictures.
Если пользователь предоставляет доступ, система вызывает переопределенный метод
onActivityResult() с кодом результата
Activity.RESULT_OK, а также данные намерения, содержащие URI. Используйте
предоставленный URI для доступа к данным каталога аналогично использованию URI,
возвращаемых
Storage
Access Framework.
Если пользователь не предоставляет доступ, система вызывает переопределенный метод
onActivityResult() с кодом результата
Activity.RESULT_CANCELED и отсутствующими данными намерения.
Примечание. При получении доступа к определенному внешнему каталогу приложение также получает доступ к вложенным в него каталогам.
Чтобы использовать доступ к выделенным каталогам на съемном носителе, сначала нужно добавить объект {@link android.content.BroadcastReceiver}, отслеживающий уведомления {@link android.os.Environment#MEDIA_MOUNTED}, например:
<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>
Когда пользователь подключает съемный носитель, например SD-карту, система отправляет уведомление
{@link android.os.Environment#MEDIA_MOUNTED}. Это уведомление
предоставляет в данных намерения объект StorageVolume, который вы можете использовать
для доступа к каталогам на съемном носителе. В следующем примере показано,
как осуществляется доступ к каталогу Pictures на съемном носителе:
// 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);
По возможности оставляйте постоянный URI для доступа к внешнему каталогу, чтобы приложению не
приходилось многократно запрашивать у пользователя разрешение на доступ. После предоставления доступа пользователем вызовите метод
getContentResolver().takePersistableUriPermssion() для
URI доступа к каталогу. Система сохранит постоянный URI и при последующих запросах
доступа будет возвращать ответ RESULT_OK. Таким образом, приложение не будет постоянно выводить
окно с запросом подтверждения пользователя.
Если пользователь запрещает доступ к внешнему каталогу, не нужно сразу же запрашивать доступ повторно. Пользователю может не понравиться, если приложение будет постоянно настаивать на получении доступа.