Java 安卓专家能解释奇怪的USB主机行为吗

Java 安卓专家能解释奇怪的USB主机行为吗,java,android,usb,hid,galaxy-nexus,Java,Android,Usb,Hid,Galaxy Nexus,我正在编写一个Android应用程序来读取HID USB脚踏板的输入(踩下脚踏板,获取消息,做点什么) UsbManager无法识别该设备。脚踏板可能在Android内核中插入时抛出错误,因为我在logcat中看到此错误消息: EventHub无法获取/dev/input/mouse0的驱动程序版本,不是打字机 然而,我知道脚踏板可以工作,因为当我插上并按下它时,它会将焦点切换到活动的下一个按钮。。。因此,我知道它正在与我的Nexus平板电脑通信,显然它的默认操作是将焦点移动到下一个按钮/对象。

我正在编写一个Android应用程序来读取HID USB脚踏板的输入(踩下脚踏板,获取消息,做点什么)

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

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

有没有办法截取这个设备的输入,这样我就可以知道什么时候踩下了脚踏板,即使安卓的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;
}

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

以下是UsbHostManager.java中的相关部分,请参见:


你的问题似乎是Android声称自己拥有HID设备,因此没有像内置USB设备那样将其提供给应用程序。AFAIK android没有一种“断开”系统支持的设备以使其通过API直接可用的非特权方式。假设你修改了平台或者至少有一个“根”设备,你就可以完成一些事情。对于一般用途,最好的解决方案可能是使用不作为HID显示的USB设备,或者将其固件更改为不显示。
/* 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;
}