Как открыть SAF (Storage Access Framework) для выбора хранилища?

Как открыть SAF (Storage Access Framework), чтобы выбрать хранилище как на картинке? введите здесь описание изображения

Я старался:

Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE);
intent.putExtra(DocumentsContract.EXTRA_PROMPT, "Select path to save");
startActivityForResult(intent, PICK_FOLDER);

но это открывает только Recent, и пользователь должен щелкнуть ... и Show Internal Storage, а после этого выбрать, например, SDCard или Internal Storage. Это не удобно для пользователя.

Есть ли способ открыть вид как на картинке или нет? В Intent DocumentsContract.EXTRA_INITIAL_URI есть дополнительные данные, но какое значение я могу добавить, чтобы показать открытый вид, как на картинке?

Я могу напрямую открыть primary storage через:

StorageManager sm = (StorageManager) getSystemService(Context.STORAGE_SERVICE);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) { //From Android 10+
    startActivityForResult(sm.getPrimaryStorageVolume().createOpenDocumentTreeIntent(), PICK_FOLDER);
}

но хотелось бы открыть вид как на картинке.


person t0m    schedule 02.02.2020    source источник


Ответы (2)


Как открыть SAF (Storage Access Framework), чтобы выбрать хранилище как на картинке?

Я предполагаю, что «Выберите путь для сохранения» будет означать, что пользовательский интерфейс пришел из ACTION_CREATE_DOCUMENT. Однако, если вы ожидаете, что ящик откроется автоматически, нет действия Intent, которое делает это.

но это открывает только «Недавние», и пользователь должен щелкнуть ... и «Показать внутреннее хранилище», а после этого выбрать, например, SDCard или внутреннее хранилище. Это не удобно для пользователя.

Не существует задокументированных и поддерживаемых средств автоматического предложения «внутреннего хранилища» в качестве опции. При этом есть хаки, которые вы можете попробовать, принимая во внимание, что нет никаких гарантий что они будут работать на разных устройствах, версиях ОС и т. д. И никто не обязательно открывает этот ящик.

В Intent DocumentsContract.EXTRA_INITIAL_URI есть дополнительные данные, но какое значение я могу добавить, чтобы показать открытый вид, как на картинке?

Нет? EXTRA_INITIAL_URI будет предварительно выбирать какой-либо документ (где Uri — это тот, который вы получили через SAF ранее), но это не обязательно изменит параметры хранения и не обязательно предварительно откроет этот ящик.

person CommonsWare    schedule 02.02.2020

Только для Android Q.

Вы можете использовать createOpenDocumentTreeIntent() //добавлено на уровне API 29

        String choice = "We choose (sdcard)";

        StorageManager sm = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE);

            List<StorageVolume> volumes = sm.getStorageVolumes();

            if (  volumes.size() < 0 ) {
                Toast.makeText(context, "no volumes found", Toast.LENGTH_LONG).show();

                return;
            }

            int nr = -1;

            if (  volumes.size() > 0 && choice.contains("(primary)"))
                nr = 0;
            if (  volumes.size() > 1 && choice.contains("(sdcard)"))
                nr = 1;
            if (  volumes.size() > 2 && choice.contains("(usbdisk"))
                nr = 2;

            if (  nr < 0 ) {
                Toast.makeText(context, "sorry we can not help you", Toast.LENGTH_LONG).show();

                return;
            }

            Intent intent = volumes.get(nr).createOpenDocumentTreeIntent(); //Added in API level 29


            ((Activity) context).startActivityForResult(intent, SELECT_DIRECTORY_CODE);
person blackapps    schedule 02.02.2020
comment
Для Android Q и выше. - person blackapps; 18.09.2020