2015-11-07 1 views
10

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

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

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

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

USB properties


EDIT: Некоторые примеры кода.

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. 

EDIT 2: Я проверил еще с некоторыми телефонами. Я успешно перечислил USB устройство со следующими телефонами:

  • Примечание 2
  • LG-V400

Следующие устройства не могли перечислить устройства:

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

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

+0

Опубликовать код, пожалуйста? – napkinsterror

+0

Просто сделал. Это очень простой случай, поэтому я не уверен, насколько он полезен. –

+0

Можете ли вы распечатать результаты? Вы добавили соответствующие разрешения? – napkinsterror

ответ

2

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

+0

Отличный намек на использование 'adb shell dmesg'. [Вот журналы.] (Https://gist.github.com/MikeOrtiz/92fc07d4761ce6e0b4d3). В строках 4-16 он показывает, что перечисление устройств USB не удалось. Я не думаю, что проблема связана с властью. Это устройство потребляет 100 мА по сравнению с другим USB-устройством, которое я могу успешно перечислить, который рисует 500 мА. Есть ли способ лучше понять, что может вызвать проблему? И есть ли обходной путь, даже если нужен корень? –

+1

На этом этапе отладка проблемы дополнительно требует либо создания ядра с большим количеством протоколирования (так что вы можете выяснить, какие запросы терпят неудачу и, возможно, более подробно), или купить сниффер протокола USB, чтобы увидеть, что что-то необычное происходит на проводе. –

1

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

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

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

Kaamel