问题描述:应用播放视频的时候,打开第三方音乐应用(如酷狗)随机播放一首音乐;结果:同时存在视频声音和音乐声音;
这种情况显然是糟糕的体验,究其问题原因是播放视频时没有对音频焦点做处理导致(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);
}
}
如果应用涉及到音视频播放的话,建议把播放页面的来电监听加上,提升下体验;声音并发问题可能会让用户在嘈杂的环境下卸载应用;