在开发的时候,可能会用到播放一些短暂声音。播放多媒体,最先想到的可能是MediaPlay这个类。
MediaPlay其实比较适合播放那些比较长的音乐资源,比如说播放歌曲什么的。对于那些即时播放即时响应的情况,MediaPlay就不怎么适用了。而且MediaPlay特别占用系统资源。
Soundpool的加载最好是放在程序初始化的时候,如果在用的时候才去加载的话,调用play的时候是会抛异常的。
下面是一个简单的DEMO:
package com.psw.soundpooltest; import java.util.HashMap; import java.util.Map; import android.app.Activity; import android.media.AudioManager; import android.media.SoundPool; import android.os.Bundle; import android.view.Menu; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class MainActivity extends Activity implements OnClickListener{ private Button btn1; private Button btn2; private Button btn3; private SoundPool sp; //声音池 private Map<Integer, Integer> mapSRC; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initView(); initSoundPool(); } private void initView(){ btn1 = (Button) findViewById(R.id.button1); btn2 = (Button) findViewById(R.id.button2); btn3 = (Button) findViewById(R.id.button3); btn1.setOnClickListener(this); btn2.setOnClickListener(this); btn3.setOnClickListener(this); } //初始化声音池 private void initSoundPool(){ sp = new SoundPool(1, AudioManager.STREAM_MUSIC, 0); mapSRC = new HashMap<Integer, Integer>(); mapSRC.put(1, sp.load(this, R.raw.error, 0)); mapSRC.put(2, sp.load(this, R.raw.welcome, 0)); mapSRC.put(3, sp.load(this, R.raw.msg, 0)); } /** * 播放声音池的声音 * @param sound * @param number */ private void play(int sound, int number){ sp.play(mapSRC.get(sound),//播放的声音资源 1.0f,//左声道,范围为0--1.0 1.0f,//右声道,范围为0--1.0 0, //优先级,0为最低优先级 number,//循环次数,0为不循环 0);//播放速率,0为正常速率 } @Override protected void onDestroy() { // TODO Auto-generated method stub if(sp != null){ sp.release(); } super.onDestroy(); } @Override public void onClick(View v) { switch (v.getId()) { case R.id.button1: play(1, 0); break; case R.id.button2: play(2, 0); break; case R.id.button3: play(3, 0); break; default: break; } } }