为什么UsbManager.getDevicesList()可以枚举此特定设备?

时间:2015-11-07 01:30:09

标签: android usb android-usb

正如标题所述,我在使用UsbManager.getDeviceList()在具有USB功能的Android手机上枚举特定USB设备时遇到了麻烦。我在此手机和其他手机上枚举和与其他USB设备通信时没有遇到任何问题,但找不到这个特定的USB设备。它也无法使用第三方应用进行枚举,例如USB Device Info

以下是在PC上正确枚举的USB属性。我已与设备制造商沟通,该设备制造商已确认外部公司认证该设备符合USB 2.0规范。最初,我怀疑该设备被Android拒绝,因为它省略了以下字段:iManufacturer,iProduct和iSerialNumber,它们被其他兼容设备包含。但是,在审核了USB 2.0 Spec的第9.5节中的摘录后,似乎这些字段似乎没有必要:

  

在适当的情况下,描述符包含对字符串描述符的引用,这些字符串描述符提供以人类可读形式描述描述符的可显示信息。包含字符串描述符是可选的。但是,描述符中的引用字段是必需的。如果设备不支持字符串描述符,则必须将字符串引用字段重置为零,以指示没有可用的字符串描述符。

那么,我的问题是什么导致UsbManager拒绝枚举这个USB设备?而且,更重要的是,有什么我可以做的,迫使Android枚举这个设备?理想情况下,我最感兴趣的是一个不需要root访问权限的解决方案,但它不一定是一个交易破坏者。

USB properties

编辑:一些示例代码。

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

以下设备无法枚举设备:

  • Nexus 5
  • Galaxy S4,S5,S6
  • LG G2,4G LTE

编辑3:Here are the logs在插入USB设备后,在Nexus 5上呼叫adb shell dmesg。您可以在第4-16行清楚地看到手机无法枚举设备。

2 个答案:

答案 0 :(得分:2)

将USB设备连接到Android手机后,断开连接并将手机连接到计算机,以便使用adb shell dmesg查看内核日志。如果您看到设备显示在内核日志中,那么手机就会识别它,我不知道为什么UsbManager没有返回它。我怀疑它不会出现在内核日志中,否则会出现错误。这可能意味着该设备与手机的OTG控制器不兼容,或者没有足够的电量来正常工作。

答案 1 :(得分:1)

我没有解决方案,甚至可能没有任何有用的提示,但错误似乎有些可以解释:

#define EOVERFLOW 75 /* Value too large for defined data type */

希望这会导致解释并最终解决问题。

Kaamel