解決音頻焦點(diǎn)問(wèn)題
Android audio系統(tǒng)
-- 當(dāng)打開(kāi)音視頻時(shí)處理與一個(gè)后臺(tái)播放中的音頻的沖突
private void requestAudioFocus() {
audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
//請(qǐng)求焦點(diǎn)的參數(shù)說(shuō)明:
//AUDIOFOCUS_GAIN:想要長(zhǎng)期占有焦點(diǎn),失去焦點(diǎn)者stop播放和釋放
//AUDIOFOCUS_GAIN_TRANSIENT:想要短暫占有焦點(diǎn)京闰,失去焦點(diǎn)者pause播放
//AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:想要短暫占有焦點(diǎn),失去焦點(diǎn)者可以繼續(xù)播放但是音量需要調(diào)低
//AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:想要短暫占有焦點(diǎn)甩苛,但希望失去焦點(diǎn)者不要有聲音播放
audioManager.requestAudioFocus(mAudioFocusListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
}
}
private void abandonAudioFocus() {
audioManager = (AudioManager) getContext().getSystemService(Context.AUDIO_SERVICE);
if (audioManager != null) {
audioManager.abandonAudioFocus(mAudioFocusListener);
}
}
private AudioManager.OnAudioFocusChangeListener mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
//對(duì)應(yīng)AUDIOFOCUS_GAIN 表示音頻焦點(diǎn)請(qǐng)求者需要長(zhǎng)期占有焦點(diǎn)蹂楣,這里一般需要stop播放和釋放
// pauseMediaPlayer();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
//對(duì)應(yīng)AUDIOFOCUS_GAIN_TRANSIENT 表示音頻焦點(diǎn)請(qǐng)求者需要短暫占有焦點(diǎn),這里一般需要pause播放
//pauseMediaPlayer();
break;
case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
//對(duì)應(yīng)AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 表示音頻焦點(diǎn)請(qǐng)求者需要占有焦點(diǎn)讯蒲,但是我也可以繼續(xù)播放痊土,只是需要降低音量或音量置為0
break;
case AudioManager.AUDIOFOCUS_GAIN:
//獲得焦點(diǎn),這里可以進(jìn)行恢復(fù)播放
if (mediaPlayer != null) {
// startMediaPlayer();
}
break;
default:
}
}
};
以上自定義后臺(tái)播放音樂(lè)小控件的音頻焦點(diǎn)邏輯墨林,其他音頻播放時(shí)暫停 赁酝,其他音視頻停止播放時(shí)恢復(fù)播放。一般的音視頻播放都會(huì)遵循這樣的邏輯旭等,如果音視頻焦點(diǎn)未設(shè)置酌呆,可以在控件初始化時(shí)(播放時(shí))申請(qǐng)焦點(diǎn),控件釋放時(shí)(停止播放時(shí))釋放焦點(diǎn)達(dá)到目的 搔耕。
貌似在Android 9.0設(shè)備上面需要單獨(dú)適配隙袁,項(xiàng)目中換了另外一種方案。