如何使用新的MediaSession类在Android 5.x上接收媒体按钮按下?

如何使用新的MediaSession类在Android 5.x上接收媒体按钮按下?,android,android-5.0-lollipop,Android,Android 5.0 Lollipop,我正在尝试使用新的MediaSession类接收媒体按钮按下,但到目前为止没有成功。是否有人使用新类成功地接收了它们 我已经成功地创建了MediaSession,并使用它来更新远程显示器(车内娱乐系统)上的歌曲信息,但到目前为止,我无法接收来自它的按键、耳机控制和蓝牙耳机控制 创建媒体会话后,我将在用于播放音频的服务中执行以下操作: _mediaSession = new MediaSession(getApplicationContext(), Global.PACKAGE_NAME

我正在尝试使用新的MediaSession类接收媒体按钮按下,但到目前为止没有成功。是否有人使用新类成功地接收了它们

我已经成功地创建了MediaSession,并使用它来更新远程显示器(车内娱乐系统)上的歌曲信息,但到目前为止,我无法接收来自它的按键、耳机控制和蓝牙耳机控制

创建媒体会话后,我将在用于播放音频的服务中执行以下操作:

    _mediaSession = new MediaSession(getApplicationContext(), Global.PACKAGE_NAME + "." + TAG);

    if (_mediaSession == null) {
        _log.e(TAG, "initMediaSession: _mediaSession = null");
        return;
    }

    _mediaSessionToken = _mediaSession.getSessionToken();

    _mediaSession.setCallback(new Callback() {
        public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
            _log.d(TAG, "onMediaButtonEvent called: " + mediaButtonIntent);             
            return false;
        }

        public void onPause() {
            Log.d(TAG, "onPause called (media button pressed)");                
            super.onPause();
        }

        public void onPlay() {
            Log.d(TAG, "onPlay called (media button pressed)");             
            super.onPlay();
        }

        public void onStop() {
            Log.d(TAG, "onStop called (media button pressed)");             
            super.onStop();
        }
    });             

     _mediaSession.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS | MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);

    PlaybackState state = new PlaybackState.Builder()
    .setActions(PlaybackState.ACTION_PLAY)
    .setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, SystemClock.elapsedRealtime())
    .build();

    _mediaSession.setPlaybackState(state);

    _mediaSession.setActive(true);
但我仍然没有收到任何按钮按下

有人有什么想法吗

谢谢

更改后更新

    PlaybackState state = new PlaybackState.Builder()
    .setActions(PlaybackState.ACTION_PLAY)
    .setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, SystemClock.elapsedRealtime())
    .build();

我现在通过onMediaButtonEvent()回调收到按钮按下通知(例如被通知按下了KEYCODE\u MEDIA\u PAUSE),但是从来没有调用onPlay()、onPause()和onStop(),知道为什么吗?

onMediaButtonEvent(…)
在MediaSession.callback中有一个默认实现。在代码中,如果调用super.onMediaButtonEvent(..),则根据键代码,将调用正确的回调,即
onPlay()
onPause()


您可以在

中查看默认实现onMediaButtonEvent的默认实现是为给定的媒体密钥事件确定特定回调的功能。由于您覆盖了onMediaButtonEvent,并且没有调用super的实现,因此您只能从使用MediaController直接进行这些调用的其他应用程序中获得onPlay/Pause/etc.调用

如果添加,请更改您的实现

public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
    _log.d(TAG, "onMediaButtonEvent called: " + mediaButtonIntent);             
    return super.onMediaButtonEvent(mediaButtonIntent);
}

您应该开始看到键被转换为其他回调方法。

我不知道这是否适合您,但您可以尝试向
PlaybackState
实例添加更多受支持的操作,因此将:
.setActions(PlaybackState.ACTION\u PLAY)
替换为:
.setActions(PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_暂停| PlaybackState.ACTION_暂停)
谢谢你的想法,我尝试了一下,不幸的是添加额外的操作没有效果。你能发布更多的代码吗..这让我们知道你何时创建媒体会话以及何时初始化
.setState(…)中的最后一个参数
call应该是播放速度,我一直使用1,它对我有效。在我的代码中,我有
.setState(newState,0,1);
其中
newState
是一个适当计算的整数。@ana01谢谢,我将播放速度更改为1。我现在收到按钮按下通知,但只能通过onmediabutonevent()接收回调,由于某些原因,onPlay()、onPause()、onStop()永远不会被调用,即使在onmediabutonevent()时也是如此使用KEYCODE\u MEDIA\u PAUSE调用。MediaButtonevent上的MediaSessonCompat现在有一个检查
android.os.Build.VERSION.SDK\u INT>=27
,如果为true,则该方法立即返回false,无需任何进一步操作,因此,蓝牙播放/暂停按钮将一直持续到onMediaButtonEvent,此后将不执行任何操作。
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
    _log.d(TAG, "onMediaButtonEvent called: " + mediaButtonIntent);             
    return super.onMediaButtonEvent(mediaButtonIntent);
}