android 之使用SoundPool播放音效(Duang~)

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)下面的提醒:

image

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)行效果圖

image

當(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();
    }
});
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末侣监,一起剝皮案震驚了整個(gè)濱河市鸭轮,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌达吞,老刑警劉巖张弛,帶你破解...
    沈念sama閱讀 217,277評(píng)論 6 503
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異酪劫,居然都是意外死亡吞鸭,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,689評(píng)論 3 393
  • 文/潘曉璐 我一進(jìn)店門覆糟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來刻剥,“玉大人,你說我怎么就攤上這事滩字≡炻玻” “怎么了?”我有些...
    開封第一講書人閱讀 163,624評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵麦箍,是天一觀的道長漓藕。 經(jīng)常有香客問我,道長挟裂,這世上最難降的妖魔是什么享钞? 我笑而不...
    開封第一講書人閱讀 58,356評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮诀蓉,結(jié)果婚禮上栗竖,老公的妹妹穿的比我還像新娘暑脆。我一直安慰自己,他們只是感情好狐肢,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,402評(píng)論 6 392
  • 文/花漫 我一把揭開白布添吗。 她就那樣靜靜地躺著,像睡著了一般份名。 火紅的嫁衣襯著肌膚如雪碟联。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,292評(píng)論 1 301
  • 那天僵腺,我揣著相機(jī)與錄音玄帕,去河邊找鬼。 笑死想邦,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的委刘。 我是一名探鬼主播丧没,決...
    沈念sama閱讀 40,135評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼锡移!你這毒婦竟也來了呕童?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,992評(píng)論 0 275
  • 序言:老撾萬榮一對(duì)情侶失蹤淆珊,失蹤者是張志新(化名)和其女友劉穎夺饲,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體施符,經(jīng)...
    沈念sama閱讀 45,429評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡往声,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,636評(píng)論 3 334
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了戳吝。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片浩销。...
    茶點(diǎn)故事閱讀 39,785評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖听哭,靈堂內(nèi)的尸體忽然破棺而出慢洋,到底是詐尸還是另有隱情,我是刑警寧澤陆盘,帶...
    沈念sama閱讀 35,492評(píng)論 5 345
  • 正文 年R本政府宣布普筹,位于F島的核電站,受9級(jí)特大地震影響隘马,放射性物質(zhì)發(fā)生泄漏太防。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,092評(píng)論 3 328
  • 文/蒙蒙 一祟霍、第九天 我趴在偏房一處隱蔽的房頂上張望杏头。 院中可真熱鬧盈包,春花似錦、人聲如沸醇王。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,723評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寓娩。三九已至叛氨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間棘伴,已是汗流浹背寞埠。 一陣腳步聲響...
    開封第一講書人閱讀 32,858評(píng)論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留焊夸,地道東北人仁连。 一個(gè)月前我還...
    沈念sama閱讀 47,891評(píng)論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像阱穗,于是被迫代替她去往敵國和親饭冬。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,713評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容