MediaButtonIntentReceiver无法在Android 4.0+中运行

Du3*_*Du3 11 android media-player android-intent android-4.0-ice-cream-sandwich

目标是拦截来自耳机的广播以及最终的蓝牙,以响应来自耳机的不同类型的点击以改变媒体播放器.此解决方案适用于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();
    }
}
Run Code Online (Sandbox Code Playgroud)

为了尝试使这项工作,听起来像4.0+需要这样的东西不起作用:

((AudioManager)getSystemService(AUDIO_SERVICE)).registerMediaButtonEventReceiver(new ComponentName(this, MediaButtonIntentReceiver.class));
Run Code Online (Sandbox Code Playgroud)

除了上面的内容之外,我甚至尝试将它添加到清单中:

    <receiver android:name=".MediaButtonIntentReceiver" android:enabled="true">
        <intent-filter android:priority="2147483647" >
            <action android:name="android.intent.action.MEDIA_BUTTON" />
        </intent-filter>
    </receiver>
Run Code Online (Sandbox Code Playgroud)

仍然没有运气.我在这里错过了什么?它肯定是4.0 +/ICS/JellyBean问题......这是在服务中完成的,而不是活动.

Nic*_*ick 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>
Run Code Online (Sandbox Code Playgroud)

在Android 3.0+中,您必须使用registerMediaButtonEventReceiver注册接收器.这使用AndroidManifest作为IntentFilter.它在2.x中工作的原因是因为您正在注册它this.registerReceiver()而没有使用AndroidManifest注册接收器.

  • 我使用内部类的唯一理由是能够访问外部类的方法,但如果内部类是静态的,我将无法访问这些方法.[Catch 22](http://stackoverflow.com/questions/15058743/how-do-i-register-in-manifest-an-inner-media-button-broadcastreciver#comment21174031_15058783).建议? (3认同)