java - Android 专家能否解释奇怪的 USB 主机行为

标签 java android usb hid galaxy-nexus

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

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

但是,我知道脚踏板可以工作,因为当我插入并按下它时,它会将焦点更改为 Activity 的下一个按钮...所以我知道它正在与我的 Nexus 平板电脑通信,并且显然是它的默认设置操作是将焦点移动到下一个按钮/对象。我不认为我的代码有任何问题,因为它可以识别其他 USB 设备,但不能识别这个脚踏板。实际上,我可以通过检查焦点何时发生变化来判断何时按下它,但这不适用于我想要的,因为该应用程序将作为服务在后台运行。我尝试为这个特定的 USB 设备设置一个 Intent 过滤器(我知道它的产品 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;
}

关于java - Android 专家能否解释奇怪的 USB 主机行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18431625/

相关文章:

android - Flutter - 在 ThemeData 中使用自定义颜色和主题

android - android如何在按下按钮时停止音频线程?

Android 设备管理员 - 禁用未应用于(多用户) guest 帐户的相机

android - BroadcastReceiver 异步 onReceive

c++ - 在 C++ 中接收 USB 设备插入的通知/事件/信号

java - 如何将鼠标位置(以像素为单位)转换为网格上的行和列?

java - 如何允许在此 Java 代码中检查两个以上的单词

linux - 如何使用 udev 识别设备

java - 在 Java 中使用 Enum 进行工厂,最佳实践?

java - 请解释 RestTemplate