2013-08-25 1 views
0

Я пишу приложение для Android, чтобы читать ввод с педали HID USB (нажмите педаль, получите сообщение, сделайте что-нибудь).Может ли Android-эксперт объяснить странное поведение хоста USB

UsbManager не распознает устройство. Педаль педали может вызывать ошибку в ядре Android, когда она подключается, потому что я вижу это сообщение об ошибке в logcat: «EventHub не смог получить версию драйвера для/dev/input/mouse0, а не пишущей машинки»

Тем не менее, я знаю, что педаль работает, потому что, когда я подключаю ее и нажимаю на нее, она меняет фокус на следующую кнопку в действии ... Поэтому я знаю, что он общается с моим планшетом Nexus и, по-видимому, его действие по умолчанию - это переместите фокус на следующую кнопку/объект. Я не думаю, что есть какие-то проблемы с моим кодом, так как он распознает другие USB-устройства, а не эту ножную педаль. Я могу сказать, когда он нажат, проверяя, когда меняется фокус, но это не будет работать для того, что я хочу, поскольку это приложение будет работать в фоновом режиме в качестве службы. Я попытался установить фильтр намерений для этого конкретного устройства USB (я знаю его идентификатор продукта и идентификатор поставщика). Тем не менее, он по-прежнему не показывает подключенных устройств, и всплывающее сообщение, которое должно попросить пользователя подтвердить запуск приложения, никогда не появляется. Я пробовал просто перечислять все подключенные USB-устройства, но я всегда получаю пустой список.

Есть ли способ перехватить вход с этого устройства, чтобы я мог сказать, когда нажата педаль, даже если Android-менеджер Android не узнает его?

Для полноты, вот мой код. Я проверяю на Galaxy Nexus 10 таблетки:

public int list_usb_devices() 
{ 
    int device_count = 0; 
    UsbManager mUsbManager; 
    mUsbManager = (UsbManager) getSystemService(Context.USB_SERVICE); 
    String LOG_TAG = "USB"; 
    for (UsbDevice device : mUsbManager.getDeviceList().values()) { 

     //This code is never reached... 

     Log.d(LOG_TAG, "Detected device: " + device.toString()); 
     Log.d(LOG_TAG, "Model: " + device.getDeviceName()); 
     Log.d(LOG_TAG, "Id: " + device.getDeviceId()); 
     Log.d(LOG_TAG, "Class: " + device.getDeviceClass()); 
     Log.d(LOG_TAG, "Protocol: " + device.getDeviceProtocol()); 
     Log.d(LOG_TAG, "VendorId: " + device.getVendorId()); 
     Log.d(LOG_TAG, "ProductId: " + device.getProductId()); 

     CharSequence text = device.toString(); 
     show_toast(text); 

     device_count++; 
    } 
    return device_count; 
} 
+0

Ваша проблема, кажется, что Android претендует газоразрядной само устройство, и поэтому не делает его доступным для применения в так это было бы USB-устройством, с которым у него не было встроенного способа общения. AFAIK android не имеет непривилегированного способа «отсоединения» системного устройства, чтобы сделать его доступным напрямую через API. Предположительно, если вы модифицируете платформу или, по крайней мере, имеете «корневое» устройство, которое вы могли бы выполнить. Для общего использования лучшим решением может быть использование USB-устройства, которое не отображается как HID, или изменить его прошивку. –

ответ

1

Я сделал некоторые исследования в источнике Android и кажется, что все HID загрузочные устройства (мышь, клавиатура и т.д.) находятся в черном списке, и поэтому не могут быть доступны с помощью API USBManager.

Вот соответствующая часть из UsbHostManager.java, смотрите здесь: http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/com/android/server/usb/UsbHostManager.java/?v=source

/* returns true if the USB device should not be accessible by applications */ 
private boolean isBlackListed(int clazz, int subClass, int protocol) { 
    // blacklist hubs 
    if (clazz == UsbConstants.USB_CLASS_HUB) return true; 

    // blacklist HID boot devices (mouse and keyboard) 
    if (clazz == UsbConstants.USB_CLASS_HID && 
      subClass == UsbConstants.USB_INTERFACE_SUBCLASS_BOOT) { 
     return true; 
    } 

    return false; 
}