问题描述
我想使用媒体按钮来控制前台应用程序,但不用于音频用途。 因此,目标是检测按钮点击以在应用中执行某些操作。
我可以通过使用 MediaSession
和 MediaButtonReceiver
来实现这一点。 see here
问题是应用在使用的时候,经常会在后台播放音乐,所以后台应用的音频焦点接管了MediaSession,我无法再控制我的应用了。
有没有办法做到这一点?使用 onKeyDown
直接监听按钮点击似乎不起作用。
解决方法
遗憾的是,无法同时使用两个活动的 MediaSession
。如果另一个应用程序正在播放音乐并运行 MediaSession
,那么您的应用程序没有焦点且未处于活动状态......这是为了更好的用户体验而设计的 - 只有一个“播放器”应用程序可以播放音乐(或视频) .如果这不起作用,并且您可以同时通过几个应用程序播放音乐,那么应该如何使用媒体按钮,例如耳机?暂停/恢复所有玩家?这只是对用户不友好,因此 Android 团队引入了 MediaSession
模式,可以选择通过任何应用调用“现在关注我”,但随后另一个应用/MediaSession
暂停并且没有任何输入(此活动会话确实如此)
如果您需要按下物理按钮,那么 onKeyDown
应该可以工作(在 Activity
内或最终使用 AccessibilityService
,这将在整个系统中“全局”工作)。如果您需要按下一些屏幕通知按钮,那么只需将 custom layout for your notification 设置为您喜欢的按钮数量,甚至可以设置为播放器的样式
请注意,在 Android 11 中,当您下拉状态栏时,活动 MediaSession
的通知会粘在通知部分的顶部。您的自定义通知将位于所有其他通知之间(您可以使用通知/通道的优先级参数稍微操纵位置)