1.相關(guān)方法介紹:
1)構(gòu)造方法:
SoundPool(int maxStreams, int streamType, int srcQuality) 參數(shù)依次是:
- ①指定支持多少個(gè)聲音缀拭,SoundPool對(duì)象中允許同時(shí)存在的最大流的數(shù)量形纺。
- ②指定聲音類型檬贰,流類型可以分為STREAM_VOICE_CALL, STREAM_SYSTEM, STREAM_RING,STREAM_MUSIC 和 STREAM_ALARM四種類型。在AudioManager中定義饭望。
- ③指定聲音品質(zhì)(采樣率變換質(zhì)量),一般直接設(shè)置為0形庭!
在低版本中可以用上述構(gòu)造方法铅辞,而API 21(Android 5.0)后這個(gè)構(gòu)造方法就過時(shí)了! 而用到一個(gè)SoundPool.Builder的東東萨醒,我們要實(shí)例化SoundPool只需調(diào)用:
SoundPool.Builder spb = new SoundPool.Builder();
spb.setMaxStreams(10);
spb.setAudioAttributes(null); //轉(zhuǎn)換音頻格式
SoundPool sp = spb.build(); //創(chuàng)建SoundPool對(duì)象
要使用上述代碼的話斟珊,TargetSDK版本要設(shè)置大于等于21哦!而且如果minSDK版本小于21 會(huì)出現(xiàn)下面的提醒:
2)常用方法介紹:
①加載聲音資源:
- load(Context context, int resId, int priority)
- load(String path, int priority)
- load(FileDescriptor fd, long offset, long length, int priority)
- load(AssetFileDescriptor afd, int priority) 上述方法都會(huì)返回一個(gè)聲音的ID富纸,后面我們可以通過這個(gè)ID來播放指定的聲音
參數(shù)介紹:
- context:上下文
- resId:資源id
- priority:沒什么用的一個(gè)參數(shù)囤踩,建議設(shè)置為1,保持和未來的兼容性
- path:文件路徑
- FileDescriptor:貌似是流吧晓褪,這個(gè)我也不知道
- AssetFileDescriptor:從asset目錄讀取某個(gè)資源文件堵漱,用法:
AssetFileDescriptor descriptor = assetManager.openFd("biaobiao.mp3");
②播放控制:
play(int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)
參數(shù)依次是:
- soundID:Load()返回的聲音ID號(hào)
- leftVolume:左聲道音量設(shè)置
- rightVolume:右聲道音量設(shè)置
- priority:指定播放聲音的優(yōu)先級(jí)涣仿,數(shù)值越高勤庐,優(yōu)先級(jí)越大。
- loop:指定是否循環(huán):-1表示無限循環(huán)变过,0表示不循環(huán)埃元,其他值表示要重復(fù)播放的次數(shù)
- rate:指定播放速率:1.0的播放率可以使聲音按照其原始頻率,而2.0的播放速率媚狰,可以使聲音按照其 原始頻率的兩倍播放岛杀。如果為0.5的播放率,則播放速率是原始頻率的一半崭孤。播放速率的取值范圍是0.5至2.0类嗤。
③資源釋放:
可以調(diào)用release()方法釋放所有SoundPool對(duì)象占據(jù)的內(nèi)存和資源糊肠,當(dāng)然也可以根據(jù)聲音 ID來釋放!
3.使用代碼示例:
運(yùn)行效果圖:
當(dāng)點(diǎn)擊按鈕的時(shí)候會(huì)遗锣,"Duang"一下货裹,這里演示了兩種load的方法,分別是raw和assests精偿!
關(guān)鍵代碼:
MainActivity.java:
private void initSP() throws Exception{
//設(shè)置最多可容納5個(gè)音頻流弧圆,音頻的品質(zhì)為5
mSoundPool = new SoundPool(5, AudioManager.STREAM_SYSTEM, 5);
soundID.put(1, mSoundPool.load(this, R.raw.duang, 1));
soundID.put(2 , mSoundPool.load(getAssets().openFd("biaobiao.mp3") , 1)); //需要捕獲IO異常
soundID.put(3, mSoundPool.load(this, R.raw.duang, 1));
soundID.put(4, mSoundPool.load(this, R.raw.duang, 1));
soundID.put(5, mSoundPool.load(this, R.raw.duang, 1));
}
@Override
public void onClick(View v) {
switch (v.getId()){
case R.id.btn_play1:
mSoundPool.play(soundID.get(1), 1, 1, 0, 0, 1);
break;
case R.id.btn_play2:
mSoundPool.play(soundID.get(2), 1, 1, 0, 0, 1);
break;
case R.id.btn_play3:
mSoundPool.play(soundID.get(3), 1, 1, 0, 0, 1);
break;
case R.id.btn_play4:
mSoundPool.play(soundID.get(4), 1, 1, 0, 0, 1);
break;
case R.id.btn_play5:
mSoundPool.play(soundID.get(5), 1, 1, 0, 0, 1);
break;
case R.id.btn_release:
mSoundPool.release(); //回收SoundPool資源
break;
}
代碼非常簡單,另外如果你點(diǎn)擊了最后一個(gè)按鈕的話笔咽,SoundPool就會(huì)被釋放搔预,然后再其他按鈕 就不會(huì)Duang了哦~
4.OnLoadCompleteListener監(jiān)聽聲音文件是否加載完畢
嗯,這個(gè)是臨時(shí)想起的叶组,寫完在寫另一篇的時(shí)候突然想起拯田,用法也很簡單,我們可以 往上面的代碼中添加OnLoadCompleteListener這個(gè)東東甩十,然后重寫onLoadComplete()方法 船庇,最后為SoundPool對(duì)象設(shè)置這個(gè)東東即可!
mSoundPool.setOnLoadCompleteListener(new SoundPool.OnLoadCompleteListener() {
@Override
public void onLoadComplete(SoundPool soundPool, int sampleId, int status) {
Toast.makeText(MainActivity.this,"加特技準(zhǔn)備完畢~",Toast.LENGTH_SHORT).show();
}
});