音频焦点是Android系统统一音视频播放的一个规则,避免多个应用同时在播放音视频,导致声音很杂。
如果大家都按照这个规则进行开发,那么当你获取焦点进行播放时,其他正在播放的应用就会失去焦点暂停播放,这样体验会好很多。
但是实际上这规则并不具有强制性,所以也会有很多不按套路出牌的应用存在着,这里仅讨论怎么按套路出牌。
一般音视频应用需要完成以下三步,可以根据实际需要,但是建议尽量按照常规处理,具体使用注释已经详细说明了。
一、请求焦点:
private void requestAudioFocus(){
AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
if (am != null) {
//请求焦点的参数说明:
//AUDIOFOCUS_GAIN:想要长期占有焦点,失去焦点者stop播放和释放
//AUDIOFOCUS_GAIN_TRANSIENT:想要短暂占有焦点,失去焦点者pause播放
//AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:想要短暂占有焦点,失去焦点者可以继续播放但是音量需要调低
//AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:想要短暂占有焦点,但希望失去焦点者不要有声音播放
am.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
}
}
二、释放焦点:
private void abandonAudioFocus(){
AudioManager am = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
if (am != null) {
am.abandonAudioFocus(mAudioFocusListener);
}
}
三、焦点改变监听:
private AudioManager.OnAudioFocusChangeListener mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() {
public void onAudioFocusChange(int focusChange) {
switch(focusChange){
case AudioManager.AUDIOFOCUS_LOSS:
//对应AUDIOFOCUS_GAIN
//表示音频焦点请求者需要长期占有焦点,这里一般需要stop播放和释放
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
//对应AUDIOFOCUS_GAIN_TRANSIENT
//表示音频焦点请求者需要短暂占有焦点,这里一般需要pause播放
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
//对应AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK
//表示音频焦点请求者需要占有焦点,但是我也可以继续播放,只是需要降低音量或音量置为0
break;
case AudioManager.AUDIOFOCUS_GAIN:
//获得焦点,这里可以进行恢复播放
break;
}
}
};