关于音频焦点和音频竞争通道的问题

项目中,我遇到了一个这样的问题。后台正在播放Music,此时去Settings中的铃声与提示音中设置一个通知音铃声,在选择铃声时会播放此铃声,可是却并无中断Music,二者会同时播放,听起来很混乱。那是由于,播放铃声的时候,没有去获取一个音频焦点,没有竞争通道。咱们知道,听歌的时候,来了电话,这时歌曲确定会被暂停,直到通话结束后才会继续播放。就是由于作出了这样的处理。
有一个专门管理音频的类,叫AudioManager 。位于 frameworks/base/media/java/android/media/AudioManager.javajava

经过getSystemService(Context.AUDIO_SERVICE)方法得到AudioManager实例对象。在必要的地方调用requestAudioFocus方法来获取音频焦点,此时就会暂停其余的音频。而后必定要在操做结束的地方,调用abandonAudioFocus释放掉音频焦点,才能恢复以前的播放。android

 

import android.media.AudioManager;ide

AudioManager am = (AudioManager) this.getSystemService(Context.AUDIO_SERVICE)this

 

申请的时候:.net

am.requestAudioFocus(null, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);对象

其中第一个参数是AudioManager.OnAudioFocusChangeListener,每当音频焦点有变更的时候其onAudioFocusChange()方法被调用。若是不须要监听,就是null 。第二个参数是streamType,指音频的类型,可取为STREAM_VOICE_CALL(通话)、STREAM_SYSTEM(系统声音)、STREAM_RING(铃声)、STREAM_MUSIC(音乐)、STREAM_ALARM(闹铃声),这里取的是音乐。第三个参数durationHint,是持续性的指示: AUDIOFOCUS_GAIN指示申请获得的Audio Focus不知道会持续多久,通常是长期占有;AUDIOFOCUS_GAIN_TRANSIENT指示要申请的AudioFocus是暂时性的,会很快用完释放的;AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK不但说要申请的AudioFocus是暂时性的,还指示当前正在使用AudioFocus的能够继续播放。资源

 

释放的时候:get


am.abandonAudioFocus(null);it

经过这个方法来归还音频。参数就是获取焦点时注册的监听,也就是requestAudioFocus时的第一个参数,若是没有监听,就是null .io

我上面提到的这个问题,就是在播放铃声的那个列表,OnItemClickListener时获取焦点,在列表销毁的时候释放焦点,就能够了,并不须要对音频状态的改变进行监听。可是OnAudioFocusChangeListener在AudioManager中是一个十分重要的知识点,顺便也整理一下:

import android.media.AudioManager.OnAudioFocusChangeListener;

private OnAudioFocusChangeListener mAudioFocusChangeListener = new OnAudioFocusChangeListener() {
                @Override
                public void onAudioFocusChange(int focusChange) {
                    switch (focusChange) {
              case AudioManager.AUDIOFOCUS_LOSS:
            synchronized (this) {}
             break;
                        case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
            synchronized (this) {}
            break;
                        case AudioManager.AUDIOFOCUS_GAIN:
            synchronized (this) {}
            break;
            case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
            synchronized (this) {}
            break;

            default:
            break;
            }
        }
};

AUDIOFOCUS_GAIN: 你已经获得了音频焦点。 AUDIOFOCUS_LOSS: 你已经失去了音频焦点很长时间了。你必须中止全部的音频播放。由于你应该不但愿长时间等待焦点返回,这将是你尽量清除你的资源的一个好地方。例如,你应该释放MediaPlayer。 AUDIOFOCUS_LOSS_TRANSIENT:你暂时失去了音频焦点,但很快会从新获得焦点。你必须中止全部的音频播放,可是你能够保持你的资源,由于你可能很快会从新得到焦点。 AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK: 你暂时失去了音频焦点,但你能够小声地继续播放音频(低音量)而不是彻底扼杀音频。  

相关文章
相关标签/搜索