【问题标题】:How to use MediaSession.setMediaButtonReceiver(PendingIntent) to resume playback如何使用 MediaSession.setMediaButtonReceiver(PendingIntent) 恢复播放
【发布时间】:2016-08-28 18:35:26
【问题描述】:

当我的应用停止时单击耳机按钮时,我正尝试从我的应用开始音乐播放。

我可以使用 MediaSession.Callback onMediaButtonEvent() 或现在已弃用的 registerMediaButtonEventReceiver() 来收听媒体按钮单击 WHILE 我的应用正在播放音乐,但如果我暂停音乐一分钟,我的活动和播放服务仍在运行,然后我按下耳机按钮,我看到我失去了接收媒体按钮广播的能力。而是打开 Google Now。

我正在尝试做的是类似于 Google Play 音乐的东西。即使应用完全停止,它也能开始播放音乐...后台没有任何服务。

我觉得setMediaButtonReceiver() 是用于此的,但我无法让它工作。

setMediaButtonReceiver(PendingIntent mbr)

为您的媒体按钮接收器设置待处理意图,以允许在会话停止后重新开始播放。如果您的应用以这种方式启动,则会通过待处理的 Intent 发送 ACTION_MEDIA_BUTTON Intent。

我的服务中有以下 sn-p。

PendingIntent pi = PendingIntent.getBroadcast(HeadsetService.this, 0, new Intent(HeadsetService.this, RemoteControlReceiver.class), 0);
mMediaSession.setMediaButtonReceiver(pi);

我的 RemoteControlReceiver BroadcastReceiver 已在 Manifest 中注册,但按下按钮时我没有收到广播。

我还发现,其他音乐播放器应用一旦停止播放大约一分钟,就会失去接收媒体按钮广播的能力。

有什么想法可以让我拥有更强大的媒体按钮控件吗?

提前致谢!

【问题讨论】:

  • 所以已经有一段时间了。你有运气吗?

标签: android android-mediaplayer android-audiomanager android-broadcastreceiver android-mediasession


【解决方案1】:

首先,将MediaSessionCompatMediaBrowserServiceCompat 等任何服务区分开来很重要。

MediaSessionCompat 正在与外部MediaSessionStack 通信,该外部MediaSessionStack 指示哪个应用程序将从外部MediaSessionService 获取媒体键命令。在 API 26+ 上,密钥将被发送到最后播放的应用程序。 API mMediaSesssion.isActive 标签来“窃取”焦点。有关优先级的更多详细信息,请参阅the official guide

因此,只要您的应用在某个时间点设置了 mMediaSesssion.isActive = true 并且最后一次播放,它就会获得媒体密钥,除非调用了 mMediaSession.release()。后者会从MediaSessionStack 中删除您的会话,因此您的会话将不再接收媒体密钥。这就是为什么在您不再期望用户继续播放视频或音乐时致电release() 很重要的原因。还有一个警告:如果系统认为您的应用程序被终止而不是正常结束,那么该应用程序也会从MediaSessionStack 中删除,这是有道理的,因为在这种情况下不一定会调用服务中的onDestroy(),因此系统为您释放会话。当您滑开应用程序时,可能会发生这种情况。我使用的一种解决方法是在使用主应用程序时将服务保持在前台,然后在服务中收到对onTaskRemoved() 的调用后短暂延迟后结束服务。

如果你把它放在你的服务的onDestroy() 中,就会在某个时候调用mMediaSession.release()。该服务预计将在不使用时结束,否则它会占用系统资源。因此,建议在onStop() 命令或刷掉应用程序或通知时结束它。在您的情况下,电源管理器可能会在一段时间不活动后终止您的服务。根据实现,即使服务被销毁,播放器的某些部分可能仍然工作。此外,通知可能仍然存在,因为服务不再处于前台。这可能会让您误以为该服务正在运行。虽然没有更多细节,但我不能真正说出你的情况到底出了什么问题。

另一个可能会阻止您的应用获取媒体密钥的原因是您的清单配置不正确。确保您的 BroadcaseReceiver 条目包含 android.intent.action.MEDIA_BUTTON 意图过滤器。

另一个可能的错误是在服务或任何其他生命周期组件中初始化您的媒体密钥回调MediaSessionCompat.Callback()。因此,如果该组件被破坏,它会很快导致意外行为。

TLDR:

MediaSessionStack|MediaSessionService 过滤您的Logcat,以确保您的应用获取媒体密钥。如果没有,那么:

  • 确保设置了mMusicService.isActive = true(例如在onPlay()中)
  • 确保不调用mMusicService.release()
  • 确保您的清单设置正确
  • 确保系统不会认为您的服务已被终止(例如,通过滑动应用程序)而不是正常结束

然后确保您的应用正确处理媒体密钥。

  • 如果是自定义接收器,它们应该在那里。
  • 如果是androidx.media.session.MediaButtonReceiver,它们应该位于MediaControllerCompat.Callback(),其状态不应依赖于任何服务或生命周期组件

我写的答案更笼统一些,因为这是一个老问题,其他人可能比 OP 从中受益更多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-20
    • 2011-07-21
    • 1970-01-01
    • 2021-09-02
    • 2016-05-03
    • 2013-11-21
    相关资源
    最近更新 更多