最近项目中有这样的需求,要求在用户使用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语音消息,语音电话的时候控制应用音频播放以及暂停相关推荐

  1. 腾讯否认微信测试语音消息进度调节​;监证会同意蚂蚁集团科创板IPO注册;React 17 正式版发布|极客头条

    整理 | 郑丽媛 头图 | CSDN 下载自东方 IC 「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 国内 ...

  2. 微信朋友圈点赞如何设计测试用例,微信发语音消息,购物车,支付页面如何设计软件测试用例?

    做过软件测试或者面试过的人应该了解这个问题你肯定被问过,属于面试必问? 就算没遇到,预测你以后面试肯定会遇到,希望你能想到想到我分享的思路. 那么如何轻松优雅的回答这个题目,我给大家分享一个万能公式, ...

  3. android仿微信语音聊天功能,Android仿微信发送语音消息的功能及示例代码

    微信的发送语音是有一个向上取消的,我们使用ontouchlistener来监听手势,然后做出相应的操作就行了. 直接上代码: //语音操作对象 private mediaplayer mplayer ...

  4. QQ语音消息转换成WAV格式

    原创文|Space9 问题背景 QQ已经成为我们生活中的一部分,在QQ上留下了我们许多美好的回忆,一段动听的音乐,或是一句甜蜜的话语,都能触动我们的内心.腾讯使用的语音文件是经过特殊编码(Silk V ...

  5. Android仿微信发送语音消息动态提示,支持上滑取消发送

    Android仿微信发送语音消息动态提示,支持上滑取消发送 先来几张图说明一下,简单直接: 是不是看了图片就秒懂 了. 下面来分析代码实现,直接撸代码. 主页面 AudioSendActivity.j ...

  6. 极客日报:砍价永远差一刀?拼多多法庭上回复:小数点后有6位;微信加入语音消息暂停功能;​谷歌和IBM提议建立关键开源项目清单

    一分钟速览新闻点! 砍价永远差一刀?拼多多法庭上回复:小数点后有6位 微信加入语音消息暂停功能,网友:还需要进度条 原极狐汽车"争议总裁"于立国转投小米汽车担任副总 丁磊回应&qu ...

  7. vue 微信录音倒计时_vue的微信语音功能,录音+对接口返回amr音频播放-Go语言中文社区...

    vue的微信语音功能,录音+对接口返回amr音频播放 最近的新项目需要调用微信的录音功能,但是后台又不给音频转码,无奈之下就踏上了研究前端音频编码器这东西. 参考的GitHub仓库--Recorder ...

  8. 使用Web Speech API制作语音控制的音频播放器

    /* For hiding / showing the extra block */ .sp_hiddenblock {margin: 2px;border: 1px solid rgb(250, 1 ...

  9. iOS 仿微信发送语音消息按钮 - 手势按钮(一)

    最近在做基于XMPP的IM,开发到发送语音消息的功能.在某度上搜了很久也没有找到适合的方法.索性自己琢磨了一个,提供给大家参考.(其中找到的很多文章都是一个复制另一个的,很烦!没格式没头没尾的.给不了 ...

最新文章

  1. vs显式导入(代码注入)依赖库
  2. C语言在二叉搜索树找到第k个最小元素(附完整源码)
  3. 【Java】用键盘输入若干数字,以非数字字符结束,计算这些数的和和平均值
  4. 马哥-Linux云计算架构班学习计划
  5. go语言阶段综合练习--家庭收支软件的示例--过程版本
  6. linux mc服务器 mod_使用阿里云服务器搭建饥荒联机版服务器(最新有效2020.2.9更新)...
  7. 希腊数字matlab,latex 希腊数字
  8. intel固态硬盘损坏修复
  9. Python之网络数据采集入门常用模块初识
  10. 数据通信基础之双绞线
  11. 大学计算机课程教学建议,计算机应用基础课程教学的建议
  12. 微信公众平台深度开发JAVA版
  13. java异常捕获_java之异常捕获
  14. socket编程为什么需要htons(), ntohl(), ntohs(),htons() 函数
  15. python基础编程(Ⅲ)
  16. 自适应阈值(adaptiveThreshold)分割原理及实现
  17. Android 登陆页面 图片验证码
  18. Python生成汉字字符以及对应分辨率的图片
  19. Spring Boot修改启动神图
  20. 硬件开源编程利器MyHDL简介

热门文章

  1. 服务器gs文件修改器,NBA2K17L大修改器用法 使用第三方名单和GS教程
  2. 和朋友一起玩的玩家表现更好
  3. 计算机单证硕士,读单证计算机科学与技术研究生
  4. 批量打包下载阿里OSS文件
  5. 硬盘安装Debian7(Wheezy)以及初级配置
  6. 数据分析方面比较好的几个网站
  7. 易语言调用大漠初级入门
  8. CRC16冗余循环检测计算器-好用。modbus RTU
  9. 位运算符之无符号右移(十进制整数)
  10. 可视化GC日志分析工具