Android SoundPool.play方法的音量与系统音量的关系
Android中播放音頻,除了使用MediaPlayer,還可以使用SoundPool。SoundPool使用音效池的概念來管理多個短促的音效,對于需要短促的提示音的場景特別合適。
通常調(diào)用SoundPool.load來加載某個音頻文件,獲得一個音效id,然后就可以用play方法來播放。
SoundPool的play方法原型如下:
int play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate);play方法第二、三個參數(shù)用于指定左右聲道的音量,取值范圍是0.0~1.0。這里要說的就是這個音量值與系統(tǒng)音量的關(guān)系。
比如你使用AudioManager.STREAM_MUSIC或者AudioManager.STREAM_VOICE_CALL來播放提示音,此時的媒體音量或通話音量為 A (AudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),那使用SoundPool.play方法播放音效時,實際的音量大小,就相當(dāng)于:
leftVolume * A注意,實際的音量效果,是乘積關(guān)系。
下面是網(wǎng)上流傳的一段代碼,其中對音量的設(shè)置就存在一個容易忽略的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);上面的代碼根據(jù)當(dāng)前媒體音量和媒體音量的最大值,計算出一個比值傳遞給play方法,作為左右聲道的音量,這樣的結(jié)果是縮小了實際音量!尤其是(Bug),你在播放開始前將媒體音量調(diào)整為0,開始播放后,你將聽不到聲音!此時你再通過音量鍵調(diào)整音量,也聽不到聲音!(我今天剛解了一個類似的Bug)
所以,如果想按照用戶設(shè)置的音量來播放音效,正確的做法是:
mSoundPool.play(soundID, 1, 1, 1, -1, 1);而如果想按系統(tǒng)設(shè)置音量的一半來播放音效,則可以用類似下面的代碼:
mSoundPool.play(soundID, 0.5f, 0.5f, 1, -1, 1);Android開發(fā)文檔沒有SoundPool.play的音量參數(shù)做詳盡的說明,不過我們自己需要注意哦,否則就容易出現(xiàn)問題。
轉(zhuǎn)載于:https://www.cnblogs.com/hehehaha/p/6147407.html
總結(jié)
以上是生活随笔為你收集整理的Android SoundPool.play方法的音量与系统音量的关系的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: usb serial for andro
- 下一篇: Android 基础(二十四) Edit