Android音樂編程:控制應用程序的音量和播放
識別音頻流
創造優秀音頻體驗的***步是了解您的應用程序將使用的音頻流類型。
Android 系統保持相互獨立的音頻流通道來播放音樂,報警,通知,來電鈴聲,系統聲音,呼叫(通話)音量,和 DTMF 音調(鍵盤撥號)。
這樣做主要是為了使用戶能夠獨立地控制每個流的音量。
多數的流僅限于系統事件,所以,除非您的應用程序是要更換鬧鐘,否則幾乎可以肯定的是使用 STREAM_MUSIC 音頻流。
使用硬件音量按鍵來控制應用程序的音量
默認情況下,按音量鍵控制修改當前獲得焦點的音頻流的音量。假如您的應用程序當前不是正在播放音樂,或者沒有運行,那么音量鍵將會調整振鈴的音量。
如果您有一個游戲或音樂應用程序,當用戶點擊音量鍵的時候,即使他們目前正在瀏覽歌曲,或者沒有停留在當前的音樂游戲的位置,他們仍然希望控制游戲或音樂的音量。
您可以通過接收音量控制鍵的按鍵消息來修改當前的音頻流音量。不過不用那么麻煩 ,Android 已經提供了方便的 setVolumeControlStream() 方法來根據您指定的音頻流來自動調節音量。
首先確定您的應用程序將使用的音頻流,然后通過 setVolumeControlStream 方法設置其為當前焦點的音頻流。
這個方法應該被及早調用,并且在生命周期中只需要調用一次即可,所以通常應在 Activity 或者 Fragment 的 OnCreate() 內 調用。
這將確保只要你的應用程序是可見狀態的,音量控制功能就是用戶所期望的效果(即控制當前應用程序的音量)。
代碼示例:
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
從現在開始,按設備上的音量鍵將影響您指定的(示例“音樂”)的音頻流。
使用硬件播放控制按鍵來控制應用程序的音頻播放
很多手機和許多無線耳機都附帶有媒體播放控制按鈕,如播放,暫停,停止,跳過。每當用戶按下這些硬件鍵,系統就會廣播 ACTION_MEDIA_BUTTON 動作。
為了響應媒體按鈕的點擊事件,您需要注冊 BroadcastReceiver 來監聽廣播。
代碼示例:
- <receiver android:name=".RemoteControlReceiver">
- <intent-filter>
- <action android:name="android.intent.action.MEDIA_BUTTON" />
- </intent-filter>
- </receiver>
Receiver 中需要知道到底是按下了哪個鍵的具體信息,Intent 中包括了 EXTRA_KEY_EVENT 鍵值,可以通過它來取得KeyEvent 類型的值 ,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 來注冊和取消注冊媒體按鈕的事件接收器,注冊時,使用您的專用事件接收器。
示例代碼 :
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 控制,但是仍然需要響應媒體播放控制按鈕(最典型的就是后臺播放音樂) 。
所以,一個更好的方法是:當您的應用程序獲得和失去音頻焦點的時候分別注冊和注銷媒體按鈕的事件接收器,而不僅僅是依賴于應用程序的界面狀態 。
具體方案請參考下一節課程。
參考文摘:
https://developer.android.com/training/managing-audio/volume-playback.html
原文鏈接:
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%E6%8E%A7%E5%88%B6%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E7%9A%84%E9%9F%B3%E9%87%8F%E5%92%8C%E6%92%AD%E6%94%BE/