我尝试按照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
重现的步骤:
setActive(true)
被称为
MediaButtonReceiver现在是首选的媒体按钮。setActive(true)
再次。另一个应用程序始终响应媒体按钮。这是在Android 6.0上测试的。
答案 0 :(得分:2)
我的观察:(没有足够的声誉评论,道歉,但我可以回复此答案的评论)
&#39;运行应用,按PLAY按钮。调用setActive(true)并且MediaButtonReceiver现在是首选媒体按钮&#39;:因为Android首先将媒体按钮事件调度到前台活动。
&#39;在另一个应用程序上开始播放.......按此应用程序暂停........然后返回我的应用程序并调用setActive(true)&#39; :
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
或者会出现同样的问题。