Loading [MathJax]/jax/input/TeX/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何使用MediaSession.setMediaButtonReceiver(PendingIntent)恢复播放

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

Stack Overflow用户
提问于 2016-08-28 10:35:26
回答 1查看 2.5K关注 0票数 5

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

当我的应用程序在播放音乐时,我可以使用MediaSession.Callback onMediaButtonEvent()或现在不推荐的registerMediaButtonEventReceiver()来监听媒体按钮,但是如果我暂停音乐一分钟,我的活动和播放服务仍然在运行,然后按下耳机按钮,我发现我失去了接收媒体按钮广播的能力。相反,谷歌现在打开了。

我想做的是谷歌播放音乐。它能够启动音乐回放,即使应用程序完全是stopped...no服务的背景。

我觉得setMediaButtonReceiver()是用来做这件事的,但是我还没能让它开始工作。

setMediaButtonReceiver(PendingIntent mbr() 为媒体按钮接收器设置一个挂起的意图,以便在会话停止后重新启动回放。如果您的应用程序是以这种方式启动的,则将通过挂起的意图发送ACTION_MEDIA_BUTTON意图。

我的服务中有以下片段。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PendingIntent pi = PendingIntent.getBroadcast(HeadsetService.this, 0, new Intent(HeadsetService.this, RemoteControlReceiver.class), 0);
mMediaSession.setMediaButtonReceiver(pi);

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

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

有什么办法可以让我有一个更健壮的媒体按钮控制吗?

提前感谢!

EN

回答 1

Stack Overflow用户

发布于 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:

过滤您的LogcatMediaSessionStack|MediaSessionService,以确保您的应用程序获得媒体键。如果没有,那么:

  • 确保设置了mMusicService.isActive = true (例如,在onPlay()中)
  • 确保没有调用mMusicService.release()
  • 确保您的清单设置正确。
  • 确保系统不认为您的服务被终止(例如,通过刷掉应用程序),而不是体面地结束

然后确保你的应用程序正确地处理媒体键。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39194548

复制
相关文章
CSS 阴影动画优化技巧一则
本技巧来自这篇文章 -- How to animate box-shadow with silky smooth performance
Sb_Coco
2019/11/01
1K0
CSS 阴影动画优化技巧一则
UITableViewCell的重用机制原理
每当有一个cell从屏幕消失,就将其放到缓存池中,如果有新的cell出现,就去缓存池中取,如果缓存池中没有,再创建。
赵哥窟
2018/11/07
1.9K0
使用UITableViewCell遇到的问题
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/52414255
用户1451823
2018/09/13
7900
IOS UITableView UITableViewCell控件
import UIKit class ViewController:UIViewController,UITableViewDataSource { override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view,typically from a nib. let screenRect = UIScreen.main.bounds let tableRect = CGRect(x:0, y:20, width: screenRect.size.width, height:screenRect.size.height - 20) let tableView = UITableView(frame:tableRect) tableView.dataSource = self self.view.addSubview(tableView) } func tableView(_ tableView:UITableView,numberOfRowsInSection section:Int) -> Int{ return 20 } func tableView(_ tableView:UITableView,cellForRowAt indexPath:IndexPath) -> UITableViewCell { let identifier = “reusedCell” var cell =tableView.dequeueReusableCell(withIdentifier:identifier) if(cell == nil) { cell = UITableViewCell(style:UITableViewCellStyle.default, reuseIdentifier:identifier) } cell?.textLabel?.text = “命运负责洗牌,玩牌的是我们自己!” return cell! } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
用户5760343
2019/07/08
6530
IOS UITableView UITableViewCell控件
利用CSS线性渐变、阴影、缩放实现动画下雨效果
这个动画效果,如果让你来做,你会选择什么方式?相信很多小伙伴都会用gif图片。其实用css实现也很简单。
Javanx
2019/09/04
1.7K0
利用CSS线性渐变、阴影、缩放实现动画下雨效果
IOS UITableViewCell的删除和插入
----------------------------------------插入------------------------------------------- 1 import UIKit 2 3 class ViewController:UIViewController, UITableViewDataSource, UITableViewDelegate{ 4 5 var diablo3Level = [“普通模式”, “困难模式”, “高手模 式”, “大师模式”, “地狱模
用户5760343
2019/07/08
9090
IOS UITableViewCell的删除和插入
[WPF] 使用 Effect 玩玩阴影、内阴影、 长阴影
最近在学习怎么用 Shazzam Shader Editor 编写自定义的 Effect,并试着去实现阴影、内阴影和长阴影的效果。结果我第一步就放弃了,因为阴影用到的高斯模糊算法对我来说太太太太太太太太难了,最后只好用些投机取巧的方法来模仿这几种效果。
dino.c
2022/05/07
1.7K0
[WPF] 使用 Effect 玩玩阴影、内阴影、 长阴影
iOS_UITableView性能优化
// 滑动时按需加载, 防止卡顿 配合SDWebImage https://github.com/johnil/VVeboTableViewDemo
mikimo
2022/07/20
6480
阴影进阶,实现更加的立体的阴影效果!
关于它们的基础语法和使用就不过多描述,这一部分大家可以先在 MDN 补齐,贴几张图快速复习一下:
Sb_Coco
2022/04/28
2K0
阴影进阶,实现更加的立体的阴影效果!
input 在iPhone 上 上边框有阴影
主要让appearance属性为none; input { outline: none; -webkit-appearance: none; /*去除系统默认的样式*/ -webkit-tap-highlight-color: rgba(0, 0, 0, 0); /* 点击高亮的颜色*/ }
用户1437675
2018/08/20
9580
【CSS】盒子模型阴影 ( box-shadow: 水平阴影 垂直阴影 模糊距离 阴影尺寸 阴影颜色 内外阴影; )
只有 前两个阴影 , 水平阴影 和 垂直阴影 必须写 , 后面的四个值可以省略 ;
韩曙亮
2023/03/25
1.2K0
【CSS】盒子模型阴影 ( box-shadow: 水平阴影 垂直阴影 模糊距离 阴影尺寸 阴影颜色 内外阴影; )
Service Broker 无法工作的问题修复
数据库的Service Broker在通过备份/还原方式恢复数据库后,通过SELECT * FROM sys.transmission_queue 查到的错误信息: An exception occurred while enqueueing a message in the target queue. Error: 15517, State: 1. Cannot execute as the database principal because the principal "dbo" does not e
张善友
2018/01/19
1K0
文本阴影和边框阴影
    box-shadow:left top 模糊距离 阴影尺寸 阴影颜色 inset(内阴影);
十月梦想
2018/08/29
9760
SVG 动画精髓(上)
本文作者:ivweb villainthr TL;DR 本文主要是讲解关于 SVG 的一些高级动画特效,比如 SVG 动画标签,图形渐变,路径动画,线条动画,SVG 裁剪等。 例如:路径动画 图形
腾讯IVWEB团队
2017/07/06
3.7K0
SVG 动画精髓(上)
IOS UITableViewCell 选中 选择
1 import UIKit 2 3 class ViewController:UIViewController, UITableViewDataSource, UITableViewDelegate{ 4 5 let diablo3Level = [“普通模式”, “困难模式”, “高手模式”, “大师模式”, “痛苦模式”] 6 7 override func viewDidLoad() { 8 super.viewDidLoad() 9 // Do any additional
用户5760343
2019/07/08
1.1K0
IOS UITableViewCell 选中 选择
iOS开发-UITableViewCell的创建方式
被static修饰的成员变量,全局只有一份内存 static的后面只可以放一个定值,这是在编译阶段就确定的
孙寅
2020/06/02
1.3K0
uniswap的工作原理(上)
你吃过天上掉下的馅饼吗?只要你在2020年的9月1号之前在uniswap交易所进行过任何一笔操作,就可以获得400的uni币。这个消息刚出的时候uni价值3美元,后续最高峰涨到了8.7美元。也就是说只要你进行了一笔交易,就能获得8k~2w人民币不等的奖励。
用户7976544
2020/11/14
1.7K0
uniswap的工作原理(上)
iOS UITableViewCell使用详解
- (instancetype)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;
珲少
2018/08/15
1.1K0
UITableViewCell中添加复制逻辑
@interface ICUserInfoCell(){ UIMenuItem * _copyMenuItem; } @end @implementation ICUserInfoCell - (id)initWithStyle:(UITableViewCellStyle)cell reuseIdentifier:(NSString *)reuseIdentifier { self = [super initWithStyle:cell reuseIdentifier:reuseIdent
程序员不务正业
2018/06/14
7760
制作高大上的Canvas粒子动画
制作粒子动画效果要解决两个问题:一个是粒子动画轨迹,另外一个是粒子执行动画的时机。 首先来看下我们准备要做的粒子动画效果是怎么样的~ 是这样(粒子漂浮): 或者这样(粒子轨迹动画): 甚至是这样
练小习
2017/12/29
2.5K0

相似问题

UITableViewCell上的动画

20

UITableViewCell阴影

20

UITableViewCell阴影

11

在UITableviewCell高度设置动画时同时设置CALayer阴影动画

44

滚动时UITableViewCell上的阴影消失

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文