我已尝试根据Google 的谈话实现媒体按钮控制
我在清单中设置了接收器:
<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
重现步骤:
- 运行应用程序,按 PLAY 按钮。
setActive(true)
被调用并且 MediaButtonReceiver 现在是首选的媒体按钮。 - 按有线或无线耳机或其他媒体按钮上的播放/暂停按钮。Toast 显示表明回调正在工作。
- 在支持媒体按钮的其他应用程序(例如 Google Play 音乐)上开始播放。在这个应用程序上按暂停。
- 演示应用程序不再是首选的媒体按钮接收器,即使再次按下 PLAY 按钮,再次调用
setActive(true)
。另一个应用程序始终响应媒体按钮。
这是在 Android 6.0 上测试的。