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