【bug整理】Android声音并发问题:播放视频的时候,用第三方应用播放音乐,存在音视频声音并发问题

问题描述:应用播放视频的时候,打开第三方音乐应用(如酷狗)随机播放一首音乐;结果:同时存在视频声音和音乐声音;


这种情况显然是糟糕的体验,究其问题原因是播放视频时没有对音频焦点做处理导致(Android 2.2开始有音频焦点机制);播放视频前需要先请求音频焦点,暂停视频、播放完成或者应用退到后台时需要释放音频焦点,以便于其他应用使用音频焦点;音视频应用一般都会遵守音频焦点机制;


解决音视频并发问题,可以在自定义的xxxVideoView中或视频播放的xxxActivity中添加如下代码;

	/**用AudioManager获取音频焦点避免音视频声音并发问题 */
	private AudioManager mAudioManager;
	private OnAudioFocusChangeListener mAudioFocusChangeListener;


在播放视频的时候请求音频焦点,第三方应用在失去音频焦点后会暂停播放(音视频应用一般都会遵守音频焦点机制,在失去焦点的回调中做暂停等处理);

    @Override
	public void start() {
    	if (requestTheAudioFocus() == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {
			//焦点获取成功,播放操作
		}else {
			//提示用户关闭其他音频再播放,不然用户以为是bug呢...
		}
    }

在暂停视频、播放完成或退到后台时释放音频焦点;

	@Override
	public void pause() {
		releaseTheAudioFocus(mAudioFocusChangeListener);
		//暂停逻辑
	}

 

请求音频焦点,并设置监听器

    //zxzhong 请求音频焦点 设置监听
    private int requestTheAudioFocus() {
    	if (Build.VERSION.SDK_INT < 8) {//Android 2.2开始(API8)才有音频焦点机制
			return 0;
		}
    	if (mAudioManager == null) {
    		mAudioManager  = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);
		}
    	if (mAudioFocusChangeListener == null) {
    		mAudioFocusChangeListener = new OnAudioFocusChangeListener() {//监听器
        		@Override
        		public void onAudioFocusChange(int focusChange) {
        			switch (focusChange) {
        			case AudioManager.AUDIOFOCUS_GAIN:
        			case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT:
					case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:
						//播放操作
        				break;
        				
        			case AudioManager.AUDIOFOCUS_LOSS:
        			case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
        			case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
        				//暂停操作
        				break;
        			default:
        				break;
        			}
        		}
        	};
		}
    	//下面两个常量参数试过很多 都无效,最终反编译了其他app才搞定,汗~
    	int requestFocusResult = mAudioManager.requestAudioFocus(mAudioFocusChangeListener,
    			AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK,
    			AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
    	
    	return requestFocusResult;
	}

 

暂停、播放完成或退到后台释放音频焦点

    //zxzhong 暂停、播放完成或退到后台释放音频焦点
    private void releaseTheAudioFocus(OnAudioFocusChangeListener mAudioFocusChangeListener) {
		if (mAudioManager != null && mAudioFocusChangeListener != null) {
			mAudioManager.abandonAudioFocus(mAudioFocusChangeListener);
		}
	}

如果应用涉及到音视频播放的话,建议把播放页面的来电监听加上,提升下体验;声音并发问题可能会让用户在嘈杂的环境下卸载应用;


  • 5
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值