Каркас доступа к хранилищу как "личная" (только локальная) папка / средство выбора файлов?
Моя конечная цель - позволить пользователю выбрать папку для сохранения файла - файл является видеофайлом, который будет создан в определенный момент после того, как пользователь выберет место назначения.
Я просто использую средство выбора структуры доступа к хранилищу, чтобы позволить им выбрать место для его сохранения.
Прежде всего, есть ли способ разрешить пользователю выбирать только папку (а не файл / имя файла)?
Лучшее, что я могу сделать сейчас, это использовать ACTION_CREATE_DOCUMENT
Намерение, чтобы получить место для сохранения, однако я не хочу указывать имя файла в палитре SAF (это будет сделано в приложении)...
Во-вторых, после прочтения документации Storage Access Framework и объединения нескольких битов из нескольких примеров кода у меня есть работающий DocumentsProvider, который почти выполняет то, что я хочу, - который позволяет пользователю просматривать свое внешнее хранилище (SD-карта) каталоги для подходящего места для сохранения видео файла - добавив мой собственный корень, который указывает на Environment.getExternalStorageDirectory()
в метод queryRoots().
Тем не менее, я действительно хочу, чтобы это был мой единственный root (в тот момент, когда у меня также есть Drive, Downloads и т. Д.).
Можно ли удалить / скрыть другие корни, чтобы он по сути стал средством выбора файлов для конкретного приложения?
Или даже показать только локальное хранилище (возможно, Root.FLAG_LOCAL_ONLY
флаг может помочь)?
Спасибо!
1 ответ
API 21 поддерживает Intent.ACTION_OPEN_DOCUMENT_TREE
, Это позволяет вам выбрать местоположение один раз, а затем вы можете использовать предоставленный URI для управления его содержимым.
private static final int LOCATION_CHOOSER_REQ_CODE = 4;
public void chooseLocation() {
Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
startActivityForResult(intent, LOCATION_CHOOSER_REQ_CODE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == LOCATION_CHOOSER_REQ_CODE && resultCode == Activity.RESULT_OK) {
if (data != null) {
Uri uri = data.getData(); // Use this URI to access files
}
}