盡管某個時刻只有一個activity可以運行嚷往,Android卻是一個多任務環(huán)境.這對使用音頻的應用帶來了特殊的挑戰(zhàn)杭棵,因為只有一個音頻輸出而可能多個媒體都想用它.在Android2.2之前,沒有內(nèi)建的機制來處理這個問題胆绊,所以可能在某些情況下導致壞的用戶體驗.例如氨鹏,當一個用戶正在聽音樂而另一個應用需要通知用戶一些重要的事情時,用戶可能由于音樂聲音大而不能聽的通知.從Android2.2開始压状,平臺為應用提供了一個協(xié)商它們?nèi)绾问褂迷O備音頻輸出的途徑仆抵,這個機制叫做音頻焦點,AudioManager种冬。
當你的應用需要輸出像樂音和通知之類的音頻時镣丑,你應該總是請求音頻焦點.一旦應用具有了焦點,它就可以自由的使用音頻輸出.但它總是應該監(jiān)聽焦點的變化.如果被通知丟失焦點娱两,它應該立即殺死聲音或降低到靜音水平(有一個標志表明應選擇哪一個)并且僅當重新獲得焦點后才恢復大聲播放莺匠。
首先,注冊一個焦點監(jiān)聽器OnAudioFocusChangeListener 十兢。
private AudioManager.OnAudioFocusChangeListener mAudioFocusChangeListener = null;
//Build.VERSION.SDK_INT表示當前SDK的版本趣竣,Build.VERSION_CODES.ECLAIR_MR1為SDK 7版本 ,
//因為AudioManager.OnAudioFocusChangeListener在SDK8版本開始才有旱物。
if(Build.VERSION.SDK_INT > Build.VERSION_CODES.ECLAIR_MR1){
mAudioFocusChangeListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
if(focusChange == AudioManager.AUDIOFOCUS_LOSS){
//失去焦點之后的操作
if(isPlaying()){
pause();
}
}else if(focusChange == AudioManager.AUDIOFOCUS_GAIN){
//獲得焦點之后的操作
}
}
};
}
要請求音頻焦點遥缕,你必須從AudioManager mAudioMgr 調(diào)用requestAudioFocus(),如下所示:
private void requestAudioFocus() {
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1){
return;
}
if (mAudioMgr == null)
mAudioMgr = (AudioManager) ApplicationEx.app.getSystemService(Context.AUDIO_SERVICE);
if (mAudioMgr != null) {
DLog.i(TAG, "Request audio focus");
int ret = mAudioMgr.requestAudioFocus(mAudioFocusChangeListener,AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if (ret != AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { DLog.i(TAG, "request audio focus fail. " + ret);
}
}
}
放棄焦點
private void abandonAudioFocus() {
if(Build.VERSION.SDK_INT <= Build.VERSION_CODES.ECLAIR_MR1){
return;
}
if (mAudioMgr != null) {
DLog.i(TAG, "Abandon audio focus");
mAudioMgr.abandonAudioFocus(mAudioFocusChangeListener);
mAudioMgr = null;
}
}
參數(shù)focusChange告訴你音頻焦點如何發(fā)生了變化宵呛,它可以是以上幾種值(它們都是定義在AudioManager中的常量):
AUDIOFOCUS_GAIN:你已獲得了音頻焦點.
AUDIOFOCUS_LOSS:你已經(jīng)丟失了音頻焦點比較長的時間了.你必須停止所有的音頻播放.因為預料到你可能很長時間也不能再獲音頻焦點单匣,所以這里是清理你的資源的好地方.比如,你必須釋放MediaPlayer.
AUDIOFOCUS_LOSS_TRANSIENT:你臨時性的丟掉了音頻焦點宝穗,很快就會重新獲得.你必須停止所有的音頻播放户秤,但是可以保留你的資源,因為你可能很快就能重新獲得焦點.
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你臨時性的丟掉了音頻焦點逮矛,但是你被允許繼續(xù)以低音量播放鸡号,而不是完全停止.
轉(zhuǎn)自:http://www.csdn123.com/html/blogs/20130507/10148.htm