我正在尝试使用新的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();
到
PlaybackState state = new PlaybackState.Builder()
.setActions(PlaybackState.ACTION_PLAY)
.setState(PlaybackState.STATE_STOPPED, PlaybackState.PLAYBACK_POSITION_UNKNOWN, 0)
.build();
我现在通过onMediaButtonEvent()回调接收按钮按下通知(例如被通知按下了KEYCODE_MEDIA_PAUSE)但是onPlay(),onPause()和onStop()从未被调用,任何想法为什么?
答案 0 :(得分:5)
onMediaButtonEvent(..)
在MediaSession.Callback中有一个默认实现。在您的代码中,如果您调用super.onMediaButtonEvent(..),那么根据密钥代码,将调用正确的回调,即onPlay()
,onPause()
。
您可以查看MediaSession.java
中的默认实现答案 1 :(得分:0)
onMediaButtonEvent的默认实现是指出给定媒体键事件的特定回调。由于你要重写onMediaButtonEvent并且没有调用super的实现,你只能获得onPlay / Pause / etc.来自使用MediaController的其他应用程序调用直接进行这些调用。
如果您将实施更改为
public boolean onMediaButtonEvent(Intent mediaButtonIntent) {
_log.d(TAG, "onMediaButtonEvent called: " + mediaButtonIntent);
return super.onMediaButtonEvent(mediaButtonIntent);
}
您应该开始将密钥转换为其他回调方法。