關於音頻焦點和音頻競爭通道的問題

項目中,我遇到了一個這樣的問題。後臺正在播放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: 你暫時失去了音頻焦點,但你能夠小聲地繼續播放音頻(低音量)而不是徹底扼殺音頻。  

相關文章
相關標籤/搜索