处理 Android 5.0 棒棒糖中的媒体按钮



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);

以上是我认为应该有效但无效的。有谁知道为什么这不起作用或我应该如何注册?

要接收媒体按钮事件,您需要:

  1. 设置一个 MediaSession.Callback 并处理正确的事件 (*)

  2. 设置MediaSession.FLAG_HANDLES_MEDIA_BUTTONSMediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS标志

  3. 将媒体会话设置为活动

  4. 正确设置播放状态,特别是会话处理的操作(播放事件)。例如:

    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。

最新更新