? ? ? ?因為系統中可能會有多個應用程序會播放音頻郭计,所以需要考慮他們之間該如何交互霸琴,為了避免多個應用程序同時播放音樂,Android 系統使用音頻焦點來進行統一管理,即只有獲得了音頻焦點的應用程序才可以播放音樂昭伸。
音頻焦點:處理各播放器之間混音雜音問題梧乘,但切記有音頻焦點不一定有聲音,有聲音也不一定具有音頻焦點庐杨。音頻焦點其實就是聲音的一個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();
}
}