8

最近USBホストアプリをコーディングしていますが、デバイスの接続/取り外しイベントを検出できないため、スタックしています。 http://developer.android.com/guide/topics/connectivity/usb/hostのコーディングノートに従いました .htmlを参照して、ネットワーク内の他のコーディングを参照してください。何度か確認しても、まだ問題が見つかりません。デバッグ後、UsbManager.ACTION_USB_DEVICE_ATTACHED/UsbManager.ACTION_USB_DEVICE_DETACHED インテントが発生していないようです。 Context.sendBroadcast() を使用してカスタマイズされたインテントを送信しようとしており、BroadcastReceiver がインテントを受信できるためです。しかし、USB デバイスを取り付けたり取り外したりすると、BroadcastReceiver が実行されません。私が使用している携帯電話は HTC One-X です。マウス機能は完全に機能しているので、OTG 機能は正しいと確信しています。これが私のコードです。

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.launcher);
    mUsbManager = (UsbManager)getSystemService(Context.USB_SERVICE);
    if(mUsbManager == null) {
        Log.d(TAG, "mUsbManager is null");
    }

    // listen for new devices
    IntentFilter filter = new IntentFilter();
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);
    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED);
  // filter.addAction("MyTest");
    registerReceiver(mUsbReceiver, filter);

}

ブロードキャストレシーバー

BroadcastReceiver mUsbReceiver = new BroadcastReceiver() {
    public void onReceive(Context context, Intent intent) {
        Log.d(TAG, "mUsbReceiver.onReceive start");
        String action = intent.getAction();
        UsbDevice device = (UsbDevice)intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(action)) {
            setDevice(device);
        } else if (UsbManager.ACTION_USB_DEVICE_DETACHED.equals(action)) {
            if (mDevice != null && mDevice.equals(device)) {
                setDevice(null);
            }
        }
    }
};

マニフェスト.xml

<uses-feature android:name="android.hardware.usb.host" />
<uses-permission android:name="android.permission.USB_PERMISSION" />
<uses-sdk android:minSdkVersion="12" />

<application>
    <activity android:name=".USBActivity"
        android:label="USBActivity"
        android:screenOrientation="portrait">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.DEFAULT" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>

    <!--     <receiver android:name=".mUsbReceiver"> -->

        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
        </intent-filter>

        <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED"
            android:resource="@xml/device_filter" />
        <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED"
            android:resource="@xml/device_filter" />
   <!--     </receiver> -->

        </activity>
</application>

res/xml の device_filter では、3 つの設定すべてが試行され、使用されません。

 <?xml version="1.0" encoding="utf-8"?>
 <resources>
  <!-- iCooby mouse -->
  <!--     <usb-device vendor-id="15d9" , /> -->
  <!--     <usb-device vendor-id="5593" product-id="2637"/> -->
    <usb-device />
 </resources>

誰かが何が起こったのか知っているなら?または、ブロードキャスト インテントがアクティブかどうかを検出する方法を教えてください。どうもありがとうございました。

4

2 に答える 2

3

少し遅いかもしれませんが、他の人を助けるかもしれません。USB デバイスの挿入の検出に関する同様の問題を解決しました。マニフェストでインテント フィルターを指定したため、Android は何かがプラグインされると onResume を呼び出します。これを追加してみてください。

@Override
protected void onResume() {
    super.onResume();

    Intent intent = getIntent();
    if (intent != null) {
        Log.d("onResume", "intent: " + intent.toString());
        if (intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_ATTACHED)) {
            // Do your thing ...
        }

registerReceiver()その後、 での呼び出しも必要ありませんonCreate()。また、インテント フィルタの ID は 10 進数であることにも注意してください。そのため、「lsusb」などのコマンド ライン ツールで表示される値を変換する必要があります。

于 2013-10-15T09:00:40.087 に答える
1

レシーバータグはコメントアウトされています。ご存知だと思いますが、念のため。<receiver android:name="mUsbReceiver">また、あなたのものには「。」があるため、宣言する必要があります。そこにいる必要はありません

于 2013-08-02T11:37:58.010 に答える