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

Ste*_*e M 11 android android-mediasession

我试图按照谷歌的谈话实施媒体按钮控制

我将接收器设置为清单:

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

创建MediaSessionCompatonCreate()服务:

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

并处理意图 onStartCommand()

MediaButtonReceiver.handleIntent(mediaSession, intent);
Run Code Online (Sandbox Code Playgroud)

然后,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显示回调正在运行.
  3. 在支持媒体按钮的Google Play音乐等其他应用上开始播放.按此应用程序暂停.
  4. 演示应用程序不再是首选的媒体按钮接收器,即使再次按下PLAY按钮,再次呼叫setActive(true) .另一个应用程序始终响应媒体按钮.

这是在Android 6.0上测试的.

Ste*_*e M 2

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