繁体   English   中英

Android专家可以解释奇怪的USB主机行为

[英]Can an Android Expert Explain Strange USB Host Behavior

我正在编写一个Android应用程序,以从HID USB脚踏板读取输入(按下踏板,获取消息,执行某些操作)。

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

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

有什么方法可以拦截来自此设备的输入,以便即使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;
}

我在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/ 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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM