2013-08-02 18 views
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機能が正しいと確信しています。 これは私のコードです。ブロードキャストを受信できませんUsbManager.ACTION_USB_DEVICE_ATTACHEDの意図/ UsbManager.ACTION_USB_DEVICE_DETACHED

@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

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); 
      } 
     } 
    } 
}; 

たManifest.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> 

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

+0

これは私を助けました:** [USB接続ステータスのブロードキャストを受信する方法](http://stackoverflow.com/questions/39942453/how-to-receive-usb-connection-status-broadcast)** –

答えて

1

受信者タグはコメントアウトされていますが、私はそれを知っていると思っていますが、ただ入れてみてください。また、それは<receiver android:name="mUsbReceiver">として宣言されるべきです。そこにいる必要はありません

+0

ありがとうあなたの思い出させるために、私は前にそれを試しても、同じ結果も。 – user2645035

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 ... 
     } 

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

+0

ありがとう!私の問題を解決した – breceivemail

関連する問題