如何在Oreo中注册用于媒体按钮的广播接收器?

6

我有一个关于新的Android版本8.0(Oreo)的问题。我需要注册广播,我使用以下代码实现:

// android.intent.action.MEDIA_BUTTON
IntentFilter filter = new IntentFilter(Intent.ACTION_MEDIA_BUTTON);
r = new MediaButtonIntentReceiver();
// this line sets receiver priority
filter.setPriority(999);
registerReceiver(r, filter);

这在旧版的Android上可以工作,但在Android 8上不起作用,因为需要注册显式广播,但我不知道如何操作。如何注册显式广播以检测媒体按钮?

这是在Manifest.xml中的代码:

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

你读过这个吗?“如果你正在运行Android 8.0(API级别26)或更高版本,则系统会尝试查找最后一个使用MediaSession在本地播放音频的应用程序。如果该会话仍处于活动状态,则Android会直接将事件发送到该会话。否则,如果该会话不活动并且具有mediabutton接收器,则Android会将事件发送到接收器,该接收器将重新启动会话,以便可以接收事件。(有关详细信息,请参见使用媒体按钮重新启动非活动媒体会话。)” https://developer.android.com/guide/topics/media-apps/mediabuttons.html#finding-a-media-session - karandeep singh
@karandeepsingh 是的,但我没有使用媒体会话。如果我必须实现媒体会话,我该怎么做?我从未使用过媒体会话。 - Alessandro Marino
https://dev59.com/GWkv5IYBdhLWcg3wiRMJ - karandeep singh
@karandeepsingh 我已经实现了这个功能,但在Android 8中不再起作用,因为我必须注册显式广播接收器。 - Alessandro Marino
@AlessandroMarino 从API 21开始使用媒体会话(就像你一直以来应该使用的那样)。同样的API指南可以帮助你完成这个过程:https://developer.android.com/guide/topics/media-apps/working-with-a-media-session.html - Eugen Pechanec
显示剩余5条评论
1个回答

8
如果您想要接收媒体按钮,您需要播放音频并使用mediasession。
例如:
    MediaSession ms = new MediaSession(getApplicationContext(), getPackageName());
    ms.setActive(true);

    ms.setCallback(new MediaSession.Callback() {
        @Override
        public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
            Log.e("hmhm", "hmhm media button");
            return super.onMediaButtonEvent(mediaButtonIntent);
        }
    });

    // you can button by receiver after terminating your app
    ms.setMediaButtonReceiver(mbr); 

    // play dummy audio
    AudioTrack at = new AudioTrack(AudioManager.STREAM_MUSIC, 48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT,
            AudioTrack.getMinBufferSize(48000, AudioFormat.CHANNEL_OUT_STEREO, AudioFormat.ENCODING_PCM_16BIT), AudioTrack.MODE_STREAM);
    at.play();

    // a little sleep 
    at.stop();
    at.release();

3
非常感谢。目前在Android 8中检测媒体按钮的方法是一个不错的解决方案。 - Alessandro Marino
2
非常感谢!!!在绝望地尝试检测我的蓝牙按钮按键几天后,这立即解决了它! - Shane Smiskol
如果我两周前就发现了这个就好了...它也适用于Android 10,尽管示例中使用的AudioTrack构造函数现在已被弃用。 - Jeremy Jao

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接