Android -音頻焦點處理

? ? ? ?因為系統(tǒng)中可能會有多個應用程序會播放音頻,所以需要考慮他們之間該如何交互,為了避免多個應用程序同時播放音樂,Android 系統(tǒng)使用音頻焦點來進行統(tǒng)一管理,即只有獲得了音頻焦點的應用程序才可以播放音樂。

音頻焦點:處理各播放器之間混音雜音問題,但切記有音頻焦點不一定有聲音,有聲音也不一定具有音頻焦點。音頻焦點其實就是聲音的一個flag標識,是否有聲音要是否有mute.

請求音頻焦點:每當其他的應用程序請求獲得音頻焦點(永久性的,短暫的,短暫并且支持DUCK的)的時候,您應用程序中注冊的音頻焦點監(jiān)聽器都會收到相應的消息通知。處理音頻焦點的丟失 。即當前播放器播放歌曲時候,其他播放器點擊播放器時候 ?其他播放器請求音頻焦點,當前播放器就會丟失音頻焦點聲音暫停。

請求音頻焦點代碼:ComponentName媒體鍵廣播 主要解決媒體鍵廣播發(fā)某一音樂指令時,使當前播放器響應

/**

* 請求音頻焦點

*/

publicbooleanrequestAudioFocus() {

Log.i(TAG,"requestAudioFocus");

intresult =mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener,

AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

if(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {

mAudioManager.registerMediaButtonEventReceiver(mComponentName);

mIsAudioFocus=true;

}

returnmIsAudioFocus;

}

/**

*初始化相關類

*

/

publicvoidinit(Context context) {

mComponentName=newComponentName(context.getPackageName(), MediaButtonBroadcast.class.getName());

mAudioManager= (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

}

請求短暫音頻焦點:主要是指請求的焦點 一段時間會丟失 ?丟失焦點的播放器會重新獲得焦點(比如音樂播放時候 來電話 音樂暫停 ?掛斷電話 ?音樂繼續(xù)播放)

釋放音頻焦點:當前播放器播放時,其他播放器強占焦點 當前播放器暫停

短暫丟失焦點處理:主要對聲音壓低、聲音消失一段時間后重新獲取

重新獲取焦點:掛斷電話后重新恢復播放

短暫丟失焦點 :壓低聲音 ?比如播放器播放音樂時候 來了一條短信 ?播放器聲音變小

請求短暫音頻焦點代碼:

/**

* 請求短暫的音頻焦點

*/

publicbooleanrequestAudioFocusTransient() {

Log.i(TAG,"requestAudioFocusTransient");

intresult =mAudioManager.requestAudioFocus(mOnAudioFocusChangeListener,

AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);

//mIsAudioFocus = true;

return(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED);

}

釋放音頻焦點代碼:

publicvoidabandonAudioFocus() {

Log.i(TAG,"abandonAudioFocus");

mAudioManager.abandonAudioFocus(mOnAudioFocusChangeListener);

mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);

}

音頻焦點處理代碼:

/**

* 音頻焦點處理

*/

privateOnAudioFocusChangeListenermOnAudioFocusChangeListener=newOnAudioFocusChangeListener() {

@Override

publicvoidonAudioFocusChange(intfocusChange) {

switch(focusChange) {

caseAudioManager.AUDIOFOCUS_LOSS_TRANSIENT:// 暫時丟失焦點,可重新獲得焦點

Log.i(TAG,"AUDIOFOCUS_LOSS_TRANSIENT");

lossTransient();

break;

caseAudioManager.AUDIOFOCUS_GAIN:// 重新獲得焦點

Log.i(TAG,"AUDIOFOCUS_GAIN");

audioFocusGain();

break;

caseAudioManager.AUDIOFOCUS_LOSS:// 永久丟失焦點除非重新主動獲取

Log.i(TAG,"AUDIOFOCUS_LOSS");

abandonAudioFocus();

break;

caseAudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:// 短暫丟失焦點,壓低后臺音量

Log.i(TAG,"AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK");

audioFocusLossDuck();

break;

}

}

};

短暫丟失焦點處理代碼:

privatevoidlossTransient() {

mIsLossTransient=true;

mIsLoss=true;

mIsAudioFocus=false;

Log.i(TAG,"lossTransient");

mAudioManager.unregisterMediaButtonEventReceiver(mComponentName);

if(mCtrlListener!=null) {

mCtrlListener.pause();

}

}

重新獲取焦點代碼:

privatevoidaudioFocusGain() {

if(mIsLossTransient) {// 如果暫時丟失焦點

mIsLossTransient=false;

mIsAudioFocus=true;

mIsaudioFocusGain=true;

mAudioManager.registerMediaButtonEventReceiver(mComponentName);

if(mCtrlListener!=null) {

mCtrlListener.resume();

}

}

if(mIsLossDuck) {// 壓低聲音,重新獲得焦點后恢復聲音

mIsLossDuck=false;

if(mCtrlListener!=null) {

// 恢復聲音

mCtrlListener.recoverSound();

}

}

}

短暫丟失焦點代碼:

privatevoidaudioFocusLossDuck() {

mIsLossDuck=true;

if(mCtrlListener!=null) {

// 壓低聲音

mCtrlListener.lowSound();

}

}

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容