Как SAF (структура доступа к хранилищу) распознает ваш USB-накопитель?

Используя Android 6.0.1, API 23,

Как сделать так, чтобы USB-накопитель, подключенный к вашему Android-телефону, был виден в средстве выбора SAF, которое отображает всех подходящих поставщиков документов (включая ваш USB-накопитель)? Более того, как настроить SAF для создания файлов и папок на портативном USB-накопителе ??

В документации по SAF я попробовал:

public void performFileSearch() {

    Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);

    intent.addCategory(Intent.CATEGORY_OPENABLE);

    // in my case, showing only text-files is enough, therefore I guess the type is as follows:
    intent.setType("text/plain");

    startActivityForResult(intent, READ_REQUEST_CODE);
}

Но портативное USB-хранилище не входит в выбор сборщика ...

Что мне не хватает? Есть ли пример проекта, который показывает необходимые шаги?

@CommonsWare: Вот желаемый снимок экрана:

введите описание изображения здесь


person iKK    schedule 14.08.2016    source источник
comment
Что мне не хватает? - вам не хватает снимков экрана, показывающих, что вы видите в ACTION_OPEN_DOCUMENT пользовательском интерфейсе. Есть ли пример проекта, который показывает необходимые шаги? - этот образец приложения отлично работает на моем Nexus 5X с USB-OTG-накопитель для создания или открытия файлов. Он использует тот же код, что и у вас.   -  person CommonsWare    schedule 14.08.2016
comment
Спасибо - посмотрю на ваш проект (сложно клонировать, сложно ...). На данный момент у меня нет рабочего образца проекта, поскольку я новичок в мире SAF в Android. Что меня больше всего сбивает с толку, так это то, как мое приложение получит доступ к USB-накопителю ?? Требуется ли второе приложение, которое предоставляет SAF-DocumentProvider, или мое приложение тоже может это сделать - и если да, то как именно? Мне не хватает того, как мое приложение распознает любой подключенный USB-накопитель. Что именно там нужно с точки зрения разрешений и SAF-методов ???   -  person iKK    schedule 14.08.2016
comment
Что меня больше всего сбивает с толку, так это то, как мое приложение получит доступ к USB-накопителю? - вы получите Uri обратно в onActivityResult(), который вы используете с ContentResolver, DocumentFile и т. д. Требуется ли второе приложение, которое предоставляет SAF-DocumentProvider, или мое приложение тоже может это сделать - и если да, то как именно? - то, что предусмотрено устройством. Если ваше устройство этого не делает, значит, производитель вашего устройства или разработчик пользовательского ПЗУ что-то напортачил. Опять же, ваш код в порядке. Вот почему я предлагаю вам публиковать скриншоты того, что вы видите.   -  person CommonsWare    schedule 14.08.2016
comment
Что касается необходимого SAF-материала для того, чтобы мое приложение распознавало любой USB-накопитель, я увидел разрешение WRITE_EXTERNAL_STORAGE. Я видел intent.category.DEFAULT-intentfilter и службу под названием .DocumentStorageService (не уверен, зачем нужна точка). Это все, что требуется, или мне еще чего-то не хватает?   -  person iKK    schedule 14.08.2016
comment
В вашем примере я не могу найти performFileSearch (), чтобы узнать, как вы это сделали ... Где это могло быть?   -  person iKK    schedule 14.08.2016
comment
Повторяю, ВАШ КОД В ЧЁРНОМ. Сделайте несколько снимков экрана того, какой интерфейс появляется при запуске кода из вашего вопроса. Затем отредактируйте свой вопрос и загрузите эти скриншоты.   -  person CommonsWare    schedule 14.08.2016
comment
Вот скриншот. Вопрос тот же: почему подключенный USB-накопитель не отображается в списке выбора ContentProvider SAF ?? Как видно на скриншоте, флешка не появляется. Мой образец-проект идентичен приведенному здесь здесь образцу DevBytes, за исключением того, что в моем коде одно крошечное изменение по сравнению с DevBytes-sample-code, а именно: performFileSearch() немного изменилось по сравнению с тем, что я упомянул в исходном вопросе выше (т.е. intent.setType("text/plain"); вместо intent.setType("image/*");   -  person iKK    schedule 14.08.2016


Ответы (1)


Я только что нашел решение проблемы:

Запуск приложения SAF-client (как здесь), включая мое крошечное изменение внутри performFileSearch() ( т.е. intent.setType("text/plain"); вместо того, что было в исходном DevBytesesample, intent.setType("image/*");, решение выглядит следующим образом:

Если вы зайдете в «Настройки» (т.е. три вертикальные точки), вы можете выбрать: «Показать внутреннюю память» - и готово !!

После этого при подключении любой USB-накопитель отображается по желанию в средстве выбора ContentProvider в SAF (см. Снимок экрана ниже)!

... понятия не имею, почему внешне подключенная флешка проходит как "внутреннее хранилище" ??? (если кто-то знает ответ на эту загадку, я очень признателен!) ... В общем, рад наконец увидеть, как появилась USB-флешка !!

введите описание изображения здесь

person iKK    schedule 14.08.2016
comment
Ах, я все время забываю, что это можно переключать, вот почему я это видел. Я ненавижу этот аспект SAF. В данном случае под внутренним понимаются файловые системы. Если у вас настроен Google Диск, Dropbox или другие приложения, они также будут отображаться в средстве выбора, независимо от того, включено или отключено внутреннее хранилище. Приношу свои извинения за то, что забыл об этом. - person CommonsWare; 14.08.2016
comment
Никаких извинений за это, пожалуйста. В любом случае вы мне очень помогли, настаивая на скриншотах :), а также упомянули, что код в порядке. Это помогло! Спасибо. - person iKK; 14.08.2016
comment
Dropbox не появится, потому что он еще не поддерживает SAF. Вам нужно будет отправить ACTION_GET_CONTENT намерение, чтобы появился Dropbox. - person guillaume-tgl; 09.08.2017