Как я могу читать файлы с USB-устройства на Android?

Я пытаюсь создать что-то вроде проводника файлов через подключенные USB-устройства (через OTG или USB-порты на Android TV). Все, что мне для этого нужно, - это что-то вроде "/storage/sda4" и идентификатор устройства, и тогда я смогу работать с устройством с помощью простого класса Android. Звучит просто, но я не могу найти никакой информации об этом, но все исследователи файлов могут это сделать (например, ESExplorer). Хорошо, я нашел простой способ получить все подключенные USB-устройства с идентификатором

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 являются уникальными для USB-порта, mUuid является нулевым, mUserLabel не является уникальным.

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

Я нахожу подобный вопрос здесь, но он не имеет права отвечать на список файлов Android с USB-накопителя.

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

1 ответ

Решение

Все, что мне нужно для этого, это путь что-то вроде "/storage/sda4" и идентификатор устройства, а затем я могу работать с устройством через файл класса Android Simle

Нет, потому что у вас нет произвольного доступа к съемному хранилищу, включая USB OTG, в Android 4.4+.

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

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

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

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

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

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

Другие вопросы по тегам