Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题
来源:互联网 发布:泰安知金复读 编辑:程序博客网 时间:2024/05/12 09:55
当你的应用需要输出像乐音和通知之类的音频时,你应该总是请求音频焦点.一旦应用具有了焦点,它就可以自由的使用音频输出.但它总是应该监听焦点的变化.如果被通知丢失焦点,它应该立即杀死声音或降低到静音水平(有一个标志表明应选择哪一个)并且仅当重新获得焦点后才恢复大声播放。
首先,注册一个焦点监听器OnAudioFocusChangeListener 。
private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener = null;//Build.VERSION.SDK_INT表示当前SDK的版本,Build.VERSION_CODES.ECLAIR_MR1为SDK 7版本 , //因为AudioManager.OnAudioFocusChangeListener在SDK8版本开始才有。if(Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR_MR1){mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {@Overridepublic void onAudioFocusChange(int focusChange) {if(focusChange == AudioManager.AUDIOFOCUS_LOSS){//失去焦点之后的操作if(isPlaying()){pause();}}else if(focusChange == AudioManager.AUDIOFOCUS_GAIN){//获得焦点之后的操作}}};}
要请求音频焦点,你必须从AudioManager mAudioMgr调用requestAudioFocus(),如下所示:
private void requestAudioFocus() {if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1){return;}if (mAudioMgr == null)mAudioMgr = (AudioManager) ApplicationEx.app.getSystemService(Context.AUDIO_SERVICE);if (mAudioMgr != null) {DLog.i(TAG, "Request audio focus");int ret = mAudioMgr.requestAudioFocus(mAudioFocusChangeListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);if (ret != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {DLog.i(TAG, "request audio focus fail. " + ret);}}}
放弃焦点
private void abandonAudioFocus() {if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1){return;}if (mAudioMgr != null) {DLog.i(TAG, "Abandon audio focus");mAudioMgr.abandonAudioFocus(mAudioFocusChangeListener);mAudioMgr = null;}}
参数focusChange告诉你音频焦点如何发生了变化,它可以是以上几种值(它们都是定义在AudioManager中的常量):
AUDIOFOCUS_GAIN:你已获得了音频焦点.
AUDIOFOCUS_LOSS:你已经丢失了音频焦点比较长的时间了.你必须停止所有的音频播放.因为预料到你可能很长时间也不能再获音频焦点,所以这里是清理你的资源的好地方.比如,你必须释放MediaPlayer.
AUDIOFOCUS_LOSS_TRANSIENT:你临时性的丢掉了音频焦点,很快就会重新获得.你必须停止所有的音频播放,但是可以保留你的资源,因为你可能很快就能重新获得焦点.
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你临时性的丢掉了音频焦点,但是你被允许继续以低音量播放,而不是完全停止.
当第三方播放器也使用了这个机制的话,当你的应用获取声音焦点之后,第三方播放器失去焦点,做了暂停处理,即会停止播放。这样就不会出现两个播放器同时播放音乐的情况了。而如果第三方播放器没有经过处理,不管有没有焦点都一直播放,那就没有办法了。 =。=||
- Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题
- Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题
- Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题,暂停其他的播放
- 播放声音的问题
- flash 控制声音的播放和停止
- Android SurfaceView播放视频有声音无图像问题
- ffmpeg 音频播放器的播放没声音的问题
- 播放器的声音
- Android 利用AudioManager控制后台音乐播放器暂停,播放
- android暂停或停止其他音乐播放器的播放
- android暂停或停止其他音乐播放器的播放
- android暂停或停止其他音乐播放器的播放
- 移动端解决两个andio不能同时播放的问题
- Android应用:AudioManager 播放音乐
- android 的soundpool播放声音
- android 音乐播放器(播放,停止)
- Delphi播放声音文件类(包括调整其中任意一个声音的大小)
- Android 判断是否有声音在播放
- 多维数组计算差集
- IFE提取参与者上一级领导
- Microsoft.VisualBasic.Devices之Network 类
- Object-C 入门教程<转>
- 从ARM9到A15 手机处理器架构进化历程
- Android AudioManager处理两个播放器同时有声音,停止其中一个播放的问题
- sde相关
- 马云是这样骂不上进的员工
- NOSQL数据库的基石是CAP原则,那关系型数据库呢?
- 第七周求圆柱表面积
- Android Studio Mac 快捷键整理分享
- 十二 v4l2 video设备注册和调用过程
- SSH配置详解
- (十三) 信号量、消息队列和共享内存