11

SDカードがディスクドライブとしてUSB経由でコンピューターにマウントされている場合、または手動で取り外した場合を検出する必要があるアプリケーションを作成しています。この目的でブロードキャストレシーバーを使用しようとしましたが、onReceiveが呼び出されません。私のコードは次のとおりです。

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

私の放送受信機は次のとおりです...

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

}

USB経由でディスクドライブとして接続すると、onReceiveメソッドが起動しません。

私は何を間違っているのですか?

4

3 に答える 3

13

IntentFilter がブロードキャスト ACTION_MEDIA_* アクション インテントと一致するようにするには、「ファイル」スキーム (addDataScheme("file")) を追加する必要があります。

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

于 2012-05-02T17:14:02.653 に答える
3

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

ソース: Android: 接続された USB フラッシュ ドライブを検出する

于 2012-04-10T13:01:08.683 に答える
2

どうやら ACTION_UMS_CONNECTED は機能しません。API バージョン 8 で作業する必要があるため、android.os.storage.StorageEventListener は適用されません。

ここに投稿された回答を使用して、スレッド内の静的変数を更新しました。これを使用して、カスタム ブロードキャストを実行することもできます。メソッドは次のとおりです... *注: 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();
于 2012-04-11T04:00:41.060 に答える