当我的应用程序停止时,我正在尝试从我的应用程序开始音乐播放,当我点击耳机按钮时。
当我的应用程序在播放音乐时,我可以使用MediaSession.Callback onMediaButtonEvent()
或现在不推荐的registerMediaButtonEventReceiver()
来监听媒体按钮,但是如果我暂停音乐一分钟,我的活动和播放服务仍然在运行,然后按下耳机按钮,我发现我失去了接收媒体按钮广播的能力。相反,谷歌现在打开了。
我想做的是谷歌播放音乐。它能够启动音乐回放,即使应用程序完全是stopped...no服务的背景。
我觉得setMediaButtonReceiver()是用来做这件事的,但是我还没能让它开始工作。
setMediaButtonReceiver(PendingIntent mbr() 为媒体按钮接收器设置一个挂起的意图,以便在会话停止后重新启动回放。如果您的应用程序是以这种方式启动的,则将通过挂起的意图发送ACTION_MEDIA_BUTTON意图。
我的服务中有以下片段。
PendingIntent pi = PendingIntent.getBroadcast(HeadsetService.this, 0, new Intent(HeadsetService.this, RemoteControlReceiver.class), 0);
mMediaSession.setMediaButtonReceiver(pi);
我的RemoteControlReceiver BroadcastReceiver已在BroadcastReceiver中注册,但当我按下按钮时,我没有收到任何广播。
我还看到,其他音乐播放器应用程序一旦停止播放大约一分钟,就失去了接收媒体按钮广播的能力。
有什么办法可以让我有一个更健壮的媒体按钮控制吗?
提前感谢!
发布于 2020-09-08 16:03:53
首先,区分MediaSessionCompat
与任何服务(如MediaBrowserServiceCompat
)是很重要的。
MediaSessionCompat
正在与外部MediaSessionStack
通信,该MediaSessionStack
规定哪个应用程序将从外部MediaSessionService
获取媒体键命令。在API 26+上,键将被发送到最后一个播放应用程序。API < 26的设备将首先查找活动播放/缓冲会话,然后查找活动会话,然后查找最后一次播放会话。后者允许应用程序通过在不应该使用mMediaSesssion.isActive
标签的情况下“窃取”焦点。关于优先级的更多细节可以在官方指南中找到。
因此,只要你的应用程序在某个时候设置了mMediaSesssion.isActive = true
,并且是最后一次播放,它就会得到媒体键,除非调用了mMediaSession.release()
。后者将您的会话从MediaSessionStack
中移除,因此您的会话将不再接收媒体键。这就是为什么当你不再期望用户继续播放视频或音乐时,打电话给release()
是很重要的。还有一个警告:如果系统认为您的应用程序被杀死而不是优雅地结束,那么应用程序也将从MediaSessionStack
中删除,这是有意义的,因为在服务中,onDestroy()
不一定在这种情况下被调用,因此系统会为您释放会话。这可能发生在你刷掉应用程序的时候。我使用的一个解决方法是在主应用程序使用时将服务保持在前台,然后在收到服务中对onTaskRemoved()
的呼叫后,在短时间延迟后结束服务。
如果将mMediaSession.release()
放在服务的onDestroy()
中,那么对它的调用将在某个时候发生。该服务在未被使用时预计将结束,因为否则它将占用系统资源。因此,建议以onStop()
命令结尾,或者在刷掉应用程序或通知时结束。在您的情况下,可能发生的情况是,电源经理杀死了您的服务后,不活动了一段时间。取决于实现,即使服务被破坏,播放机的某些部分也可能仍然工作。此外,通知可能仍然存在,因为服务不再处于前台。这可能会让你以为服务在运行。虽然没有更多的细节,但我不能真正说出你到底出了什么问题。
另一个可能阻止应用程序获取媒体键的原因是,如果您的清单没有正确配置。确保您的BroadcaseReceiver
条目包括android.intent.action.MEDIA_BUTTON
意图过滤器。
另一个可能的错误是在服务或任何其他生命周期组件中初始化媒体密钥回调MediaSessionCompat.Callback()
。因此,如果该组件被破坏,它可能很快导致意外的行为。
TLDR:
过滤您的Logcat
为MediaSessionStack|MediaSessionService
,以确保您的应用程序获得媒体键。如果没有,那么:
mMusicService.isActive = true
(例如,在onPlay()
中)mMusicService.release()
然后确保你的应用程序正确地处理媒体键。
androidx.media.session.MediaButtonReceiver
,它们应该处于不依赖于任何服务或生命周期组件的状态的MediaControllerCompat.Callback()
中。我写的答案有点笼统,因为这是一个老问题,其他人可能会从中受益更多,而不是OP。
https://stackoverflow.com/questions/39194548
复制相似问题