0

HID USBフットペダルからの入力を読み取るAndroidアプリケーションを作成しています(ペダルを押す、メッセージを取得する、何かをする)。

UsbManager がデバイスを認識していません。logcat に次のエラー メッセージが表示されるため、プラグイン時に Android カーネルでフット ペダルがエラーをスローしている可能性があります。「EventHub could not get driver version for /dev/input/mouse0, not a typewriter」

ただし、フットペダルが機能することはわかっています。プラグを差し込んで押すと、フォーカスがアクティビティの次のボタンに変わるためです...したがって、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=ソース

/* 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 に答える