問題描述:
使用SoundPool類進行播放聲音時,在手機上沒有聲音。
問題代碼:
/** * 聲音播放 */ private void playSound() { SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5); soundPool.load(this, R.raw.beep, 1); // 加載資源,返回1 soundPool.play(1, 1, 1, 0, 0, 1); // 播放,返回0 }
問題原因:
SoundPool池加載聲音,在調用load方法的時候,是使用其他線程來加載資源的,所以上述代碼在執行play方法的時候,資源還沒有加載,故沒有聲音。
修改方法,就是中間留出足夠的時間來進行加載聲音文件,或追加加載完成的監聽器來監聽是否完成(SoundPool.OnLoadCompleteListener類的方法onLoadComplete(SoundPool soundPool, int sampleId, int status) )。
正確代碼:
因為聲音文件很小,所以就在onCreate方法中加載文件,后面進行播放。
private SoundPool soundPool; // 聲音加載池 protected void onCreate(Bundle savedInstanceState) { // 門聲音預加載 soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5); soundPool.load(this, R.raw.beep, 1); } /** * 聲音播放 */ private void playSound() { soundPool.play(1, 1, 1, 0, 0, 1); }
知識點延伸:
常用的播放類:
android中,同創進行聲音播放的有MediaPlayer和SoundPool。
MediaPlayer:常用來播放長一些的音頻、視頻和流媒體,每次僅能播放一個,有控制播放的各種方法。
SoundPool:常用來播放短促並且實時性高的音頻,每次可以多個同時播放,比方說游戲中的爆破聲。
SoundPool類的播放方法(部分):
以上述代碼為例,進行分析。當然都有其他的重載的方法。
SoundPool soundPool = new SoundPool(10, AudioManager.STREAM_SYSTEM, 5);
->
public SoundPool(int maxStream, int streamType, int srcQuality)
初期化一個聲音池。
maxStream:最大可放10個音頻文件。
streamType:為聲音的類型。如上為系統聲音,其他還有音樂,鈴聲等等。
srcQuality:轉化質量,默認為0。目前理解為,播放時的聲音保真程度。一般對於短促的聲音,影響不大。
soundPool.load(this, R.raw.beep, 1);
->
public int load(Context context, int resId, int priority)
通過本apk中的資源加載音頻。其他加載方式還有,從Asset對象加載、從FileDescriptor對象加載、從全文件路徑名加載。
context:本context。
resId:資源ID。
priority:加載優先級,一般為1。
返回值為int,表示加載的第幾個文件。從1開始累加。這個返回1。
soundPool.play(1, 1, 1, 0, 0, 1);
->
public int play(int soundID, float leftVolume, float rightVolume,int priority, int loop, float rate);
播放聲音文件。
soundID:表示流中第幾個文件,為load方法的返回值。和load方法配合使用,見過用map進行傳遞數據。(實際上我感覺沒必要)
leftVolume:左音量,通常為1。
rightVolume:右音量,通常為1。
priority:優先度,通常為0。
loop:是否循環。0表示不循環,1以上表示循環次數。
rate:表示播放速率。0.5-2之間。0.5表示減慢50%,2表示加速播放。