0

我正在编写一个 Android 应用程序来读取来自 HID USB 脚踏板的输入(按下踏板,获取消息,做某事)。

UsbManager 无法识别设备。脚踏板插入时可能会在 Android 内核中引发错误,因为我在 logcat 中看到此错误消息:“EventHub 无法获取 /dev/input/mouse0 的驱动程序版本,而不是打字机”

但是,我知道脚踏板可以工作,因为当我插入并按下它时,它会将焦点更改为活动上的下一个按钮......所以我知道它正在与我的 Nexus 平板电脑进行通信,显然它的默认操作是将焦点移动到下一个按钮/对象。我认为我的代码没有任何问题,因为它可以识别其他 USB 设备,而不是这个脚踏板。实际上,我可以通过检查焦点何时更改来判断它何时被按下,但这不适用于我想要的,因为该应用程序将作为服务在后台运行。我尝试为这个特定的 USB 设备设置一个意图过滤器(我知道它的产品 ID 和供应商 ID)。但是,它仍然显示没有连接的设备,并且应该要求用户确认启动应用程序的弹出消息从未出现。我'

有什么方法可以拦截来自该设备的输入,以便我可以知道何时踩下脚踏板,即使 Android 的 USB 管理器无法识别它?

为了完整起见,这是我的代码。我正在 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;
}
4

1 回答 1

1

我在 Android 源代码中做了一些研究,似乎所有 HID 启动设备(鼠标、键盘等)都被列入黑名单,因此无法使用 USBManager API 访问。

这是 UsbHostManager.java 的相关部分,请参见此处: http: //grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/com/android/服务器/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;
}
于 2014-04-19T13:07:13.600 回答