Получите внешний путь к хранилищу для USB-флешки с Android 6.0.1

Используя Android 6.0.1 (API23) на Nexus 5X,

Различные версии Android и способы доступа к внешнему хранилищу (например, к USB-накопителю в моем случае) могут сбивать с толку. Насколько я понял, вам нужно предоставить разрешения в своем манифесте следующим образом:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />

После этого вы сможете получить доступ к внешнему хранилищу ..

Вот мой подход к тому, как получить путь к внешнему хранилищу, используя метод getExternalFilesDirs (). Но оказывается, распознается только внутренняя SD-карта (т.е. первый элемент массива, возвращаемый методом).

Из того, что я читал, должно быть больше элементов массива, возвращаемых методом "getExternalFilesDirs ()", если к телефону подключено больше устройств внешней памяти. Но в моем случае ни один из них недоступен.

Вот мой код:

    String strInfo = "";
    File folders[] = getExternalFilesDirs(null);
    // File folders[] = ContextCompat.getExternalFilesDirs(this,null);
    strInfo += "\ngetExternalFilesDirs(null):\n";
    for(File f : folders){
        strInfo += f.getAbsolutePath() + "\n";
    }
    if (folders.length > 1) {
        Toast.makeText(this, "nr of folders = " + folders.length + "/ info = " + strInfo, Toast.LENGTH_SHORT).show();
        File myFile = new File(folders[1], "testfile.txt");
    } else {

    // !!!!!!!!!!!!! Keep ending up in this case, even tough a USB-stick is
    // connected to the phone (...also tried with a second SD-card
    // connected...but same thing, keeeping up ending here... 
    // any idea WHY ???????????????

        Toast.makeText(this, "No external storage device found / info = " + strInfo, Toast.LENGTH_SHORT).show();
    }

В конце концов, я хотел бы создавать файлы и папки на внешнем USB-накопителе. Может ли кто-нибудь подсказать мне надежный метод создания новых файлов и папок на USB-накопителе, подключенном к телефону Android-6.0.1 ?? Я ценю это.


