2012-04-10 17 views
8

私は、SDカードがUSB経由でコンピュータにディスクドライブとしてマウントされたとき、または手動で取り除かれたときを検出する必要のあるアプリケーションを作成しています。私はこの目的のために放送受信機を使ってみましたが、onReceiveは呼び出されていません。私のコードは以下の通りです。Android:SDカードがコンピュータにディスクドライブとしてマウントされたときに検出する

IntentFilter filter2 = new IntentFilter(); 
     //filter2.addAction(Intent.ACTION_AIRPLANE_MODE_CHANGED); 
     filter2.addAction(Intent.ACTION_MEDIA_UNMOUNTED); 
     filter2.addAction(Intent.ACTION_MEDIA_SHARED); 
     filter2.addAction(Intent.ACTION_MEDIA_REMOVED); 
     filter2.addAction(Intent.ACTION_MEDIA_MOUNTED); 

     registerReceiver(new CustomBroadcastReceiver(), filter2); 

次のように私の放送受信機は、私はUSB経由でディスクドライブとして接続するときonReceive方法は発生しません

public class CustomBroadcastReceiver extends BroadcastReceiver{ 

    public CustomBroadcastReceiver(){ 

    } 

    @Override 
    public void onReceive(Context context, Intent intent) { 
     String action = intent.getAction(); 

     if(action.equals(Intent.ACTION_MEDIA_UNMOUNTED) || action.equals(Intent.ACTION_MEDIA_SHARED) || action.equals(Intent.ACTION_MEDIA_REMOVED)){ 
      HardwareManager.IS_MEDIA_MOUNTED = false; 
     }else if(action.equals(Intent.ACTION_MEDIA_MOUNTED)){ 
      HardwareManager.IS_MEDIA_MOUNTED = true; 
     }else if(action.equals(Intent.ACTION_AIRPLANE_MODE_CHANGED)){ 
      HardwareManager.IN_AIRPLANE_MODE = intent.getBooleanExtra("state", false); 
     } 
    } 

} 

...です。

私は間違っていますか?

答えて

11

あなたはIntentFilterは、放送ACTION_MEDIA_ *アクションインテントを一致させるためには、「ファイル」スキーム(addDataScheme(「ファイル」))を追加する必要があります。

ACTION_MEDIA_ *インテントは、Intent.mDataフィールド(Intent docsを参照)にマウントポイントへのパスを持っていますが、スキームが設定されていないインテントフィルタは、データが含まれていない場合にのみインテントと一致します(IntentFilter docs参照)。

3

これは現在、SDKレベルではサポートされていません。

出典:Android: Detect USB flash drive plugged in

+0

これはAndroid NDKで可能でしょうか? –

+0

私は分かりません。私はヒントがあればお知らせします。 – Chromium

+0

私はACTION_UMS_CONNECTEDのリッスンはAPIバージョン8で動作し、android.os.storage.StorageEventListenerはそれ以降のバージョンのAPIでも動作すると思います。 –

1

一見ACTION_UMS_CONNECTEDは動作しません。 APIバージョン8で作業する必要があるため、android.os.storage.StorageEventListenerは適用されません。

スレッド内の静的変数を更新するには、hereという回答を使用しました。これはまた、カスタム放送を行うのにも使用できます。方法は以下の通りNOTE * ... です:HardwareManagerは別の場所に続いて、ユーザ定義のクラス

private static class SDCardMountStatusMonitor implements Runnable{ 

    public void run() { 
     // TODO Auto-generated method stub 
     while(true){ 
      try { 
       HardwareManager.IS_MEDIA_MOUNTED = sdIsCardMounted(); //YOU CAN BROADCAST SOMETHING FROM HERE INSTEAD 
       Thread.sleep(2000); 
      } catch (InterruptedException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
    } 

} 

public static boolean sdIsCardMounted() { 
     String state = Environment.getExternalStorageState(); 
     if (Environment.MEDIA_MOUNTED.equals(state)) { 
      return true; 
     } else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) { 
      return false; 
     } else { 
      return false; 
     } 
} 

ですが、私はこのRunnableを外にスレッドを作成し、それを起動します。

Thread t = new Thread(new SDCardMountStatusMonitor()); 
t.start(); 
関連する問題