Android音樂編程:控制應(yīng)用程序的音量和播放
識(shí)別音頻流
創(chuàng)造優(yōu)秀音頻體驗(yàn)的***步是了解您的應(yīng)用程序?qū)⑹褂玫囊纛l流類型。
Android 系統(tǒng)保持相互獨(dú)立的音頻流通道來播放音樂,報(bào)警,通知,來電鈴聲,系統(tǒng)聲音,呼叫(通話)音量,和 DTMF 音調(diào)(鍵盤撥號(hào))。
這樣做主要是為了使用戶能夠獨(dú)立地控制每個(gè)流的音量。
多數(shù)的流僅限于系統(tǒng)事件,所以,除非您的應(yīng)用程序是要更換鬧鐘,否則幾乎可以肯定的是使用 STREAM_MUSIC 音頻流。
使用硬件音量按鍵來控制應(yīng)用程序的音量
默認(rèn)情況下,按音量鍵控制修改當(dāng)前獲得焦點(diǎn)的音頻流的音量。假如您的應(yīng)用程序當(dāng)前不是正在播放音樂,或者沒有運(yùn)行,那么音量鍵將會(huì)調(diào)整振鈴的音量。
如果您有一個(gè)游戲或音樂應(yīng)用程序,當(dāng)用戶點(diǎn)擊音量鍵的時(shí)候,即使他們目前正在瀏覽歌曲,或者沒有停留在當(dāng)前的音樂游戲的位置,他們?nèi)匀幌M刂朴螒蚧蛞魳返囊袅俊?/p>
您可以通過接收音量控制鍵的按鍵消息來修改當(dāng)前的音頻流音量。不過不用那么麻煩 ,Android 已經(jīng)提供了方便的 setVolumeControlStream() 方法來根據(jù)您指定的音頻流來自動(dòng)調(diào)節(jié)音量。
首先確定您的應(yīng)用程序?qū)⑹褂玫囊纛l流,然后通過 setVolumeControlStream 方法設(shè)置其為當(dāng)前焦點(diǎn)的音頻流。
這個(gè)方法應(yīng)該被及早調(diào)用,并且在生命周期中只需要調(diào)用一次即可,所以通常應(yīng)在 Activity 或者 Fragment 的 OnCreate() 內(nèi) 調(diào)用。
這將確保只要你的應(yīng)用程序是可見狀態(tài)的,音量控制功能就是用戶所期望的效果(即控制當(dāng)前應(yīng)用程序的音量)。
代碼示例:
- setVolumeControlStream(AudioManager.STREAM_MUSIC);
從現(xiàn)在開始,按設(shè)備上的音量鍵將影響您指定的(示例“音樂”)的音頻流。
使用硬件播放控制按鍵來控制應(yīng)用程序的音頻播放
很多手機(jī)和許多無線耳機(jī)都附帶有媒體播放控制按鈕,如播放,暫停,停止,跳過。每當(dāng)用戶按下這些硬件鍵,系統(tǒng)就會(huì)廣播 ACTION_MEDIA_BUTTON 動(dòng)作。
為了響應(yīng)媒體按鈕的點(diǎn)擊事件,您需要注冊(cè) BroadcastReceiver 來監(jiān)聽廣播。
代碼示例:
- <receiver android:name=".RemoteControlReceiver">
- <intent-filter>
- <action android:name="android.intent.action.MEDIA_BUTTON" />
- </intent-filter>
- </receiver>
Receiver 中需要知道到底是按下了哪個(gè)鍵的具體信息,Intent 中包括了 EXTRA_KEY_EVENT 鍵值,可以通過它來取得KeyEvent 類型的值 ,KeyEvent中的KEYCODE_MEDIA_*靜態(tài)常量表示了所有的媒體按鈕類型,如 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.
- // 處理播放按鍵的消息
- }
- }
- }
- }
因?yàn)槎鄠€(gè)應(yīng)用程序可能會(huì)接聽和響應(yīng)媒體按鍵消息,您必須以編程方式控制您的應(yīng)用程序何時(shí)應(yīng)該接受媒體按鈕事件。
在您的應(yīng)用程序中可以使用 AudioManager 來注冊(cè)和取消注冊(cè)媒體按鈕的事件接收器,注冊(cè)時(shí),使用您的專用事件接收器。
示例代碼 :
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); ... // Start listening for button presses 開始 監(jiān) 聽 am.registerMediaButtonEventReceiver(RemoteControlReceiver); ... // Stop listening for button presses 取消 監(jiān) 聽 am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
通常情況下,應(yīng)用程序在失去焦點(diǎn)或不在屏幕顯示隱藏到后臺(tái)的時(shí)候, 應(yīng)注銷其大部分的接聽器(如在 onStop() 回調(diào)函數(shù)中) 。
然而,對(duì)于媒體播放應(yīng)用程序卻沒有這么簡(jiǎn)單,事實(shí)上,最重要的是,當(dāng)您的應(yīng)用程序是處于不可見的狀態(tài)時(shí),此時(shí)不能由屏幕上的 UI 控制,但是仍然需要響應(yīng)媒體播放控制按鈕(最典型的就是后臺(tái)播放音樂) 。
所以,一個(gè)更好的方法是:當(dāng)您的應(yīng)用程序獲得和失去音頻焦點(diǎn)的時(shí)候分別注冊(cè)和注銷媒體按鈕的事件接收器,而不僅僅是依賴于應(yīng)用程序的界面狀態(tài) 。
具體方案請(qǐng)參考下一節(jié)課程。
參考文摘:
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/