Каркас доступа к хранилищу как "личная" (только локальная) папка / средство выбора файлов?

Моя конечная цель - позволить пользователю выбрать папку для сохранения файла - файл является видеофайлом, который будет создан в определенный момент после того, как пользователь выберет место назначения.
Я просто использую средство выбора структуры доступа к хранилищу, чтобы позволить им выбрать место для его сохранения.

Прежде всего, есть ли способ разрешить пользователю выбирать только папку (а не файл / имя файла)?
Лучшее, что я могу сделать сейчас, это использовать 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
        }
}
Другие вопросы по тегам