Dav*_*idH 5 android android-mediaplayer android-audiomanager android-broadcastreceiver android-mediasession
当我的应用程序停止时单击耳机按钮时,我试图能够从我的应用程序开始播放音乐。
我可以使用MediaSession.CallbackonMediaButtonEvent()或者现在已经过时registerMediaButtonEventReceiver()监听媒体按钮点击WHILE我的应用程序在播放音乐,但如果我暂停音乐一分钟,我的活动和播放服务仍在运行,然后我按下耳机按钮,我看到我已经失去了接收媒体按钮广播的能力。相反,Google 即时会打开。
我正在尝试做的是像 Google Play Music 这样的东西。即使应用程序完全停止,它也可以开始播放音乐......后台没有服务。
我觉得setMediaButtonReceiver()是用来做这个的,但我一直无法让它工作。
setMediaButtonReceiver(PendingIntent mbr)
为您的媒体按钮接收器设置一个挂起的意图,以允许在会话停止后重新开始播放。如果您的应用以这种方式启动,将通过待处理的意图发送 ACTION_MEDIA_BUTTON 意图。
我的服务中有以下代码段。
PendingIntent pi = PendingIntent.getBroadcast(HeadsetService.this, 0, new Intent(HeadsetService.this, RemoteControlReceiver.class), 0);
mMediaSession.setMediaButtonReceiver(pi);
Run Code Online (Sandbox Code Playgroud)
我的 RemoteControlReceiver BroadcastReceiver 已在清单中注册,但是当我按下按钮时我没有收到广播。
我还看到其他音乐播放器应用在停止播放大约一分钟后就失去了接收媒体按钮广播的能力。
有什么想法可以让我拥有更强大的媒体按钮控件吗?
提前致谢!
首先,与MediaSessionCompat任何服务(例如MediaBrowserServiceCompat.
MediaSessionCompat正在与外部通信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()另一个可能的错误是在服务或任何其他生命周期组件中初始化媒体密钥回调。因此,如果该组件被破坏,很快就会导致意外行为。
总而言之:
过滤您的Logcat以MediaSessionStack|MediaSessionService确保您的应用程序获取媒体密钥。如果没有,那么:
mMusicService.isActive = true设置(例如在 中onPlay())mMusicService.release()没有被调用然后确保您的应用程序正确处理媒体键。
androidx.media.session.MediaButtonReceiver它们MediaControllerCompat.Callback()的状态不应该依赖于任何服务或生命周期组件我写的答案更笼统一些,因为这是一个老问题,其他人可能比OP更能从中受益。