在今天的文章中我們將展示如何建立,管理和使用Android中的音效。在第一部分我們將展示基本的封裝與管理聲音有關代碼的方法。這個方法可以正常工作當你有一個典型的應用程式或者單線程的簡單遊戲。在你閱讀完這些之後,可以閱讀第二部分,它將告訴你一個更進階的方式來管理聲音通過其他的類。
我們用來播放聲音的方法利用Sound Pool類而不是Android開發嚮導推薦的Media Player類。當然利用Media Player類實現簡單應用也是可以的,但是這個類不能提供我們所需要的靈活性。
下面是代碼。我們首先需要建立一個Sound Manager類來封裝所有的與聲音有關的代碼。
Java代碼:
publicclassSoundManager{
privateSoundPoolmSoundPool;
privateHashMapmSoundPoolMap;
privateAudioManagermAudioManager;
privateContextmContext;
}
代碼的第一部分是建立所需要的成員變數:
mSoundPool: 我們利用Android提供的這個對象來建立和播放聲音;
mSoundPoolMap: 一旦聲音載入了,就用散列表來儲存;
mAudioManager: 播放我們想要音樂的服務的控制代碼.
mContext: 一個程式內容相關的控制代碼.
Java代碼:
publicvoidinitSounds(ContexttheContext){
mContext=theContext;
mSoundPool=newSoundPool(4,AudioManager.STREAM_MUSIC,0);
mSoundPoolMap=newHashMap();
mAudioManager=(AudioManager)mContext.getSystemService(Context.AUDIO_SERVICE);
}
第一個函數建立了Sound Manager。在一開始我們傳遞程式上下文給它並且得到一個它的控制代碼。下一行建立sound pool對象。我們要注意第一個參量,這個傳遞的整型值代表我們希望同時存在多少個音頻流。換句話說,多少聲音可以同時播放。如果你嘗試播放比這個整型值多的音頻,它會自動終止最早的音頻流。
下面兩行建立散列表並且將它交給audio-manager。
Java代碼:
publicvoidaddSound(intindex,intSoundID)
{
mSoundPoolMap.put(index,mSoundPool.load(mContext,SoundID,1));
}
我們在這個函數添加音頻。每一個音頻檔案得到一個用於回放的索引,要確保每個音頻有不同的索引。SoundID參數來自於原始音頻檔案。你可以傳遞這個參數通過調用R.raw.mysound來得到名為mysound的音訊id。後面會介紹如何運用這個函數。
Java代碼:
publicvoidplaySound(intindex)
{
floatstreamVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume=streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index),streamVolume,streamVolume,1,0,1f);
}
publicvoidplayLoopedSound(intindex)
{
floatstreamVolume=mAudioManager.getStreamVolume(AudioManager.STREAM_MUSIC);
streamVolume=streamVolume/mAudioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
mSoundPool.play(mSoundPoolMap.get(index),streamVolume,streamVolume,1,-1,1f);
}
這兩個函數控制聲音的回放。你只需要傳遞你在addSound()中建立的音訊索引數字。streamVolume變數用來擷取當前裝置上所設定媒體檔案播放的音量。因為我們不希望音頻回放時音量比使用者在手機上設定的音量有所不同。
你需要將獲得的音量除以最大的流媒體音量值,以便於得到一個0到1之間的浮點數。這是要實現播放所必需的,這裡要感謝Gyuri為我指出這個問題。
mSoundPool.play函數相當簡單。首先要傳遞你希望播放的音訊索引數字,之後兩個參數分別是播放時的音量下限和上限。我強烈建議設定該兩個值都等於音訊音量。
下一個變數是音訊優先順序。這個目前還沒有實現,所以設定為1是比較好的。再下一個參數是設定音頻是否迴圈播放。-1設定為迴圈而1設定為單次播放。這也是這兩個函數的唯一不同之處。我個人就比較喜歡能夠允許我設定迴圈播放的裝置。
最後一個參數影響播放的採樣率。1是正常速率而可以設定範圍從0.5到2.0對應於半速和二倍速播放。
使用這個類是非常簡單的。你需要做的就是當你需要音訊時候建立一個成員變數。之後你可以初始化sound manager而且用下面的方式添加音頻。
Java代碼
mSoundManager=newSoundManager();
mSoundManager.initSounds(getBaseContext());
mSoundManager.addSound(1,R.raw.sound);
之後根據索引播放音頻。
Java代碼:
mSoundManager.playSound(1);