关于微信、QQ语音消息,语音电话的时候控制应用音频播放以及暂停
最近项目中有这样的需求,要求在用户使用QQ或微信在录制或播放语音消息的时候可以自动暂停后台的音频播放,完毕后可以恢复播放。
Android是多任务系统,Audio系统是竞争资源,Android2.2之前,没有内建的机制来解决多个程序竞争Audio的问题,2.2引入了称作AudioFocus的机制来管理对Audio资源的竞争的管理与协调。
未解决以上问题,可以使用AudioFocus的机制,即是在使用AudioStream之前,需要申请AudioFocus,在获得AudioFocus之后才可以使用相应的AudioStream;如果有别的程序竞争你正在使用的AudioStream,你的程序需要在收到通知之后做停止播放或者降低声音的处理。
在项目中播放音频一般都是在service中处理播放的逻辑,直接在onCreate中请求AudioFocus,监听播放状态
@Override
public void onCreate() {audioManager = (AudioManager) getApplicationContext().getSystemService(Context.AUDIO_SERVICE);mListener = new MyOnAudioFocusChangeListener();// 请求AudioFocus,注册监听int result = audioManager.requestAudioFocus(mListener,AudioManager.STREAM_MUSIC,AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {//能打印出这句话标识已监听成功Log.e("MyOnAudioFocus", "requestAudioFocus successfully.");} else {Log.e("MyOnAudioFocus", "requestAudioFocus failed.");}...此处省略其他代码
}
@Override
public void onDestory(){...此处省略其他代码//不再监听audioManager.abandonAudioFocus(mListener);
}
具体的对监听的结果进行相应的处理,只需要实现相应的类即可,监听的状态有如下四种
- AUDIOFOCUS_GAIN:当前应用获得了Audio Focus;
- AUDIOFOCUS_LOSS:当前应用失去了Audio Focus,并将会持续很长的时间。这里因为可能会停掉很长时间,所以不仅仅要停止Audio的播放,最好直接释放掉Media资源。而因为停止播放Audio的时间会很长,如果程序因为这个原因而失去AudioFocus,最好不要让它再次自动获得AudioFocus而继续播放,不然突然冒出来的声音会让用户感觉莫名其妙,感受很不好。这里直接放弃AudioFocus,当然也不用再侦听远程播放控制【如下面代码的处理】。要再次播放,除非用户再在界面上点击开始播放,才重新初始化Media,进行播放。
- AUDIOFOCUS_LOSS_TRANSIENT:当前应用暂时失去Audio Focus,并会很快再次获得。必须停止Audio的播放,但是因为可能会很快再次获得AudioFocus,这里可以不释放Media资源;
- AUDIO重点内容FOCUS_LOSS_TRANSIENT_CAN_DUCK:当前应用暂时失去AudioFocus,但是可以继续播放,不过要在降低音量。
在项目中我对 AUDIOFOCUS_LOSS_TRANSIENT AUDIOFOCUS_LOSS_TRANSIENT这两种情况作了相同的处理,都是进行了播放的暂停。isUserPauseAudio这是一个我自己定义的标志位,用来记录是否是用户手动的暂停音乐的播放,如果是用户手动的暂停音乐的播放,那么即使获取到了AudioFocus也不会进行相应的操作,这一点很重要。
private class MyOnAudioFocusChangeListener implements AudioManager.OnAudioFocusChangeListener {@Overridepublic void onAudioFocusChange(int focusChange) {//监听系统播放状态的改变//Log.e("MyOnAudioFocus", "focusChange=" + focusChange);//暂时失去AudioFocus,可以很快再次获取AudioFocus,可以不释放播放资源if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT || focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {if (AudioPlayerService.status == Status.PLAY || AudioPlayerService.status == Status.LOADING) {//暂时失去AudioFocus,可以很快再次获取AudioFocus,可以不释放播放资源,只需暂停播放PlayerController.pausePlay();}} else if (focusChange == AUDIOFOCUS_GAIN) {//获取了AudioFocus,如果当前处于播放暂停状态,并且这个暂停状态不是用户手动点击的暂停,才会继续播放if (AudioPlayerService.status == Status.PAUSE && !Constant.isUserPauseAudio) {PlayerController.continuePlay();}} else if (focusChange == AUDIOFOCUS_LOSS) {// 会长时间的失去AudioFoucs,就不在监听远程播放if (AudioPlayerService.this!=null){PlayerController.stopService(AudioPlayerService.this);audioManager.abandonAudioFocus(mListener);//不再监听播放焦点的变化}}}}
最后分析一下QQ微信语音消息以及拨打语音电话的时候AudioFocus的变化情况,以及相应的处理方式。
操作 | 状态 | 处理方式 |
---|---|---|
录制语音消息/播放语音消息 | AUDIOFOCUS_LOSS_TRANSIENT | 暂停播放,录制/播放结束后,会重新获取AudioFocus,继续播放 |
被动接收QQ/微信电话 | AUDIOFOCUS_LOSS_TRANSIENT | 同上 |
主动拨打QQ/微信电话 & 使用第三方的播放器听歌(酷狗、QQ音乐等) | AUDIOFOCUS_LOSS | 停止播放,拨打电话后,不能再获取到焦点,不再继续播放 |
好了,就此解决了这个问题,分享给大家。
第一次用MarkDown写文章,还有点不适应啊。。。。
关于微信、QQ语音消息,语音电话的时候控制应用音频播放以及暂停相关推荐
- 腾讯否认微信测试语音消息进度调节;监证会同意蚂蚁集团科创板IPO注册;React 17 正式版发布|极客头条
整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 国内 ...
- 微信朋友圈点赞如何设计测试用例,微信发语音消息,购物车,支付页面如何设计软件测试用例?
做过软件测试或者面试过的人应该了解这个问题你肯定被问过,属于面试必问? 就算没遇到,预测你以后面试肯定会遇到,希望你能想到想到我分享的思路. 那么如何轻松优雅的回答这个题目,我给大家分享一个万能公式, ...
- android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码
微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...
- QQ语音消息转换成WAV格式
原创文|Space9 问题背景 QQ已经成为我们生活中的一部分,在QQ上留下了我们许多美好的回忆,一段动听的音乐,或是一句甜蜜的话语,都能触动我们的内心.腾讯使用的语音文件是经过特殊编码(Silk V ...
- Android仿微信发送语音消息动态提示,支持上滑取消发送
Android仿微信发送语音消息动态提示,支持上滑取消发送 先来几张图说明一下,简单直接: 是不是看了图片就秒懂 了. 下面来分析代码实现,直接撸代码. 主页面 AudioSendActivity.j ...
- 极客日报:砍价永远差一刀?拼多多法庭上回复:小数点后有6位;微信加入语音消息暂停功能;谷歌和IBM提议建立关键开源项目清单
一分钟速览新闻点! 砍价永远差一刀?拼多多法庭上回复:小数点后有6位 微信加入语音消息暂停功能,网友:还需要进度条 原极狐汽车"争议总裁"于立国转投小米汽车担任副总 丁磊回应&qu ...
- vue 微信录音倒计时_vue的微信语音功能,录音+对接口返回amr音频播放-Go语言中文社区...
vue的微信语音功能,录音+对接口返回amr音频播放 最近的新项目需要调用微信的录音功能,但是后台又不给音频转码,无奈之下就踏上了研究前端音频编码器这东西. 参考的GitHub仓库--Recorder ...
- 使用Web Speech API制作语音控制的音频播放器
/* For hiding / showing the extra block */ .sp_hiddenblock {margin: 2px;border: 1px solid rgb(250, 1 ...
- iOS 仿微信发送语音消息按钮 - 手势按钮(一)
最近在做基于XMPP的IM,开发到发送语音消息的功能.在某度上搜了很久也没有找到适合的方法.索性自己琢磨了一个,提供给大家参考.(其中找到的很多文章都是一个复制另一个的,很烦!没格式没头没尾的.给不了 ...
最新文章
- vs显式导入(代码注入)依赖库
- C语言在二叉搜索树找到第k个最小元素(附完整源码)
- 【Java】用键盘输入若干数字,以非数字字符结束,计算这些数的和和平均值
- 马哥-Linux云计算架构班学习计划
- go语言阶段综合练习--家庭收支软件的示例--过程版本
- linux mc服务器 mod_使用阿里云服务器搭建饥荒联机版服务器(最新有效2020.2.9更新)...
- 希腊数字matlab,latex 希腊数字
- intel固态硬盘损坏修复
- Python之网络数据采集入门常用模块初识
- 数据通信基础之双绞线
- 大学计算机课程教学建议,计算机应用基础课程教学的建议
- 微信公众平台深度开发JAVA版
- java异常捕获_java之异常捕获
- socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
- python基础编程(Ⅲ)
- 自适应阈值(adaptiveThreshold)分割原理及实现
- Android 登陆页面 图片验证码
- Python生成汉字字符以及对应分辨率的图片
- Spring Boot修改启动神图
- 硬件开源编程利器MyHDL简介