【问题标题】:Handling media buttons in Android 5.0 Lollipop在 Android 5.0 Lollipop 中处理媒体按钮
【发布时间】:2014-12-15 09:14:31
【问题描述】:

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

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

【问题讨论】:

  • 您是否将会话设置为活动状态? session.setActive(true)
  • 请看代码示例。最后一行是session.setActive(true);
  • 我遇到了与您报告的完全相同的问题。我还尝试将您的代码 sn-p 与 MediaSessionCompat(来自支持 V4)一起使用,但没有成功。我会继续调查,如果我找到一些解决方案,我会在这里发布答案。

标签: android android-5.0-lollipop


【解决方案1】:

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

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

我的猜测是你缺少#4,因为你做的一切都是正确的。

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

【讨论】:

  • 这对我有用,谢谢。它仅在接听电话时才起作用。我尝试了一种解决方法,创建一个在通话处于活动状态时始终位于顶部的视图,但它也无法正常工作(在 Android L 之前的版本上,该视图有效)。
  • @Luis,我很困惑你接电话是什么意思。您的意思是使用硬件按钮接听电话,或在来电时暂停音乐?
  • 实际上,就我而言,我想一直通过我的自定义操作来覆盖默认的 Android 操作。因此,例如,我想设置一键增加系统音量。在当前的实现中,如果设备正在播放音乐,我可以拦截耳机点击并采取我的行动,而不是 android 默认操作(播放/暂停)。但是当用户正在进行通话时,MediaSession 无法拦截耳机点击,通话应用程序具有更高的优先级,然后采取自己的操作而不是我的自定义操作。
  • 这就是我所说的“受限标志”:-)
  • 要在您的 Activity 处于前台时接收媒体按钮事件,请在您的 Activity 上调用 setMediaController(),并将 MediaController 实例连接到您的活动 MediaSession。
猜你喜欢
  • 2015-05-14
  • 2015-05-13
  • 2015-01-08
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 2015-01-28
相关资源
最近更新 更多