1.首先我們需要了解一下Android中對于音頻播放的管理機制
Android中應用程序播放音頻的時候,必須獲取音頻焦點,即獲取audioFocus。芯方式
要請求音頻焦點,必須調用
AudioManager中的requestAudioFocus()方法
同時,
AudioManager.OnAudioFocusChangeListener是申請成功之后監聽AudioFocus使用情況的Listener,后續如果有別的程序要競爭AudioFocus,都是通過這個Listener的onAudioFocusChange()方法來通知這個Audio Focus的使用者的。
同時通過這個listener我們監聽到的focusChange參數將會告訴你音頻焦點是如何改變的,并且能夠是下面的值之一(它們是在AudioManager類中定義的常量):
(
1). AUDIOFOCUS_GAIN:你已經獲得音頻焦點;
(
2). AUDIOFOCUS_LOSS:你將會長時間失去音頻焦點,必須終止所有的音頻播放。因為長時間的失去焦點后,不應該在期望有焦點返回,這是一個盡可能清除不用資源的好位置。例如,
應該在此時釋關閉
FM;
(
3). AUDIOFOCUS_LOSS_TRANSIENT:這說明你臨時失去了音頻焦點,但是在不久就會再返回來。
此時,你必須終止所有的音頻播放,但是保留你的播放資源,因為可能不久就會返回來。
(
4). AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:這說明你已經臨時失去了音頻焦點,但允許你安靜的播放音頻(低音量),而不是完全的終止音頻播放。
2.當視頻(音樂)進行播放的時候,播放視頻(音樂)的應用將會向系統申請audioFocus。
申請的類型為
AudioManager.AUDIOFOCUS_GAIN ,表示應用需要長時間占用音頻焦點。
這樣會導致
FM的audioFocus狀態發生改變 會長時間失去audioFocus 資源。
FM 監聽收到的audioFocus 改變狀態為AUDIOFOCUS_LOSS,此時FM應該退出。
在
FMPlayService.java 中的處理邏輯
private synchronized boolean requestAudioFocus() {
if(mAudioFocusListener == null){
mAudioFocusListener = new AudioManager.OnAudioFocusChangeListener() {
@Override
public void onAudioFocusChange(int focusChange) {
if (DEBUG) Log.d(LOGTAG, "AudioFocusChanged " + focusChange);
switch (focusChange) {
case AudioManager.AUDIOFOCUS_LOSS:
mPausedByTransientLossOfFocus = false;
fmUtil.fmSignal2Info(FMUtil.FM_NOTIFY_STATE, FMUtil.FM_STATE_MUSIC_OFF, "off");
fmOff(true);
} ..
...
所以即使退出視頻(音樂)播放,此時FM已經關閉,它將無法恢復播放。
這是由于
Android 的audioFocus 管理機制下的正常現象