Почему это конкретное устройство не может быть перечислено UsbManager.getDevicesList()?

Как гласит заголовок, у меня возникают проблемы при перечислении определенного USB-устройства на Android-телефоне с поддержкой USB с помощью UsbManager.getDeviceList(). У меня не было проблем при перечислении и связи с другими USB-устройствами на этом и других телефонах, но это конкретное USB-устройство не может быть найдено. Его также нельзя перечислить сторонними приложениями, такими как информация об устройстве USB.

Ниже приведены свойства USB, правильно перечисленные на ПК. Я связался с производителем устройства, который подтвердил, что сторонняя фирма сертифицировала устройство в соответствии со спецификацией USB 2.0. Первоначально я подозревал, что устройство было отклонено Android, поскольку в нем отсутствовали следующие поля: iManufacturer, iProduct и iSerialNumber, которые были включены другими совместимыми устройствами. Тем не менее, кажется, что эти поля не нужны после просмотра этого фрагмента из Раздела 9.5 спецификации USB 2.0:

Где это уместно, дескрипторы содержат ссылки на строковые дескрипторы, которые предоставляют отображаемую информацию, описывающую дескриптор в удобочитаемой форме. Включение строковых дескрипторов не является обязательным. Однако ссылочные поля в дескрипторах являются обязательными. Если устройство не поддерживает строковые дескрипторы, поля ссылки на строку должны быть сброшены на ноль, чтобы указать, что строковый дескриптор недоступен.

Мой вопрос, то, что заставляет UsbManager отклонить перечисление этого USB-устройства? И, что более важно, могу ли я что-то сделать, чтобы заставить Android перечислить это устройство? В идеале меня больше всего интересует решение, которое не требует корневого доступа, но оно не обязательно нарушает условия сделки.

Свойства USB


РЕДАКТИРОВАТЬ: некоторые примеры кода.

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
  • Galaxy S4, S5, S6
  • LG G2, 4G LTE

РЕДАКТИРОВАТЬ 3: Вот журналы от звонка adb shell dmesg на Nexus 5 после подключения USB-устройства. В строках 4-16 четко видно, что телефон не может перечислить устройство.

2 ответа

После подключения устройства USB к вашему телефону Android отключите его и подключите телефон к компьютеру, чтобы вы могли использовать adb shell dmesg посмотреть журнал ядра. Если вы видите, что устройство отображается в журнале ядра, то телефон распознает его, и я не уверен, почему оно не возвращается UsbManager. Я подозреваю, что он не будет отображаться в журнале ядра или там будет ошибка. Это, вероятно, означает, что устройство несовместимо с контроллером OTG телефона или не получает достаточно энергии для правильной работы.

У меня нет решения и, возможно, даже нет полезной подсказки, но ошибка кажется несколько объяснимой:

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

Надеюсь, что это приводит к объяснению и в конечном итоге к решению.

Kaamel

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