MediaButtonIntentReceiver不是在Android平台4.0+MediaButt

2019-05-12 04:21发布

我们的目标是拦截从耳机播放,以及蓝牙,最终,从耳机到不同类型的点击响应改变媒体播放器。 该解决方案之前,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 /豆形软糖的问题......这是一个服务,而不是一个活动正在进行。

Answer 1:

它看起来像你的广播接收器是一个内部类为你服务? 如果是这样,让你的广播接收器的静态和在清单中做到这一点:

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

在Android 3.0以上版本,你必须使用registerMediaButtonEventReceiver注册接收器。 本品采用AndroidManifest为的IntentFilter。 它工作在2.X的原因是因为你用它注册this.registerReceiver()其注册没有AndroidManifest接收器。



Answer 2:

刚刚尝试对这个果冻为我工作:

             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媒体按钮)的服务。 所有的工作。



文章来源: MediaButtonIntentReceiver not working in Android 4.0+