解决音频焦点问题
Android audio系统
-- 当打开音视频时处理与一个后台播放中的音频的冲突
private void requestAudioFocus() {
audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
//请求焦点的参数说明:
//AUDIOFOCUS_GAIN:想要长期占有焦点,失去焦点者stop播放和释放
//AUDIOFOCUS_GAIN_TRANSIENT:想要短暂占有焦点,失去焦点者pause播放
//AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:想要短暂占有焦点,失去焦点者可以继续播放但是音量需要调低
//AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:想要短暂占有焦点,但希望失去焦点者不要有声音播放
audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}
}
private void abandonAudioFocus() {
audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
audioManager.abandonAudioFocus(mAudioFocusListener);
}
}
private AudioManager.OnAudioFocusChangeListener mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
//对应AUDIOFOCUS_GAIN 表示音频焦点请求者需要长期占有焦点,这里一般需要stop播放和释放
// pauseMediaPlayer();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
//对应AUDIOFOCUS_GAIN_TRANSIENT 表示音频焦点请求者需要短暂占有焦点,这里一般需要pause播放
//pauseMediaPlayer();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
//对应AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 表示音频焦点请求者需要占有焦点,但是我也可以继续播放,只是需要降低音量或音量置为0
break;
case AudioManager.AUDIOFOCUS_GAIN:
//获得焦点,这里可以进行恢复播放
if (mediaPlayer != null) {
// startMediaPlayer();
}
break;
default:
}
}
};
以上自定义后台播放音乐小控件的音频焦点逻辑,其他音频播放时暂停 ,其他音视频停止播放时恢复播放。一般的音视频播放都会遵循这样的逻辑,如果音视频焦点未设置,可以在控件初始化时(播放时)申请焦点,控件释放时(停止播放时)释放焦点达到目的 。
貌似在Android 9.0设备上面需要单独适配,项目中换了另外一种方案。