person iKK    schedule 13.08.2016    source источник
comment
Какое устройство? В 6.0 ..FilesDirs () обычно будет содержать путь. Упоминается ли съемная карта micro SD, используемая как портативная?   -  person greenapps    schedule 13.08.2016
comment
a reliable method on how to create new files and folders on an USB-stick. Там нет ничего особенного в создании файлов. Я думаю, ваша проблема заключалась в поиске пути к USB-накопителю.   -  person greenapps    schedule 13.08.2016
comment
Насколько я понял, вам нужно дать разрешения в своем манифесте, а именно - нет. Они не относятся к съемному хранилищу. должно быть больше элементов массива, возвращаемых с помощью getExternalFilesDirs () - вы уверены, что устройство распознает ваш USB-накопитель? Он должен появиться в разделе «Хранилище и USB» в настройках, и там должен быть Notification, позволяющий исследовать или извлекать том.   -  person CommonsWare    schedule 13.08.2016
comment
After that you should be able to access external storage.. Нет. В версии 6.0 вы должны запрашивать разрешения на выполнение. Теперь ты? Или вы зашли в настройки своего приложения, чтобы установить их вручную?   -  person greenapps    schedule 13.08.2016
comment
Спасибо за множество ответов. Вот мой ответ на большинство ваших вопросов:   -  person iKK    schedule 13.08.2016
comment
@greenapps: Device = Nexus-5X (у него есть SD-карта внутри, которая распознается как первое внешнее хранилище). Но я не хочу писать туда, я хочу записывать файлы и папки на внешний USB-накопитель. А для этого мне нужен ее путь ...   -  person iKK    schedule 13.08.2016
comment
@CommonsWare: Хорошо, тогда я оставлю разрешения для манифеста .... И да, USB-накопитель распознается в настройках (в разделе «Хранилище и USB»), и да, если я загружаю разрешения следующим образом, я также получаю уведомление с запросом разрешить MyApp доступ к фотографиям, мультимедиа и файлам на моем устройстве. Разрешение, которое я вызываю с помощью следующего кода (см. Следующий ответ)   -  person iKK    schedule 13.08.2016
comment
@ CommonsWare: вот мой код: private void loadPermissions (String perm, int requestCode) {if (ContextCompat.checkSelfPermission (this, perm)! = PackageManager.PERMISSION_GRANTED) {if (! ActivityCompat.shouldShowRequestPermissionRationale (this, perm)) {ActivityCompat. requestPermissions (this, new String [] {perm}, requestCode); }}}   -  person iKK    schedule 13.08.2016
comment
@greenapps: я попробовал оба (т.е. запросить разрешение на выполнение с только что полученным ответом /, а также в разделе `` Настройки '', чтобы включить их вручную ...)   -  person iKK    schedule 13.08.2016
comment
Или как именно на 6.0 запрашивать разрешения времени выполнения ??   -  person iKK    schedule 13.08.2016
comment
I want to write files and folders on an external USB-stick. And for that I need its path. Почему ты повторяешься? Конечно, я это понимал.   -  person greenapps    schedule 13.08.2016
comment
I tried......to put them on manually.... Что ж, у вас получилось?   -  person greenapps    schedule 13.08.2016
comment
@greenapps: Да, мне удалось установить их вручную, а также из кода. Но я думаю, что мой настоящий вопрос, стоящий за всем этим, заключается в том, как записать файлы и папки на USB-накопитель из кода? (я предполагал, что сначала нужно получить путь, а затем использовать некоторый код файлового потока для записи файлов ...). Я прав в этом? Или у вас есть альтернативный способ записи файлов и папок на USB-флешку ??   -  person iKK    schedule 13.08.2016
comment
Способ записи такой же, как и всегда. Если у тебя есть путь, ты можешь идти. Я думал, что ваша проблема заключалась в том, чтобы получить путь к каталогу приложения, так как только там вы можете писать. Если вы знаете путь, то для теста запишите его жестко и продолжайте.   -  person greenapps    schedule 13.08.2016
comment
Нет, у меня нет пути. Из моего первоначального вопроса вы можете увидеть, как я пытался получить путь (т.е. используя getExternalFilesDirs ()), но, как оказалось, это возвращает мне значение null вместо желаемого пути к USB-накопителю.   -  person iKK    schedule 13.08.2016
comment
Думаю, вы можете найти путь с помощью любого приложения для просмотра файлов на вашем устройстве.   -  person greenapps    schedule 13.08.2016
comment
Что еще нужно (кроме предоставления разрешения вручную или из кода?). Правильно ли мой код-разрешение в приведенном выше ответе? Чего здесь еще не хватает?   -  person iKK    schedule 13.08.2016
comment
Мы прокомментировали что-то упущенное? Мы только прокомментировали, что вам нужно найти путь.   -  person greenapps    schedule 13.08.2016
comment
Я попробовал ESFileExplorer именно для этого. Но при этом я вижу только / 1002 / UsbStorage, который не может быть полным путем или нет?   -  person iKK    schedule 13.08.2016
comment
Как я могу проверить, является ли этот (или любой другой) правильный путь для моего внешнего USB-накопителя? Любой пример кода по этому поводу?   -  person iKK    schedule 13.08.2016
comment
Действительно. Это не нормальный абсолютный путь. Загляните в / storage, вы можете найти что-то вроде / storage / A1B2-2014.   -  person greenapps    schedule 13.08.2016
comment
в / storage нахожу: две папки 1.emulated / 2. self (обе пустые). ... т.е. конечно с подключенной флешкой ...   -  person iKK    schedule 13.08.2016
comment
@CommonsWare: Спасибо - я посмотрю на это ..   -  person iKK    schedule 13.08.2016
comment
Значит, ES File Explorer может показать вам содержимое USB-накопителя? Попробуйте найти абсолютный путь к некоторым файлам, чтобы узнать абсолютный путь к диску. Или, может быть, используется Storage Access Framework.   -  person greenapps    schedule 13.08.2016
comment
Как я могу узнать, используется ли Storage Access Framework (... и что именно;))   -  person iKK    schedule 13.08.2016
comment
Подключаю еще один USB-адаптер с SD-картой внутри и теперь EsFileExplorer показывает / storage / 6236-6330 Но это не каталог. Как мне теперь записать туда файл?   -  person iKK    schedule 13.08.2016
comment
Любая USB-карта, которую я подключаю, не показывает ничего в / storage (адаптер USB-to-SDcard показывает / storage / 6236-6330, как упоминалось). Вопрос, почему USB-флешки ничего не показывают в EsFileExplorer (настройки- ›Разрешения-› Хранилище- ›установить вручную)   -  person iKK    schedule 13.08.2016
comment
Наконец нашел весь путь: usb: // 1002 / myStick / (... но полезно ли это здесь?) Я все больше и больше теряюсь ...   -  person iKK    schedule 13.08.2016
comment
Опять же, вы упомянули: you might find something like /storage/A1B2-2014 Я нашел / storage / F49E-14F2 (или / storage / A6236-6330 для другого USB-накопителя). Но что мне теперь с этим делать? Как мне теперь записать туда файл или папку? Любая помощь приветствуется   -  person iKK    schedule 13.08.2016
comment
В чем проблема? У тебя есть путь. Затем вы можете попробовать создать на нем каталоги и файлы, как обычно. Вы сделали все это раньше, чем я подумал.   -  person greenapps    schedule 13.08.2016
comment
да, но .. я могу попробовать еще раз ...   -  person iKK    schedule 13.08.2016
comment
Еще один вопрос: мне кажется, что / storage / A1B2-2014 - это не папка (или нет?). Как мне создать файл myFile = ??? (указывая на правильный путь? Может, я что-то не так делаю ...   -  person iKK    schedule 13.08.2016
comment
Путь к строке = / storage / A1B2-2014 / myfolder; Подкаталог файла = новый файл (путь); if (! subdir.exists ()) if (! subdir.mkdirs ()) {тост, извините, не удалось создать каталог; возвращение;}   -  person greenapps    schedule 13.08.2016
comment
А почему ты думаешь, это не папка? Вы можете просматривать его с помощью файлового проводника, не так ли?   -  person greenapps    schedule 13.08.2016
comment
Я думаю, что это не папка, поскольку в ESFileExplorer (или в TotalCommander) я не могу просматривать в ней. Также ваш приведенный выше код попадает в could not make directory ... Я действительно думаю, что это все еще неправильный путь. Кроме того, остается вопрос, почему File folders[] = getExternalFilesDirs(null); предоставляет только одну папку (то есть папку для SD-карты, встроенной в мой Nexus5X), но не другую папку-массив. Предположительно он должен вернуть массив со ВСЕМИ внешними хранилищами (включая USB-флешки или несколько внешних SD-карт ...). Но это не так. Почему ? (Я использую Android 6.0.1 и API 23)   -  person iKK    schedule 14.08.2016


Ответы (1)


Чтобы закрыть это: USB-накопители, к сожалению, не работают как ВТОРИЧНОЕ ХРАНИЛИЩЕ (= внешнее хранилище) для мобильных телефонов Android.

Я только что нашел эту ссылку, в которой говорится:

External storage devices returned here are considered a permanent part
of the device, including both emulated external storage and physical
media slots, such as SD cards in a battery compartment. The returned
paths do not include transient devices, such as USB flash drives.

И аналогично, официальная документация Android по getExternalFilesDirs () говорит:

The returned paths do not include transient devices, such as USB flash drives 
connected to handheld devices.

Если кто-нибудь знает USB-накопитель C-типа, который действительно соответствует требованиям ВТОРИЧНОГО ХРАНИЛИЩА, пожалуйста, дайте мне знать! То же самое, если кто-нибудь знает адаптеры SD-карт USB-C-типа, которые работают как ВТОРИЧНОЕ ХРАНИЛИЩЕ, пожалуйста, дайте мне знать ...

Жаль, что я не могу записывать файлы и папки из своего приложения java для Android на внешний USB-накопитель :(

person iKK    schedule 13.08.2016