我正试图通过连接的usb设备(通过OTG或安卓电视上的usb端口)创建类似文件资源管理器的东西。我所需要的只是一个类似"/storage/sda4"的路径和设备标识符,然后我可以通过simle 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告诉我需要获得UsbInterface并使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()没有帮助,它不提供任何设备id,只适用于一个设备。
我在这里找到了一个类似的问题,但它没有正确的答案从USB驱动器的Android列表文件。
那么,有没有一种简单的方法可以获得带有路径和标识符的usb设备列表?
我所需要的只是一个类似于"/storage/sda4"的路径和设备标识符,然后我可以通过simle android class File 使用设备
否,因为您无法在Android 4.4+上任意访问可移动存储,包括USB OTG驱动器。
所有文件浏览器都可以执行此操作(例如ESExplorer)
预装的"文件资源管理器"应用程序可能具有由设备制造商或自定义ROM开发人员授予的额外权限。否则,他们也无法任意访问可移动存储。
是否有一种简单的方法可以获得带有路径和标识符的usb设备列表?
没有文件系统路径,没有。StorageManager
上的getStorageVolumes()
将为您提供存储卷列表,其中包括外部存储和可移动存储。然后,您可以在StorageVolume
上使用createAccessIntent()
来请求用户允许使用该卷。如果他们授予许可,你会得到一个Uri
,它是:
-
用作卷的临时标识符(即,如果用户弹出媒体,将不再可用作标识符,但在此之前,可以区分一个卷和另一个卷),以及
-
允许您使用该卷的一部分内容,尽管使用的是
Uri
值,而不是文件系统路径