第二次调用setActive(true)时,App不会成为首选的MediaButtonReceiver

时间:2017-01-22 20:11:36

标签: android android-mediasession

我尝试按照Google's talk

实施媒体按钮控制

我将接收器设置为清单:

<receiver android:name="android.support.v4.media.session.MediaButtonReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

<service android:name=".player.PlayFileService">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</service>

MediaSessionCompat服务中创建onCreate()

    mediaSession = new MediaSessionCompat(getApplicationContext(), "SOUNDPROCESS");
    mediaSession.setFlags(MediaSessionCompat.FLAG_HANDLES_MEDIA_BUTTONS | MediaSessionCompat.FLAG_HANDLES_TRANSPORT_CONTROLS);
    PlaybackStateCompat ps = new PlaybackStateCompat.Builder()
            .setActions(PlaybackStateCompat.ACTION_PLAY | PlaybackStateCompat.ACTION_PAUSE | PlaybackStateCompat.ACTION_PLAY_PAUSE)
            .build();
    mediaSession.setPlaybackState(ps);
    mediaSession.setCallback(new MediaSessionCompat.Callback() {
        @Override
        public void onPlay() { ...
           }
    });

并在onStartCommand()

中处理意图
MediaButtonReceiver.handleIntent(mediaSession, intent);

然后我在获得音频焦点时调用setActive(true);,在停止播放时调用setActive(false);。这是第一次使用,我的应用程序成为首选媒体按钮接收器并接收回调。

但是,如果我在我的应用中停止播放,请进入Google Play音乐等其他应用并开始播放,然后返回我的应用并拨打setActive(true) Google Play音乐继续接收回拨和媒体按钮不能在我的应用程序中工作。

根据我的理解,最后一次调用setActive(true)应该优先。我已经确认isActive()返回true。我也可以通过每次创建一个新的MediaSessionCompat来解决这个问题,但这看起来并不理想。

每次拨打setActive(true)时,如何让我的应用成为首选的媒体按钮接收器?

更新:此处重现问题的最小项目:https://github.com/svenoaks/MediaButtonDemo.git

重现的步骤:

  1. 运行应用程序,按PLAY按钮。 setActive(true)被称为     MediaButtonReceiver现在是首选的媒体按钮。
  2. 按有线或无线耳机或其他设备上的播放/暂停按钮 媒体按钮。 Toast show表明回调正在运行。
  3. 在其他应用中播放,例如Google Play Music 支持媒体按钮。按此应用上的暂停。
  4. 演示应用程序不再是首选的媒体按钮接收器, 即使再次按下PLAY按钮,也可以调用setActive(true) 再次。另一个应用程序始终响应媒体按钮。
  5. 这是在Android 6.0上测试的。

2 个答案:

答案 0 :(得分:2)

我的观察:(没有足够的声誉评论,道歉,但我可以回复此答案的评论)

  1. &#39;运行应用,按PLAY按钮。调用setActive(true)并且MediaButtonReceiver现在是首选媒体按钮&#39;:因为Android首先将媒体按钮事件调度到前台活动。

  2. &#39;在另一个应用程序上开始播放.......按此应用程序暂停........然后返回我的应用程序并调用setActive(true)&#39; :

  3. a)如果您在播放GooglePlay音乐之前调用了onStop侦听器,那么当您按任意媒体按钮时,您的媒体会话将不会处于活动状态(直到再次调用onPlay),因此将播放当前的Google Play会话。 / p>

    b)如果您没有调用onStop,则会有2个活动会话(您的应用的第一个会话和Google Play的第一个会话。除非再次调用OnPlay,否则将无法调用第二个会话) 。根据文档,如果有多个活动媒体会话,Android会尝试选择准备播放(缓冲/连接),播放或暂停的媒体会话,而不是停止播放的媒体会话。所以GooglePlay是暂停状态并进行播放的最新活动会话。

    c)如果您调用了onStop(因此setActive(false)),并且如果GooglePlayMusic也有setActive(false),并且您还没有再次点击播放,那么在这种情况下,GooglePlayMusic将会播放,因为&# 34;如果没有活动会话,Android会尝试将事件发送到最近活动的会话。在Android 5.0(API级别21)或更高版本上,事件仅发送到已调用setMediaButtonReceiver()的会话。&#34;

    你有setMediaButtonReceiver()吗?

    https://developer.android.com/guide/topics/media-apps/mediabuttons.html 请看看它

答案 1 :(得分:2)

使这项工作正常运行的关键是每次应用开始播放或暂停时正确设置PlaybackState(当其他应用获得音频会话并激活自己的MediaSession时,它应该执行此操作如果没有这个,上面的问题就会发生。另外,对于Android 4.4及更低版本,必须设置FLAG_HANDLES_TRANSPORT_CONTROLS或者会出现同样的问题。