关于微信、QQ语音消息,语音电话的时候控制应用音频播放以及暂停
来源:互联网 发布:动态数组clear函数 编辑:程序博客网 时间:2024/04/30 18:07
最近项目中有这样的需求,要求在用户使用QQ或微信在录制或播放语音消息的时候可以自动暂停后台的音频播放,完毕后可以恢复播放。
Android是多任务系统,Audio系统是竞争资源,Android2.2之前,没有内建的机制来解决多个程序竞争Audio的问题,2.2引入了称作AudioFocus的机制来管理对Audio资源的竞争的管理与协调。
未解决以上问题,可以使用AudioFocus的机制,即是在使用AudioStream之前,需要申请AudioFocus,在获得AudioFocus之后才可以使用相应的AudioStream;如果有别的程序竞争你正在使用的AudioStream,你的程序需要在收到通知之后做停止播放或者降低声音的处理。
在项目中播放音频一般都是在service中处理播放的逻辑,直接在onCreate中请求AudioFocus,监听播放状态
@Overridepublic 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."); } ...此处省略其他代码}
@Overridepublic 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 { @Override public 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的变化情况,以及相应的处理方式。
好了,就此解决了这个问题,分享给大家。
第一次用MarkDown写文章,还有点不适应啊。。。。
- 关于微信、QQ语音消息,语音电话的时候控制应用音频播放以及暂停
- 安卓音乐播放时微信视频微信语音电话进来音乐暂停播放
- 网页播放微信多媒体语音消息
- android 暂停和继续第三方应用的语音播放
- android 暂停和继续第三方应用的语音播放
- 微信电话语音质量 VS VOLTE语音质量
- iOS 9音频应用播放音频之播放控制暂停停止前进后退的设置
- 微信Speex语音音频解码
- IOS类似于微信和qq的泡泡语音
- HTML5微信jssdk录音播放语音的方法
- 微信 jssdk 语音监听播放结束的坑
- QQ和微信语音音量分析
- Android 仿QQ/微信语音功能。
- 仿微信语音消息的录制和播放
- 移动端语音播放以及语音条拖动的实现
- 04环信聊天界面 - 播放语音消息
- 关于语音聊天(wave系列函数播放文件、网络音频)的实现方法
- perl对微信语音信息的处理,以及将语音信息合并
- MFC的文件操作 CFile 删除和重命名文件
- 工作5年后才明白的道理
- 页面js中文乱码怎么解决?
- [leetcode]282. Expression Add Operators
- C++进程注入
- 关于微信、QQ语音消息,语音电话的时候控制应用音频播放以及暂停
- Chromium 控件 DotNetBrowser V1.11发布 | 附下载
- Java IO里流的概念和转换流
- linux 常用工具
- Python命令行参数解析:getopt和argparse
- MVC @page 命令
- spark RDD分区2GB限制(Size exceeds Integer.MAX_VALUE)
- html5 multiple多文件异步上传 服务器接收文件重复
- 对input输入框内容判断非空 和 去空格