天天看點

Android Developers:控制你的應用程式音量和播放

好的使用者體驗是可以預測的。如果你的應用程式播放音頻,你的使用者能使用硬體或者軟體音量控制,來控制他們裝置,藍牙耳機,或者聽筒的音量是非常重要的。 

相似的,在适當的地方可用,播放,停止,暫停,上一首,和下一首媒體回放鍵,應該在你的應用使用的音頻流上執行它們各自的動作。 

确定在使用哪個音頻流 

————————————————————————————————————————————————————————————————— 

建立一個可預測的音頻體驗的第一步是知道你的應用程式将會使用哪個音頻流。 

Android維護一個單獨的音頻流來播放音樂,鈴聲,消息,來電鈴聲,系統聲音,來電,音量提升和DTMP調節。這樣做的主要目的是為了允許使用者來單獨的控制每個流的音量。 

大多數這些流都被系統事件限制,是以除非你的應用程式是鬧鐘的替代,你幾乎肯定能使用STREAM_MUSIC流播放你的音頻。 

使用硬體音量鍵來控制你的應用個程式的音量 

————————————————————————————————————————————————————————————————— 

預設情況下,按音量鍵修改目前活動音頻流的音量。如果你的應用目前沒有播放任何音樂,按這個音量鍵調整鈴聲音量。 

如果你有一個遊戲或者音樂應用,他們想當使用者按音量鍵的時候,是控制遊戲或者音樂音量的好機會,即使他們目前在歌曲之間或者在目前遊戲沒有音樂播放。 

你可能會嘗試和并監聽音量鍵,通過這種方法修改你的音頻流的音量。抵制沖動。Android提供了便利的setVolumeControlStream()方法直接按音量鍵到你指定的音頻流。 

已經确定了你的應用程式将要使用的音頻流,你應該把它設定為音頻流目标。你應該在你的生命周期早期調用它—因為你僅僅需要在Activity生命周期調用它一次,你通常應該在onCreate()方法中調用它(控制你的媒體的Activity或者Fragment)。這保證你的應用在任何時候都是可見的,音量控制功能為使用者所期待的。 

setVolumeControlStream(AudioManager.STREAM_MUSIC); 
           

從此以後,在裝置上按壓音量鍵将影響你指定的音頻流(在”音樂“的請款跪下)無論目标Activity或者Fragment是否可見。  

使用硬體回放控制鍵來控制你的應用程式的音頻播放 

————————————————————————————————————————————————————————————————— 

媒體回放鍵,如播放,暫停,停止,上一首和先一手在一些手機和一些連接配接的無線耳機是有效的。無論使用者什麼時候按下這些鍵中的一個,系統廣播一個包含ACTION_MEDIA_BUTTION動作的Intent。 

為了響應音頻按鈕點選,你需要在你的清單檔案中注冊一個BroadcastReceiver,來監聽這個廣播動作,如下所示: 

<receiver android:name=".RemoteControlReceiver"> 
   <intent-filter> 
       <action android:name="android.intent.action.MEDIA_BUTTON" /> 
   </intent-filter> 
</receiver> 
           

這個receiver自己實作需要提取那個鍵被按壓導緻這個廣播。這個Intent在EXTRA_KEY_EVENT鍵中包含了這個,當這個KeyEvent類包含一列KEYCODE_MEDIA_*靜态常量,他們代表了每個可能的媒體按鍵,例如KEYCODE_MEDIA_PLAY_PAUSE和KEYCODE_MEDIA_NEXT。  

下面的代碼片段顯示了如何提取被按壓的音頻按鈕,并相應的印象媒體回放: 

public class RemoteControlReceiver extends BroadcastReceiver { 
   @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注冊或知道你的媒體按鈕事件接受者。當注冊的時候,你的broadcast receiver是所有媒體按鈕廣播的獨有接受者。 

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控制。  

一個更好的方式是注冊和登出媒體播放按鈕事件接受者,在你的應用程式擷取和失去音頻焦點的時候。這在下一個課程中詳細的說明。 

新技術,新未來!歡迎大家關注 “1024工場”微信服務号 ,時刻關注我們的最新的技術訊息! (甭客氣!盡情的掃描或者長按!)

Android Developers:控制你的應用程式音量和播放