gpt4 book ai didi

android - 如何使用 MediaSession.setMediaButtonReceiver(PendingIntent) 恢复播放

转载 作者:行者123 更新时间:2023-12-03 20:22:43 32 4
gpt4 key购买 nike

当我的应用程序停止时单击耳机按钮时,我试图能够从我的应用程序开始音乐播放。
我可以使用 MediaSession.Callback onMediaButtonEvent()或现已弃用的 registerMediaButtonEventReceiver()收听媒体按钮点击我的应用正在播放音乐,但是如果我暂停音乐一分钟,而我的 Activity 和播放服务仍在运行,然后我按下耳机按钮,我发现我失去了接收媒体按钮广播的能力。相反,Google Now 会打开。
我正在尝试做的是类似于 Google Play 音乐的东西。即使应用程序完全停止,它也可以开始播放音乐……后台没有服务。
我觉得setMediaButtonReceiver()是用于此的,但我无法让它工作。

setMediaButtonReceiver(PendingIntent mbr)

Set a pending intent for your media button receiver to allow restarting playback after the session has been stopped. If your app is started in this way an ACTION_MEDIA_BUTTON intent will be sent via the pending intent.


我的服务中有以下代码段。
PendingIntent pi = PendingIntent.getBroadcast(HeadsetService.this, 0, new Intent(HeadsetService.this, RemoteControlReceiver.class), 0);
mMediaSession.setMediaButtonReceiver(pi);
我的 RemoteControlReceiver BroadcastReceiver 已在 Manifest 中注册,但是当我按下按钮时我没有收到任何广播。
我还看到其他音乐播放器应用程序在停止播放大约一分钟后就失去了接收媒体按钮广播的能力。
有什么想法可以让我拥有更强大的媒体按钮控件吗?
提前致谢!

最佳答案

首先,区分 MediaSessionCompat 很重要来自任何服务,例如 MediaBrowserServiceCompat .MediaSessionCompat正在与外部 MediaSessionStack 通信这决定了哪个应用程序将从外部 MediaSessionService 获取媒体键命令.在 API 26+ 上, key 将被发送到最后播放的应用程序。 API < 26 的设备将首先查找 Activity 播放/缓冲 session ,然后查找 Activity session ,然后查找最后一个播放 session 。后者允许应用程序通过保留 mMediaSesssion.isActive 来“窃取”焦点。在他们不应该标记的时候标记。有关优先级的更多详细信息,请参见 the official guide .
所以只要你的应用设置mMediaSesssion.isActive = true在某个时刻并且最后一次播放时,它将获得媒体 key ,除非 mMediaSession.release()被称为。后者从 MediaSessionStack 中删除您的 session 因此您的 session 将不再接收媒体 key 。这就是为什么调用 release() 很重要的原因。一旦您不再期望用户继续播放视频或音乐。还有一个警告:如果系统认为您的应用程序已被终止而不是正常结束,则该应用程序将从 MediaSessionStack 中删除同样,这是有道理的,因为在服务中 onDestroy()在这种情况下不一定会调用,因此系统会为您释放 session 。当您滑开应用程序时,可能会发生这种情况。我使用的一种解决方法是在使用主应用程序时将服务保持在前台,然后在收到对 onTaskRemoved() 的调用后短暂延迟后结束服务。在服务中。
调用 mMediaSession.release()如果你把它放在 onDestroy() 中会在某个时候发生您的服务。该服务预计将在不使用时结束,否则它会占用系统资源。因此,建议以 onStop() 结束。命令或刷掉应用程序或通知时。在您的情况下,电源管理器可能会在一段时间不活动后终止您的服务。根据实现,即使服务被销毁,播放器的某些部分可能仍然工作。此外,通知可能仍然存在,因为服务不再处于前台。这可能会让您误以为该服务正在运行。虽然没有更多细节,但我不能真正说出你的情况到底出了什么问题。
可能会阻止您的应用获取媒体 key 的另一个原因是您的 list 配置不正确。确保您的 BroadcaseReceiver条目包括 android.intent.action.MEDIA_BUTTON Intent 过滤器。
另一个可能的错误是初始化您的媒体 key 回调 MediaSessionCompat.Callback()在服务或任何其他生命周期组件中。因此,如果该组件被破坏,它会很快导致意外行为。
TLDR:
过滤您的Logcat对于 MediaSessionStack|MediaSessionService以确保您的应用获取媒体 key 。如果没有,那么:

  • 确保 mMusicService.isActive = true已设置(例如在 onPlay() 中)
  • 确保 mMusicService.release()不叫
  • 确保您的 list 设置正确
  • 确保系统不会认为您的服务被终止(例如通过刷掉应用程序)而不是优雅地结束

  • 然后确保您的应用程序正确处理媒体 key 。
  • 如果是自定义接收器,它们应该在那里。
  • 如果是 androidx.media.session.MediaButtonReceiver他们应该在MediaControllerCompat.Callback()其状态不应依赖于任何服务或生命周期组件

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

    关于android - 如何使用 MediaSession.setMediaButtonReceiver(PendingIntent) 恢复播放,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39194548/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com