2017-01-21 14 views
1

Я пытаюсь создать что-то вроде проводника файлов через подключенные USB-устройства (через OTG или USB-порты на Android-телефоне). Все, что мне нужно для этого - это путь, похожий на «/ storage/sda4» и идентификатор устройства, а затем я могу работать с устройством через simle android class File. Является ли звук простым, но я не могу найти информацию об этом, но все поисковики могут это сделать (например, ESExplorer). Хорошо, я найти простой способ получить все подключенные USB-устройства с идентификаторомКак я могу читать файлы с устройства usb на Android?

UsbManager usbManager = (UsbManager) context.getSystemService(Context.USB_SERVICE); 
usbManager.getDeviceList(); 

, но как я могу получить информацию о пути? deviceName содержит что-то вроде этого «/ dev/bus/usb/00x», но это не может мне помочь, мне нужен простой эмулированный путь android («/ storage/sda4»). Эта страница https://developer.android.com/guide/topics/connectivity/usb/host.html сообщает, что мне нужно получить UsbInterfaces и сделать UsbConnection массовым переносом и другой ерундой, я сделал все, но не нашел путь к устройству или любую другую информацию о списке файлов usb.

Хорошо, я найти другой способ, чтобы получить (что не требует разрешения!), Чтобы получить путь ко всем подключенным устройствам

StorageManager storageManager = (StorageManager) context.getSystemService(Context.STORAGE_SERVICE); 
Method getVolumeListMethod = StorageManager.class.getDeclaredMethod("getVolumeList"); 
Object[] storageVolumeList = (Object[]) getVolumeListMethod.invoke(storageManager); 

и он работает, но мне нужно, чтобы идентифицировать устройство (потому что я хочу кеш-файлы разных хранилищ usb), но все, что я могу получить от объекта тома, это mStorageId, mDescriptionId, mPrimary, mRemovable, mEmulated, mMtpReserveSpace, mAllowMassStorage, mMaxFileSize, mOwner, mUuid, mUserLabel, mState, mSubSystem. Ничего из этого не может определить устройство: mDescriptionId и mStorageId: уникальный порт fot usb, mUuid - null, mUserLabel не уникален.

Environment.getExternalFilesDirs() не поможет, он не предоставляет идентификатор устройства и работает только с одним устройством.

Здесь у меня есть аналогичный вопрос, но он не имеет правильного ответа Android list files from USB Drive.

Ну, простой способ получить список устройств USB с путями и идентификаторами существует?

+0

Посмотрите 'getExternalFilesDirs()'. Третьей записью будет диск ust ust. – greenapps

+0

Я только что отредактировал вопрос, я упомянул getExternalStorageDirectory вместо getExternalFilesDirs. Он не предоставляет идентификатор устройства – LamaUltramarine

+0

Для чего вам нужен идентификатор устройства, если вы хотите сделать файловый проводник? Вам нужен только путь. И getExternalFilesDirs() предоставит вам это. Не говорите, что это не так! – greenapps

ответ

1

Все, что мне нужно для этого это путь что-то вроде «/ хранения/sda4» и идентификатор устройства, а затем я могу работать с устройством через simle андроид класса File

Нет, потому что you do not have arbitrary access to removable storage, включая USB OTG, на Android 4.4+.

все файловые исследователи могут это сделать (например ESExplorer)

Предварительно установленный «файловый менеджер» приложения могут иметь дополнительные права, предоставленные им разработчиком ROM производителем устройства или на заказ. В противном случае они также не имеют произвольного доступа к съемному хранилищу.

- это простой способ получить список устройств USB с указанием пути и идентификатора?

Не с пути файловой системы, нет. getStorageVolumes() на StorageManager предоставит вам список томов хранения, который включает в себя внешнее хранилище и съемное хранилище. Затем вы можете использовать createAccessIntent() по телефону StorageVolume, чтобы попросить у пользователя разрешения на работу с томом.Если они предоставляют разрешение, вы получите Uri назад, что:

  • Служит в качестве временного идентификатора для объема (то есть, больше не будет иметь использовать в качестве идентификатора, если пользователь выталкивает носитель, но до тех пор, может отличить один объем от другого), и

  • Позволяет работать с частью содержимого этого тома, хотя с помощью Uri значений, а не файловой системы путей

+0

Большое спасибо за подробный ответ. Я пытаюсь getStorageVolumes, но для этого требуется 24 API и выше, но пока он распространяется не так много. После вашего ответа я понимаю, что только так, как я могу это сделать, это второй второй способ, который я описал, он предоставляет мне путь для всех устройств, и я могу работать с простым файлом класса (я тестировал его на Android 5 и 5.1 :) Возможно это дефект андроида, но это правда. Я буду использовать mUserLabel как id, что в большинстве случаев является уникальным. – LamaUltramarine

+0

StorageManager storageManager = (StorageManager) context.getSystemService (Context.STORAGE_SERVICE); Метод getVolumeListMethod = StorageManager.class.getDeclaredMethod ("getVolumeList"); Объект [] storageVolumeList = (Object []) getVolumeListMethod.invoke (storageManager); Я использую эти строки для получения списка томов хранения, но я получаю только/storage/emulated/0, в то время как мой OTG был связан с pendrive. Почему я не получаю путь для подключенного устройства OTG? – Anupriya

+0

@Anupriya: Возможно, потому, что вы используете отражение, чтобы получить то, что не поддерживается в версии Android, которую вы используете. – CommonsWare