正如标题所述,我在使用 UsbManager.getDeviceList() 枚举支持 USB 的 Android 手机上的特定 USB 设备时遇到了麻烦。我在这台手机和其他手机上枚举和与其他 USB 设备通信没有问题,但是找不到这个特定的 USB 设备。它也不能用USB Device Info等 3rd 方应用程序枚举。
下面是在 PC 上正确枚举的 USB 属性。我已与设备制造商进行了沟通,他们已确认外部公司认证该设备符合 USB 2.0 规范。最初,我怀疑该设备被 Android 拒绝,因为它省略了以下字段:iManufacturer、iProduct 和 iSerialNumber,其他兼容设备包含这些字段。但是,在查看了USB 2.0 规范第 9.5 节的摘录后,这些字段似乎不是必需的:
在适当的情况下,描述符包含对字符串描述符的引用,这些字符串描述符以人类可读的形式提供描述描述符的可显示信息。字符串描述符的包含是可选的。但是,描述符中的引用字段是强制性的。如果设备不支持字符串描述符,则必须将字符串引用字段重置为零以指示没有可用的字符串描述符。
那么,我的问题是,是什么导致 UsbManager 拒绝枚举此 USB 设备?而且,更重要的是,我能做些什么来强制 Android 枚举这个设备吗?理想情况下,我对不需要 root 访问权限的解决方案最感兴趣,但它不一定会破坏交易。
编辑:一些示例代码。
UsbManager usbManager = (UsbManager) getSystemService(Context.USB_SERVICE);
HashMap<String, UsbDevice> deviceList = usbManager.getDeviceList();
// When I plug in this USB device, deviceList is empty.
// Other devices are discoverable, however.
编辑 2:我已经用更多的手机进行了测试。我已经成功枚举了以下手机的 USB 设备:
- 笔记2
- LG-V400
以下设备无法枚举该设备:
- 连结 5
- 银河 S4、S5、S6
- LG G2、4G LTE
编辑 3:这是插入 USB 设备后调用Nexus 5的日志。adb shell dmesg
您可以在第 4-16 行清楚地看到电话无法枚举设备。