Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放
原文地址:http://android.xsoftlab.net/training/managing-audio/index.html
引言
如果APP需要播放音頻,允許用戶可以控制音頻的播放狀態是很重要的一點。為了保證有極佳的用戶體驗,還有很重要的一點就是,APP需要管理音頻的焦點來確保不會有多個APP同時播放音頻。
在稍后的課程中,將會學習如何使APP響應物理按鍵的按下事件,這需要在播放音頻時,請求音頻的焦點,以及需要適當的響應由系統或者其它應用程序引起的音頻焦點改變。
控制APP的音量以及播放狀態
一個良好的用戶體驗是可預測的。如果APP可以播放媒體,那么用戶可以通過設備上的物理按鍵或者虛擬按鍵來控制APP的音量是非常重要的一點。比如藍牙耳機或者頭戴式耳機。
同樣,在適當的情況下,通過APP所使用的音頻流基礎之上來控制播放,停止,暫停,跳過,以及原始的媒體播放按鍵都應該執行其各自的行為和功能。
識別所用的音頻流
創建可預測的音頻體驗的第一步是理解APP將使用的音頻流。
Android對播放音樂、鬧鐘、通知以及電話鈴聲、系統聲音、呼叫音量和DTMF鈴聲都維護了單獨的音頻流。這么做主要是允許用戶可以控制每個流各自的音頻。
大部分流都會受限于系統事件,所以除非APP是個鬧鐘應用,否則,幾乎可以確定APP播放音頻所使用的就是STREAM_MUSIC流。
使用物理按鍵控制APP聲音的音量
默認情況下,按下音量鍵會修改當前正在活動的音頻流的音量。如果APP當前沒有播放任何東西,按下音量鍵只會調整鈴聲的音量。
如果正在使用一款游戲APP或者音樂APP,那么當用戶按下音量鍵的時候調整音量是極好的,因為用戶想要控制游戲或者音樂的音量,即使現在在兩首歌之間或者當前的游戲界面上沒有播放音樂。
你可能想試著監聽音量按鍵的按下事件,然后修改音頻流的音量。忍住這股沖動吧。Android提供了更方便的setVolumeControlStream()方法來讓音量鍵直接用于到你所指定的音頻流。
如果已經確認使用的音頻流類型,你應該將其設置為音量流的目標。你應該確保這個調用在APP的生命周期之前,因為只需要在Activity的生命周期中調用一次,你應該在具有代表性的方法中調用它,比如onCreate()方法。這可以確保每當APP處于可見狀態時,音量控制功能可用更符合用戶的期望。
setVolumeControlStream(AudioManager.STREAM_MUSIC);從這點往后,每當目標activity或者fragment可見時,按下設備上的音量鍵會影響你所指定的音頻流(在這個例子中是”音樂”)。
使用物理播放控制鍵來控制APP的音頻播放
媒體播放按鈕,如播放、暫停、停止、跳躍,和以前的一些手機和許多有線連接或無線連接的耳機。當用戶按下了其中的某個鍵時,系統會廣播一個ACTION_MEDIA_BUTTON行為的意圖。
為了響應媒體按鈕的點擊事件,你需要在清單文件中注冊一個BroadcastReceiver,以便監聽這個廣播行為:
<receiver android:name=".RemoteControlReceiver"><intent-filter><action android:name="android.intent.action.MEDIA_BUTTON" /></intent-filter> </receiver>接收器的實現需要提取出哪一個鍵被按下而引起的廣播。Intent會包含EXTRA_KEY_EVENT這個依據,類KeyEvent中包含了一列以KEYCODE_MEDIA_*開頭的靜態常量,這些靜態常量代表了每個按下的媒體鍵,比如:KEYCODE_MEDIA_PLAY_PAUSE及KEYCODE_MEDIA_NEXT。
下面這段代碼展示了如何抽取媒體鍵的按下事件以及來影響媒體的播放:
public class RemoteControlReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {// Handle key press.}}} }因為可能存在多個程序想要監聽媒體按鈕的按下事件,所以APP應該接收媒體按鈕按下事件時,你還必須通過編程來進行動態的控制。
下面的代碼可以直接應用到APP中去,它可以通過AudioManager來注冊與解注媒體按鈕事件接收器。當被注冊后,廣播接收器會專門接收所有的媒體按鈕廣播。
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // Start listening for button presses am.registerMediaButtonEventReceiver(RemoteControlReceiver); ... // Stop listening for button presses am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);從通常情況上講,APP應該在不活動時或者不可見時解注其它的接收器(比如onStop()回調方法)。然而,對媒體播放APP來說沒有那么簡單,實際上,當程序不可見以及不能夠屏幕上的UI來控制媒體播放時,這時,通過廣播響應媒體播放按鈕事件就非常重要了。
更進一步的方法就是當程序獲取或者失去音頻焦點時注冊或者解注媒體按鈕事件接收器。這些知識將會在下節課詳細討論。
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【LeetCode】3月17日打卡-Da
- 下一篇: 咨询报告生成:使用python生成ppt