9

最近、私が見たすべてのサンプルと例に従って、ブロードキャストレシーバーを使用してインテント android.hardware.usb.action.USB_DEVICE_ATTACHED を受信しようとしています。

マニフェストでレシーバーを宣言しました。

<receiver android:name=".UsbDeviceReceiver">
        <intent-filter>
            <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
            <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </receiver>
    <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" 
                android:resource="@xml/device_filter"/>

アクティビティ コードでも同様のことを行いました - onStart と OnStop はレシーバーを登録/登録解除します。

    IntentFilter filter = new IntentFilter();
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED);

    registerReceiver(mUsbReceiver, filter);

しかし、私は意図が捕らえられていることに気づきました。logcat を観察すると、USB デバイスを接続すると開始するアクティビティが検索され、接続を解除すると接続解除の意図がブロードキャストされることがわかります。前述のサンプルによると、これは当てはまりません。

メタデータに関して抜本的な何かが欠けていますか? android.hardware.usb.action.USB_DEVICE_DETACHED にはまったく問題はありません。おそらくこれは、Galaxy s3 にインストールされている Android バージョンのバグでしょうか? おそらくこれは ICS の「機能」です。

関連情報大歓迎です!

4

3 に答える 3

4

これは既知の欠陥です。

http://code.google.com/p/android/issues/detail?id=25701

そしてここ:

http://code.google.com/p/android/issues/detail?id=25703

しかし、それが修正されるのを待って息を止めないでください。バグ レポートを表示しているときにスターを付けると、レポートの更新が通知されます。おそらくそれは、修正を求める他の人々からのコメントでしょう。

于 2012-08-12T00:29:08.313 に答える
1

私が見つけた回避策は、私のメソッドを再度USB_ACCESSORY_ATTACHED呼び出すボタンを持つことであり、それは私にとってはうまくいっているようです。OpenAccessory(accessory)多分それUSB_DEVICE_ATTACHEDもうまくいくでしょう。デバイスが接続されている/接続されていない状態をどこかに置くだけで、接続されていない場合、ユーザーはそのボタンを押すことができます。

編集:android:launchMode="singleTask"マニフェストを配置すると、 の意図が「登録」されているように見えますが、そのように表示USB_ACCESSORY_ATTACHEDされることはありません。

于 2013-02-19T20:31:20.770 に答える
1

ここで説明されているように、マニフェストでインテント フィルターを宣言できます: http://developer.android.com/guide/topics/connectivity/usb/host.html

次に、onResume() または onNewIntent() で android.hardware.usb.action.USB_DEVICE_ATTACHED をキャッチします。

アクティビティの実行中に USB デバイスを接続すると、メイン インテントは onResume() にスローされますが、android.hardware.usb.action.USB_DEVICE_ATTACHED は onNewIntent() にスローされます。それに応じてコードを調整します。

次のように onNewIntent() を宣言できます。

@Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);
        System.out.println("onNewIntent" + intent.getAction());
        if (UsbManager.ACTION_USB_DEVICE_ATTACHED.equals(intent.getAction())) {
        mDevice = (UsbDevice) intent.getParcelableExtra(UsbManager.EXTRA_DEVICE);
        if(mDevice!= null)
            mUsbManager.requestPermission(mDevice, mPermissionIntent);
        }
    }

および onResume() 同様に。

Android 4.0.4 でテスト済み デバイス: Samsung Galaxy tab 750

于 2015-03-16T10:00:45.707 に答える