Android SoundPool.play方法的音量與系統音量的關係

NO IMAGE

Android中播放音訊,除了使用MediaPlayer,還可以使用SoundPool。SoundPool使用音效池的概念來管理多個短促的音效,對於需要短促的提示音的場景特別合適。

通常呼叫SoundPool.load來載入某個音訊檔案,獲得一個音效id,然後就可以用play方法來播放。

SoundPool的play方法原型如下:

int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);

play方法第二、三個引數用於指定左右聲道的音量,取值範圍是0.0~1.0。這裡要說的就是這個音量值與系統音量的關係。

比如你使用AudioManager.STREAM_MUSIC或者AudioManager.STREAM_VOICE_CALL來播放提示音,此時的媒體音量或通話音量為 A (AudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),那使用SoundPool.play方法播放音效時,實際的音量大小,就相當於:

leftVolume * A

注意,實際的音量效果,是乘積關係

下面是網上流傳的一段程式碼,其中對音量的設定就存在一個容易忽略的Bug:

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);
int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);
float volume = ((float)currentVolume)/maxVolume;
...
mSoundPool.play(soundID, volume, volume, 1, -1, 1);

上面的程式碼根據當前媒體音量和媒體音量的最大值,計算出一個比值傳遞給play方法,作為左右聲道的音量,這樣的結果是縮小了實際音量!尤其是(Bug),你在播放開始前將媒體音量調整為0,開始播放後,你將聽不到聲音!此時你再通過音量鍵調整音量,也聽不到聲音!(我今天剛解了一個類似的Bug)

所以,如果想按照使用者設定的音量來播放音效,正確的做法是:

mSoundPool.play(soundID, 1, 1, 1, -1, 1);

而如果想按系統設定音量的一半來播放音效,則可以用類似下面的程式碼:

mSoundPool.play(soundID, 0.5f, 0.5f, 1, -1, 1);

Android開發文件沒有SoundPool.play的音量引數做詳盡的說明,不過我們自己需要注意哦,否則就容易出現問題。