在做音樂播放器的時候外面一般需要寫一個監聽器來監聽音頻資源是否被搶占的監聽器,比如當我們播放音樂的時候打開視頻播放器播放視頻這時候外面就要求音樂暫停然后播放視頻。一般外面需要寫一個音頻變化的監聽器:OnAudioFocusChangeListener。當其他的應用申請音頻資源的方式不同時候我們做出相應的處理。
廢話不多說,一個簡單的監聽器:focusChange表示的是音頻改變的模式,即搶占資源的應用的申請音頻的方式,這里監聽到音頻的變化時候可以直接放送消息利用handler異步處理播放器控件的狀態和關閉播放器等操作,當用來修改notification的狀態的時候,這時候可能播放器資源被回收(這取決於申請資源focusChange的方式),不能用notification.notify,得重新創建notification了。
private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange(int focusChange) { if(focusChange == AudioManager.AUDIOFOCUS_GAIN ) { ... } else if (focusChange =..) { ... } } };
關於focusChange的介紹:(參考這篇博客:http://blog.csdn.net/thl789/article/details/7422931)
- AUDIOFOCUS_GAIN:獲得了Audio Focus;
- AUDIOFOCUS_LOSS:失去了Audio Focus,並將會持續很長的時間。這里因為可能會停掉很長時間,所以不僅僅要停止Audio的播放,最好直接釋放掉Media資源。而因為停止播放Audio的時間會很長,如果程序因為這個原因而失去AudioFocus,最好不要讓它再次自動獲得AudioFocus而繼續播放,不然突然冒出來的聲音會讓用戶感覺莫名其妙,感受很不好。這里直接放棄AudioFocus,當然也不用再偵聽遠程播放控制【如下面代碼的處理】。要再次播放,除非用戶再在界面上點擊開始播放,才重新初始化Media,進行播放。
- AUDIOFOCUS_LOSS_TRANSIENT:暫時失去Audio Focus,並會很快再次獲得。必須停止Audio的播放,但是因為可能會很快再次獲得AudioFocus,這里可以不釋放Media資源;
-
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK
:暫時失去AudioFocus,但是可以繼續播放,不過要在降低音量。
一、AudioFocus的申請與釋放
獲取/放棄AudioFocus的方法都在android.media.AudioManager中,獲取AudioFocus用requestAudioFocus()
;用完之后,放棄AudioFocus,用abandonAudioFocus()
。
函數原型:
1、audioManager.requestAudioFocus(OnAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN_TRANSIENT);
streamType是《Android中的Audio播放:音量和遠程播放控制》中說明的AudioStream,其值取決於AudioManager中的STREAM_xxx,在AudioStream的裁決機制中並未有什么實際意義;
- durationHint是持續性的指示:(這個值對應於第三個OnAudioFocusChangeListener中focusChange的方式即值)
AUDIOFOCUS_GAIN
指示申請得到的Audio Focus不知道會持續多久,一般是長期占有;
AUDIOFOCUS_GAIN_TRANSIENT
指示要申請的AudioFocus是暫時性的,會很快用完釋放的;
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK不但說要申請的AudioFocus是暫時性的,還指示當前正在使用AudioFocus的可以繼續播放,只是要“duck”一下(降低音量)。
AudioManager.OnAudioFocusChangeListener是申請成功之后監聽AudioFocus使用情況的Listener,后續如果有別的程序要競爭AudioFocus,都是通過這個Listener的onAudioFocusChange()方法來通知這個Audio Focus的使用者的。
- AUDIOFOCUS_REQUEST_GRANTED:申請成功;
- AUDIOFOCUS_REQUEST_FAILED:申請失敗。
2、 audioManager.abandonAudioFocus(OnAudioFocusChangeListener);