Как открыть SAF (Storage Access Framework) для выбора хранилища? - PullRequest
0 голосов
/ 02 февраля 2020

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

Я пытался:

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);
}

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

Ответы [ 2 ]

1 голос
/ 02 февраля 2020

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

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

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

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

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

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

0 голосов
/ 02 февраля 2020

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

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

        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;

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