11

目標は、ヘッドセットからのブロードキャストと、最終的には bluetooth をインターセプトして、ヘッドセットからのさまざまな種類のクリックに応答して、メディア プレーヤーを変更することです。このソリューションは、ICS より前のすべてのバージョンで正常に機能します。ここに私が試したコードと物事のいくつかがあります:

....
private BroadcastReceiver mediaButtonReceiver = new MediaButtonIntentReceiver();
....
public void onCreate() {
    ...
    IntentFilter mediaFilter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
    mediaFilter.setPriority(2147483647); // this is bad...I know
    this.registerReceiver(mediaButtonReceiver, mediaFilter);
    ...
}

public class MediaButtonIntentReceiver extends BroadcastReceiver {

    private KeyEvent event;

    public MediaButtonIntentReceiver() {
        super();
    }

    @Override
    public void onReceive(Context context, Intent intent) {
        String intentAction = intent.getAction();
        if (!Intent.ACTION_MEDIA_BUTTON.equals(intentAction)) {
            return;
        }
        event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);
        if (event == null) {
            return;
        }
        try {
            int action = event.getAction();

            switch(action) {

                case KeyEvent.ACTION_UP :
                    Log.d("TEST", "BUTTON UP");
                    break;
                case KeyEvent.ACTION_DOWN :
                case KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE :
                    Log.d("TEST", "BUTTON DOWN");
                    break;
            }
        } catch (Exception e) {
            Log.d("TEST", "THIS IS NOT GOOD");
        }
        abortBroadcast();
    }
}

これを機能させるには、4.0 以降では次のようなものが必要なようですが、機能しませんでした。

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class));

上記に加えて、マニフェストに追加しようとしました:

    <receiver android:name=".MediaButtonIntentReceiver" android:enabled="true">
        <intent-filter android:priority="2147483647" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>

まだ運がありません。ここで何が欠けていますか?これは確かに 4.0+/ICS/JellyBean の問題です... これはアクティビティではなくサービスで行われています。

4

2 に答える 2

10

あなたの放送受信機はあなたのサービスの内部クラスのように見えますか? その場合は、ブロードキャスト レシーバーを静的にし、マニフェストで次のようにします。

<receiver android:name="MyOuterClass$MediaButtonIntentReceiver" android:enabled="true">
    <intent-filter android:priority="2147483647" >
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

registerMediaButtonEventReceiverAndroid 3.0 以降では、受信者を登録するために使用する必要があります。これは、IntentFilter に AndroidManifest を使用します。2.x で動作する理由はthis.registerReceiver()、AndroidManifest なしで受信者を登録したときに登録していたためです。

于 2012-11-27T01:34:23.863 に答える
1

これでゼリーを試してみてください:これは私のために働いています:

             broadcastReceiver = new BroadcastReceiver() {//global BroadcastReceiver
            @Override
            public void onReceive(Context context, Intent intent) {

                String action = intent.getAction();
                if(action.equals("android.intent.action.MEDIA_BUTTON")){
                    Log.e("test", "ok");
                }
            };

意図:

        IntentFilter intentfilterTime = null;
        intentfilterTime = new IntentFilter();  
        intentfilterTime.addAction("android.intent.action.MEDIA_BUTTON");
        registerReceiver(broadcastReceiver, intentfilterTime);

Widgetsoid(BTメディアボタンをエミュレートする)のメディアボタンを使用してサービスからテストします。すべてが機能しています。

于 2012-11-25T18:08:29.170 に答える