標籤:
良好的使用者體驗是可以被預測的。如果你的App需要播放多媒體,那麼你的使用者可以通過你的App利用硬體或軟體的方式來控制他們的裝置的音量,藍芽耳機,頭帶耳機等對於他們來說是非常必要的。 同樣的,在哪個位置合理恰當地提供播放、停止、暫停、跳過以及回放功能的按鈕需要根據他們各自在你的App中對於audio stream的處理來決定。 控制App的音量和多媒體檔案的播放主要有以下三個方面: 確認需要使用哪個Audio Stream 建立一個可預測的audio體驗的第一步是理解你的App需要用到哪個audio stream。
Android系統提供一套不同的audio stream提供給播放音樂、鬧鐘、通知、來電提示、系統聲音,通話音量以及複頻式訊號的聲調。這套機製為App的使用者通過獨立的Stream來控制音量提供了可能性。
多數的stream受限於系統的事件,因此,除非你的App定位於替代系統的鬧鐘,你在設計時基本上會使用STREAM_MUSIC stream來播放你的audio。
使用硬體按鈕來控制你的App的Audio音量
通常,通過按音量控制按鈕來控制正在被使用的audio stream的音量。如果你的App沒有播放任何的多媒體檔案,按音量控制按鍵時會調整鈴聲的大小。
如果你安裝了遊戲或者是音樂的App,那麼當使用者按音量按鈕的時候他們通常是想要控制遊戲或是音樂的音量,甚至是在歌曲的間隔或者是沒有背景音樂的遊戲情境。
這個時候你可能會嘗試監聽音量按鈕的點擊事件,然後調整你App使用的audio stream的音量。這種方法我們不推薦。Android系統提供了便利的setVolumeControlStream() 方法,在按音量按鈕時直接調整你指定的audio stream的音量。
在確定了你的應用會使用哪個audio stream之後,你應該將其設定為volume stream的目標。你應該在你的App的生命週期中儘早地調用這個方法,因為在活動的生命週期中你只需要調用setVolumeControlStream()方法一次,推薦在onCreate()(控制你的多媒體播放的Activity或是Fragment使用)回調方法被調用時使用。這樣就確保了不管你的App是否可見,音量都會按照使用者的預期被控制。
1 setVolumeControlStream(AudioManager.STREAM_MUSIC);
在調用了setVolumeControlStream()方法後,按裝置的音量按鈕會影響你指定的audio stream的音量(在上面的例子中是“music”),不管目標activity或fragment是否可見。
使用硬體的播放控制按鈕來控制App audio的播放
在某些串連網路或者是無線手機上面多媒體按鈕是可用的,例如播放、暫停、停止、下一個與前一個。不管何時一個使用者按上面硬體中的任何一個,系統將發一條廣播,該廣播的intent包含 ACTION_MEDIA_BUTTON 的action。
為了響應多媒體按鈕的點擊事件,你需要在你的manifest中註冊一個 BroadcastReceiver來監聽 ACTION_MEDIA_BUTTON action。
1 <receiverandroid:name=".RemoteControlReceiver">2 <intent-filter>3 <actionandroid:name="android.intent.action.MEDIA_BUTTON"/>4 </intent-filter>5 </receiver>
上述receiver表明它需要擷取到是哪個按鈕被點擊從而導致上述的廣播。在Intent中的extra的key為EXTRA_KEY_EVENT 中有相應的資訊,在KeyEvent類中定義了一組靜態變數KEYCODE_MEDIA_*,它們代表了每個可能被點擊的多媒體按鈕,例如KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT.
下面的程式碼片段展示出了如何擷取多媒體按鈕的點擊事件並且依據該事件來影響多媒體的播放。
1 publicclassRemoteControlReceiverextendsBroadcastReceiver{ 2 @Override 3 publicvoid onReceive(Context context,Intent intent){ 4 if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){ 5 KeyEventevent=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 6 if(KeyEvent.KEYCODE_MEDIA_PLAY ==event.getKeyCode()){ 7 // Handle key press. 8 } 9 }10 }11 }
因為許多應用程式都可能會監聽多媒體按鈕的點擊事件,你需要在你的App需要監聽多媒體按鈕的點擊事件的時候通過編碼的方式監聽並控制多媒體按鈕的點擊事件。
下面的代碼可以用在你的App中,使用 AudioManager註冊和登出你的多媒體按鈕點擊事件receiver。當receiver被註冊後,你註冊的廣播接收器是接收多媒體按鈕廣播唯一的接收器。
1 AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); 2 ... 3 4 // Start listening for button presses 5 am.registerMediaButtonEventReceiver(RemoteControlReceiver); 6 ... 7 8 // Stop listening for button presses 9 am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);10
通常,Android的應用程式需要在他們變得不活躍或是不可見(例如在onStop()回調方法被調用時)的時候登出它們的receivers。然而,對於多媒體播放的App來說往往並非如此簡單,當你的應用程式運行在背景時候往往更需要響應多媒體播放按鈕的點擊事件。
在你的應用程式獲得audio焦點時註冊多媒體按鈕事件監聽receiver,在失去audio焦點時登出多媒體按鈕事件監聽receiver是一個更好解決方案。在下一章將會詳細講解。
1-控制App的音量和多媒體檔案的播放(Managing Audio Playback)