在开发的时候,可能会用到播放一些短暂声音。播放多媒体,最先想到的可能是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;
}
}
}