2013-04-02 185 views
6

私は、USB周辺機器が接続されているか取り外されているかを検出する必要のあるAndroidアプリを持っています。周辺機器が最初に接続されても正常に動作しますが、後でデタッチするときに通知が届かない(つまり、IntentのアクションがACTION_USB_DEVICE_DETACHEDではありません)。USBデバイスがAndroidで取り外されたときの検出

は、ここに私のAndroidManifest.xmlの関連部分です:

<activity android:name=".LauncherActivity"> 
    <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" /> 
</activity> 

またLauncherActivityのみデバイスが接続されたときにServiceを開始するには、それが切り離されたときにサービスを停止するために存在していることは注目に値するかもしれません。いずれの場合も、LauncherActivityは常にfinishとなります。これらはすべてLauncherActivity.onCreateで発生します。

アイデア?

+0

こんにちは、この投稿をチェックアウトhttp://stackoverflow.com/a/9814826/760489 – Pratik

答えて

10

USB_DEVICE_DETACHEDがのブロードキャストのインテントであるため、Detachedアクションの適切なインテントフィルタとメタデータが添付されたBroadcastReceiver宣言を行いたい場合があります。 USB_ACCESSORY_DETACHEDに興味がある人は同じです。

概要:
USB_XXX_ATTACHED
USB_XXX_DETACHED活動の意図である

放送の意図である(XXX = DEVICE | ACCESSORY)

参照:http://developer.android.com/guide/components/intents-filters.html

「がありますこれらのメッセージングシステム内で重複しない:ブロードキャストインテントは、ブロードキャスト受信者にのみ配信される、決して活動またはサービスに」

+0

これは間違っています。 'DEVICE'アクションは両方のブロードキャストです。 'ACCESSORY'の場合、アタッチされたものはアクティビティアクションですが、ブロードキャストアクションでは外されます。 –

+0

USB_XXX_ATTACHEDインテントをブロードキャストインテントとしても使用できます。試してみましたが、うまくいきます。 –

3

だから、ACTION_USB_DEVICE_DETACHEDIntentLauncherActivityに行きませんでした。私は、取引が何であるか分かりません。おそらくインテントフィルターやライフサイクルコールバックについて正しく理解していないものでしょう。

私が使い終わった解決策は、Pratikによってリンクされたポストから来ています。私は基本的にAndroidManifest.xmlのうちUSB_DEVICE_DETACHEDについてすべてを取った。その後、ServiceonCreate方法で、私はこのようなBroadcastReceiver登録:

@Override 
public void onCreate() { 
    detachReceiver = new BroadcastReceiver() { 
     public void onReceive(Context context, Intent intent) { 
      if(intent.getAction().equals(UsbManager.ACTION_USB_DEVICE_DETACHED)) 
       stopSelf(); 
     } 
    }; 

    IntentFilter filter = new IntentFilter(); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
    registerReceiver(detachReceiver, filter); 
} 

少し不格好に、そしてちょうどLauncherActivity<intent-filter>USB_DEVICE_DETACHEDを追加する作業が、それはなかった、なぜ私はまだ興味私が必要とすることをします。

+0

素晴らしいです。私のためのトリックは、AndroidManifest.xmlからUSB_DEVICE_DETACHEDを削除することでした。 – Frank

6

以下のようにUSB_STATEで試してください。

これは、同じ受信機に接続されているか、または取り外されているかの両方を起動し、受信機では、接続されているかどうかを識別できます。

IntentFilter filter = new IntentFilter(); 
filter.addAction("android.hardware.usb.action.USB_STATE"); 

受信機:活動は、デバイスが切断されたときに再開一時停止しているので、それは価値がある何のため

public class USBReceiver extends BroadcastReceiver { 
    public void onReceive(Context context, Intent intent) { 
     if (intent.getExtras().getBoolean("connected")) { 
      //do your stuff 
     } 
    } 
} 
+0

魅力的な作品!ありがとうございました –

+0

ありがとうございます。しかし、私はいつも嘘をつきます。私はそれを確認します。 – Herman

0

、私はこれと同じ問題がありました。
ACTION_USB_DEVICE_DETACHEDの受信の直前にOnPause()メソッドで受信者が登録されていないため、あなたのアプリに通知されることはありません。私のために働いていた問題を修正する修正プログラムをonPause()に登録解除しonResume()に再度登録することでした

+0

あなたがこの問題をどのように乗り越えて投稿したのかは素晴らしいでしょう。 –

0

@Override 
public void onPause() 
{ 
    super.onPause(); 
    stopIOManager(); 
    if(m_UsbReceiver!=null) unregisterReceiver(m_UsbReceiver); 
} 

@Override 
public void onResume() 
{ 
    super.onResume(); 
    startIOManager(); 
    IntentFilter filter = new IntentFilter(ACTION_USB_PERMISSION); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_ATTACHED); 
    filter.addAction(UsbManager.ACTION_USB_DEVICE_DETACHED); 
    registerReceiver(m_UsbReceiver, filter); 
} 

しかし、アプリが常にDETACHイベントを受け取るように見えるが、たまにそれが取得していませんATTACHEDイベント。私はその後、USBコネクタを抜き差しする必要があり、通常は1回か2回の試行後に動作します。私はこの奇妙な行動の責任をOSに確実に伝えていません。

関連する問題