編輯:關於android開發
因為系統中可能會有多個應用程序會播放音頻,所以需要考慮他們之間該如何交互,為了避免多個應用程序同時播放音樂,Android 系統使用音頻焦點來進行統一管理,即只有獲得了音頻焦點的應用程序才可以播放音樂。
您的應用程序在開始播放音頻文件前,首先應該請求獲得音頻焦點,並且應該同時注冊監聽音頻焦點的丟失通知,即如果音頻焦點被系統或其他的應用程序搶占時,您的應用程序可以做出合適的響應。
您的應用程序在開始播放任何音頻之前,首先應該持有流的音頻焦點。
可以通過調用來實現,如果請求成功,返回 。
您必須指定流類型(使用的是哪一個流)和音頻焦點的類型(短暫的或是持久的)。
瞬態焦點用來播放很短時間的音頻(例如,播放導航指令)。
持久焦點用來播放較長一段時間的音頻(例如,播放音樂)。
下面的代碼片斷演示了請求音樂音頻流的永久音頻焦點。
例如當用戶按下播放背景音樂的按鍵,您應該立即請求音頻焦點,當成功獲得了焦點後再開始播放音樂。
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. // 開始播放音樂文件 }
一旦您的應用程序完成了播放,請記得要調用 方法來通知系統釋放音頻焦點,同時注銷相關的 。這樣當您的應用程序釋放了音頻焦點,則系統會允許其他被中斷的應用程序重新獲取該焦點來繼續播放。
// Abandon audio focus when playback complete am.abandonAudioFocus(afChangeListener);
當請求瞬態音頻焦點時有一個附加參數可供設置,即是否允許 “DUCK”。通常當應用程序失去了音頻焦點時應該停止播放。如果獲取短暫音頻焦點的時候設置了”DUCK” 附加參數,則允許其他的應用程序繼續播放,不需要停止,只要降低音量就可以了,然後直到您的應用程序釋放了焦點,其他應用程序再重新獲得的時候,將音量還原到有一開始的狀態。
// 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. }
“DUCK” 特別適合那種間歇性播放音頻流的應用程序,如駕駛導航的聲音提示。
每當其他的應用程序請求獲得音頻焦點(永久性的,短暫的,短暫並且支持DUCK的)的時候,您應用程序中注冊的音頻焦點監聽器都會收到相應的消息通知。
如果您的應用程序可以請求音頻焦點,那麼當其他應用程序申請的時候,您的應用程序也可能會丟失音頻焦點。怎麼樣應對音頻焦點丟失的情況則取決於音頻焦點丟失的方式。
當音頻焦點丟失時,您注冊的監聽函數onAudioFocusChange()會收到一個事件通知,通知中的參數包括了具體的信息,比如是永久焦點丟失,短暫焦點丟失,還是短暫焦點且允許DUCK的焦點丟失。
通常,如果是短暫焦點的丟失,您的應用程序應該暫停當前的播放,但其他狀態信息繼續保持,並且應該持續監聽音頻焦點的改變,一旦重新獲得了音頻焦點,則可以馬上恢復到以前的播放狀態。
假如是永久焦點的丟失,則通常意味著其他應用程序要長時間播放音頻了,您的應用程序應該停止播放,放棄音頻焦點的監聽,並注銷所有的媒體按鈕監聽器,從而讓獲得焦點的其他應用程序來監聽媒體播放控制按鈕的按鍵消息。如果要恢復您應用程序的播放狀態,則通常需要用戶重新啟動您的應用程序。
在下面的代碼片段中,如果丟失的是短暫音頻焦點,則暫定當前應用程序的播放,如果丟失的是永久音頻焦點,則停止當前應用程序的播放,停止監聽音頻焦點的變更,並注銷媒體按鈕事件的監聽。
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 } } };
如果丟失的短暫音頻焦點允許DUCK狀態,在這種情況下,應用程序降低音量繼續播放,不需要暫停。
DUCK:降低您應用程序的音量,從而不會打擾其他應用程序音頻的播放。
在下面的代碼片段中,當我們失去焦點的時候,降低了媒體播放的音量,重新獲得焦點的時候,將音量恢復到原來的狀態。
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 } } };
音頻焦點的丟失是非常重要的一種系統狀態變化通知,系統會廣播很多有關音頻狀態變化的通知,您的應用程序應該監聽這些變化,並作出合適的應對方案,從而提高用戶的音樂體驗。
下一節課主要是學習監聽系統的狀態變化來提高用戶的整體體驗。
參考文摘:
轉自:http://blog.zhourunsheng.com/2011/12/android-%e9%9f%b3%e4%b9%90%e7%bc%96%e7%a8%8b%e4%b8%93%e9%a2%98%e4%b9%8b%e7%ae%a1%e7%90%86%e9%9f%b3%e9%a2%91%e7%84%a6%e7%82%b9/ | 潤物無聲
redis lru實現策略在使用redis作為緩存的場景下,內存淘汰策略決定的redis的內存使用效率。在大部分場景下,我們會采用LRU(Least Recently U
EventBus初理解,EventBus理解 緣由: 平時工作,因為懶於動筆的原因,也沒注重技術和經驗的積累,導致之前曾經研究過的問題現在又忘
Android無線開發的幾種常用技術綜述 本文由阿裡巴巴移動安全客戶端、YunOS資深工程師Hao(嵌入式企鵝圈原創團隊成員)撰寫,是Hao在嵌入式企鵝
XAMARIN.ANDROID SIGNALR 實時消息接收發送示例,xamarinsignalrSignalR 是一個開發實時 Web 應用的 .NET 類庫,使用 S