API 21 之前 当用户按下耳机上的按钮时,我正在使用类似 audioManager.registerMediaButtonEventReceiver(receiver);
的调用来处理媒体按钮事件。从 API 21 开始,似乎应该使用MediaSession
。但是,我没有得到任何回应。
final MediaSession session = new MediaSession(context, "TAG");
session.setCallback(new Callback() {
@Override
public boolean onMediaButtonEvent(final Intent mediaButtonIntent) {
Log.i("TAG", "GOT EVENT");
return super.onMediaButtonEvent(mediaButtonIntent);
}
});
session.setFlags(MediaSession.FLAG_HANDLES_MEDIA_BUTTONS |
MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS);
session.setActive(true);
以上是我认为应该有效但无效的。有谁知道为什么这不起作用或我应该如何注册?
要接收媒体按钮事件,您需要:
-
设置一个 MediaSession.Callback 并处理正确的事件 (*)
-
设置
MediaSession.FLAG_HANDLES_MEDIA_BUTTONS
和MediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS
标志 -
将媒体会话设置为活动
-
正确设置播放状态,特别是会话处理的操作(播放事件)。例如:
PlaybackState state = new PlaybackState.Builder() .setActions( PlaybackState.ACTION_PLAY | PlaybackState.ACTION_PLAY_PAUSE | PlaybackState.ACTION_PLAY_FROM_MEDIA_ID | PlaybackState.ACTION_PAUSE | PlaybackState.ACTION_SKIP_TO_NEXT | PlaybackState.ACTION_SKIP_TO_PREVIOUS) .setState(PlaybackState.STATE_PLAYING, position, speed, SystemClock.elapsedRealtime()) .build(); mSession.setPlaybackState(state);
我的猜测是你错过了#4,因为你正确地做了其他所有事情。
(*) Callback.onMediaButtonEvent 的默认实现处理所有常见的媒体按钮并调用正确的 onXXXX() 方法(onPlay、onPause、onSkipToNext 等)。除非需要处理不常见的媒体按钮(或出于调试目的),否则不需要重写 onMediaButtonEvent。