本文譯自:http://developer.android.com/training/managing-audio/volume-playback.html
良好的使用者體驗是具有可預見性的。如果你的應用程式要播放多媒體,那麼使用者能夠使用裝置的硬體或軟體來控制的音量,如藍芽耳機或麥克等,這是至關重要的。
同樣,在適當的情況下,你的應用程式應該在媒體流上分別提供播放、停止、掛起、跳過、向前等媒體播放操作。
識別要使用的音頻流
要建立一個具有可預見性的音頻體驗,首先是要理解你的應用程式要所要使用的音量流。
Android把音頻流分為播放音樂、警告音、通知音、電話鈴聲、系統聲音、通話音、以及DTMF音調。這樣做主要目的是允許使用者能夠獨立的控制每個流的音量。
這些流大多受限於系統事件,因此除非你的應用是一個替換鬧鐘,否則幾乎可以可定要使用STREAM_MUSIC流來播放你的音頻。
使用硬體的音量鍵來控制應用程式的音頻音量
預設情況下,按下音量修飾鍵會修改現正播放的音頻流的音量。如果你的應用程式當前沒有播放任何音頻,那麼點擊音量鍵會調整鈴聲的音量。
如果你有一個遊戲程式或音樂播放器,那麼即使在兩首歌曲之間或當前遊戲位置中沒有音樂,使用遊戲程式或音樂播放器的音量修飾鍵來控制音量也是好的時機。
你可能想要監聽音量按鍵,並使用這種方法來修改你的音頻流的音量。放棄這種想法,Android提供了方便的setVolumeControlStream()方法用於把音量按鍵指向你所指定的音頻流。
確定了你的應用程式要使用的音頻流之後,你應該把它設定為音頻流的目標。你應該在應用生命週期的早期來調用這個方法---因為在Activity生命週期內你只需要調用一次該方法,通常你應該在onCreate()方法(控制媒體播放的Activity或Fragment)中調用它。這樣就會保證無論你的應用程式什麼時候可見,音量控制功能都會時使用者所期望的。
setVolumeControlStream(AudioManager.STREAM_MUSIC);
從這時開始,按下音量裝置上的音量鍵就會影響到你指定的音頻流,而不管目標Activity或Fragment是否可見。
使用硬體播放修飾鍵來控制應用程式的音頻播放
在某些手持功能和很多有線或無線耳機上,會有一些媒體播放按鈕,如播放、暫停、停止、跳過或前進等。無論使用者什麼時候按下這些硬體按鍵中的一個,系統都會發出一個ACTION_MEDIA_BUTTON操作類型的Intent廣播。
要響應媒體按鈕的點擊事件,你需要在你的資訊清單檔中註冊一個BroadcastReceiver,來監聽這個操作類型的廣播,註冊方法如下:
<receiverandroid: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。
下面程式碼片段顯示了如何提取被按下的媒體按鈕,從而影響媒體播放:
publicclassRemoteControlReceiverextendsBroadcastReceiver{
@Override
public 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.
}
}
}
}
因為複雜的應用程式可能想要監聽媒體按鈕的按下事件,所以在你的應用程式接收到媒體按鈕按下事件時,你還必須要編程式控制制。
下面使用AudioManager的代碼可能被你的應用程式用於註冊和反註冊媒體按鈕事件。註冊後,你的廣播接收器就會成為所有媒體按鈕廣播的專有接收器。
AudioManager am
= mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...
// Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
通常,應用程式應該在它們閑置或不可見時(如在onStop()回調期間),解除對該接收器的註冊。但是實際上對於媒體播放應用程式就不那麼簡單了,因為在應用程式不可見時響應媒體播放按鈕是最重要的,因此它不能被螢幕上的UI所控制。
註冊和反註冊媒體按鈕事件接收器的一個比較好的方法是在你的應用程式獲得或丟失音頻焦點的時候。這會在下節課詳細介紹。