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