处理Android 5.0 Lollipop中的媒体按钮

tvk*_*ers 12 android android-5.0-lollipop

Pre 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);
Run Code Online (Sandbox Code Playgroud)

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

man*_*ini 20

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

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

  2. 设置MediaSession.FLAG_HANDLES_MEDIA_BUTTONSMediaSession.FLAG_HANDLES_TRANSPORT_CONTROLS标志

  3. 将mediaSession设置为活动状态

  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);
    
    Run Code Online (Sandbox Code Playgroud)

我的猜测是你缺少#4,因为你正在做其他正确的事情.

(*)Callback.onMediaButtonEvent的默认实现处理所有常见的媒体按钮并调用正确的onXXXX()方法(onPlay,onPause,onSkipToNext等).除非您需要处理不常见的媒体按钮 - 或用于调试目的 - 否则您不需要覆盖onMediaButtonEvent.

  • 要在活动处于前台时接收媒体按钮事件,请使用连接到活动MediaSession的MediaController实例调用活动上的setMediaController(). (3认同)