簡體   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