注:本文翻譯自Google官方的Android Developers Training文檔,譯者技術一般,由于喜愛安卓而產生了翻譯的念頭,純屬個人興趣愛好。
原文鏈接: http://developer.android.com/training/managing-audio/audio-focus.html
有很多應用會要播放音頻,所以他們之間如何交互是很重要的。為了防止每個音樂播放器應用在同一時間播放,Android使用音頻焦點來調整音頻的播放。也就是說,只有獲得了音頻焦點的應用可以播放音頻。
在你的應用開始播放音頻之前,它應該需求并接收音頻焦點。另外,它應該知道如何監聽音頻焦點丟失的情況,并在發生焦點丟失時能夠正確地響應。
一). 需求音頻焦點
在你的應用開始播放音頻之前,它應該獲取要使用音頻流的焦點。這需要調用
requestAudioFocus()
方法。如果請求成功,那么會返回
AUDIOFOCUS_REQUEST_GRANTED
。
你必須指定你正在使用的是什么流,和你期望獲得暫時的還是永久的音頻焦點。當你只需要短時間的播放音頻時(比如當播放一些使用導航時),那么應該請求暫時焦點。當你計劃在可預測的未來持續播放音頻時(比如播放音樂),那么你應該請求永久焦點。
下面的代碼請求音樂音頻流的永久焦點。你必須在你開始播放之前就請求音頻焦點,比如當用戶按下了播放鍵,或下一級別游戲的背景音樂開始時:
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // Request audio focus for playback int result = am.requestAudioFocus(afChangeListener, // Use the music stream. AudioManager.STREAM_MUSIC, // Request permanent focus. AudioManager.AUDIOFOCUS_GAIN); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); // Start playback. }
一旦你完成了播放,務必記得要調用 abandonAudioFocus() ,這將會告知系統你不再需要焦點并且注銷相關聯的 AudioManager.OnAudioFocusChangeListener 。對于放棄了暫時焦點的情況,這回允許任何被打斷的應用繼續播放。
// Abandon audio focus when playback complete am.abandonAudioFocus(afChangeListener);
當請求暫時音頻焦點時,你可以有一個額外的選項:你是否希望啟用“ ducking ”。一般的,當一個正常的應用丟失了音頻焦點后,它會立馬停止播放。通過請求允許“ ducking ”的暫時音頻焦點,相當于你告知了其他應用:你們可以繼續播放,但是他們需要在焦點回到他們手中之前降低音量。
// Request audio focus for playback int result = am.requestAudioFocus(afChangeListener, // Use the music stream. AudioManager.STREAM_MUSIC, // Request permanent focus. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK); if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) { // Start playback. }
" Ducking "對于那些間歇性使用音頻流的應用特別有用,比如那些語音駕駛提醒的。
在任何時候,若其他的應用像上面描述的那樣請求音頻焦點,它所選擇的永久的活暫時的(有或沒有“ ducking ”選項)音頻焦點,在請求時都會被你注冊的監聽器所接收。
二). 處理焦點丟失
如果你的應用請求了音頻焦點,它遵守這樣的規定:如果其他應用請求焦點,它會按照次序丟失焦點。你的應用應該如何響應焦點丟失取決于丟失的方式。
在你請求音頻焦點時,注冊的音頻焦點變更監聽器中 onAudioFocusChange() 回調函數會接收一個參數,它描述焦點變化的事件。特別地,可能的焦點丟失事件反映的是上一部分的焦點請求類型,永久丟失,暫時丟失以及允許“ ducking ”的暫時焦點。
一般而言,一個暫時的音頻焦點丟失會導致你的應用音頻流沒有聲音,但其它方面會保持不變。你應該持續檢查音頻焦點的變化,并準備在你重新獲得焦點時,從暫停額位置繼續播放。
如果音頻焦點要永久丟失,它假定另一個應用正在被用來聽音頻,并且你的應用應該將自己終止。在實際的場景下,這意味著停止播放,移除媒體按鍵監聽,允許新的音頻播放器單獨處理這些事件,并放棄你的音頻焦點。這樣之后,在你恢復播放音頻之前你只能期望用戶的行為(如在你應用中按下播放鍵)。
在下面的代碼中,我們停止播放器或者我們的媒體播放對象,如果音頻焦點丟失是暫時的,另外恢復它當我們要恢復焦點時。如果焦點丟失是永久的,那么代碼會注銷我們的媒體按鍵時間接收器,并停止檢查音頻焦點變更。
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange( int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT // Pause playback } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Resume playback } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) { am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); am.abandonAudioFocus(afChangeListener); // Stop playback } } };
對于允許
ducking
而丟失焦點的情況,那么你可以使用“
ducking
”而不是停止播放。
三). Duck!
Ducking 是降低你音頻外放的音量使得另一個應用的暫時性音頻更容易聽見,這樣就不用暫停你自己應用的播放了。
下面的代碼在暫時丟失焦點時降低我們播放器的音量,并在恢復焦點后,恢復音量。
OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() { public void onAudioFocusChange( int focusChange) { if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) { // Lower the volume } else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) { // Raise it back to normal } } };
音頻焦點的丟失是要響應廣播中最重要的,但它不是唯一一個最重要的。系統會發送一系列的intent來讓你改變用戶的音頻體驗。下一節課將會講授如何監聽它們來提供用戶的音頻體驗。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
