Android開發(fā)中免不了需要播放視頻,音頻文件,但是手機(jī)上可能有其他的一些軟件,在后臺播放音頻的時候,這個時候另外的軟件也需要播放音頻,這個時候就會出現(xiàn)倆個音頻同時播放的問題,在Android2.2之后提供了audioFocus獲取音頻的焦點(diǎn),但是這個并不是強(qiáng)制需要實(shí)現(xiàn)的,所以當(dāng)你在測試的時候,有的應(yīng)用沒有處理的音頻焦點(diǎn),所以會感覺沒有效果,其實(shí)我個認(rèn)為可以使用系統(tǒng)的音樂播放器做測試,基本不會出現(xiàn)什么問題(處理的時候注意內(nèi)存泄漏)
https://developer.android.com/training/managing-audio/audio-focus.html
1,獲取焦點(diǎn)
public boolean requestFocus() {
if(mFocusChangeListener != null &&mFocusChangeListener.get() != null) {
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
mAudioManager.requestAudioFocus(mFocusChangeListener.get(),
AudioManager.STREAM_MUSIC,
AudioManager.AUDIOFOCUS_GAIN);
}
return false;
}
2,釋放焦點(diǎn)
public boolean abandonFocus() {
if(mFocusChangeListener != null && mFocusChangeListener.get() != null) {
return AudioManager.AUDIOFOCUS_REQUEST_GRANTED ==
mAudioManager.abandonAudioFocus(mFocusChangeListener);
}
return false;
}
3,處理丟失焦點(diǎn)1
實(shí)現(xiàn)AudioManager.OnAudioFocusChangeListener接口實(shí)現(xiàn)onAudioFocusChange(int focusChange)方法
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT://Pause playback
break;
case AudioManager.AUDIOFOCUS_GAIN://Resume playback
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK://
break;
case AudioManager.AUDIOFOCUS_LOSS://Stop playback
//am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
abandonFocus();
break;
}
4,處理丟失焦點(diǎn)2
focusChange參數(shù)告你音頻焦點(diǎn)時如何改變的,并且能夠是下面的值之一(它們是所有的在AudioManager類中定義的常量):
- AUDIOFOCUS_GAIN:你已經(jīng)獲得音頻焦點(diǎn);
- AUDIOFOCUS_LOSS:你已經(jīng)失去音頻焦點(diǎn)很長時間了,必須終止所有的音頻播放。因為長時間的失去焦點(diǎn)后,不應(yīng)該在期望有焦點(diǎn)返回,這是一個盡可能清除不用資源的好位置。例如,應(yīng)該在此時釋放MediaPlayer對象;
- AUDIOFOCUS_LOSS_TRANSIENT:這說明你臨時失去了音頻焦點(diǎn),但是在不久就會再返回來。此時,你必須終止所有的音頻播放,但是保留你的播放資源,因為可能不久就會返回來。
- AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:這說明你已經(jīng)臨時失去了音頻焦點(diǎn),但允許你安靜的播放音頻(低音量),而不是完全的終止音頻播放。目前所有的情況下,oFocusChange的時候停止mediaPlayer */