SoundPool —— 适合短促且对反应速度比较高的情况(游戏音效或按键声等)
streamType —— 流的类型,一般为STREAM_MUSIC(具体在AudioManager类中列出)
srcQuality —— 采样率转化质量,当前无效果,使用0作为默认值
初始化一个实例:
SoundPool soundPool = new SoundPool(5, AudioManager.STREAM_MUSIC, 0);
创建了一个最多支持5个流同时播放的,类型标记为音乐的SoundPool。
int load(AssetFileDescriptor afd, int priority)
通过一个AssetFileDescriptor对象
int load(Context context, int resId, int priority)
通过一个资源ID
int load(String path, int priority)
通过指定的路径加载
int load(FileDescriptor fd, long offset, long length, int priority)
通过FileDescriptor加载
*API中指出,其中的priority参数目前没有效果,建议设置为1。
一个SoundPool能同时管理多个音频,所以可以通过多次调用load函数来记载,如果记载成功将返回一个非0的soundID ,用于播放时指定特定的音频。
int soundID1 = soundPool.load(this, R.raw.sound1, 1); if(soundID1 ==0){ // 记载失败 }else{ // 加载成功 } int soundID2 = soundPool.load(this, R.raw.sound2, 1); ...
final void stop(int streamID)
终止指定播放流的音效(streamID 应通过play()返回)。
这里需要注意的是,
1.play()函数传递的是一个load()返回的soundID——指向一个被记载的音频资源 ,如果播放成功则返回一个非0的streamID——指向一个成功播放的流 ;同一个soundID 可以通过多次调用play()而获得多个不同的streamID (只要不超出同时播放的最大数量);
2.pause()、resume()和stop()是针对播放流操作的,传递的是play()返回的streamID ;
3.play()中的priority参数,只在同时播放的流的数量超过了预先设定的最大数量是起作用,管理器将自动终止优先级低的播放流。如果存在多个同样优先级的流,再进一步根据其创建事件来处理,新创建的流的年龄是最小的,将被终止;
4.无论如何,程序退出时,手动终止播放并释放资源是必要的。
下面对以上进行总结:
一个SoundPool可以:
public class MainActivity extends Activity { private Button button1; private Button button2; private Button button3; private Button button4; private Button button5; private SoundPool soundPool; private Map<Integer, Integer> soundMap; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); button1=(Button)findViewById(R.id.button1); button2=(Button)findViewById(R.id.button2); button3=(Button)findViewById(R.id.button3); button4=(Button)findViewById(R.id.button4); button5=(Button)findViewById(R.id.button5); //创建一个SoundPool对象,该对象可以容纳5个音频流 soundPool=new SoundPool(5,AudioManager.STREAM_MUSIC,0); soundMap=new HashMap<Integer, Integer>(); soundMap.put(1, soundPool.load(MainActivity.this, R.raw.ir_begin, 1)); soundMap.put(2, soundPool.load(MainActivity.this, R.raw.ir_end, 1)); soundMap.put(3, soundPool.load(MainActivity.this, R.raw.ir_inter, 1)); soundMap.put(4, soundPool.load(MainActivity.this, R.raw.tada, 1)); soundMap.put(5, soundPool.load(MainActivity.this, R.raw.zhong, 1)); button1.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(1), 1, 1, 0, 0, 1); } }); button2.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(2), 1, 1, 0, 0, 1); } }); button3.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(3), 1, 1, 0, 0, 1); } }); button4.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(4), 1, 1, 0, 0, 1); } }); button5.setOnClickListener(new OnClickListener() { @Override public void onClick(View arg0) { // TODO Auto-generated method stub soundPool.play(soundMap.get(5), 1, 1, 0, 0, 1); } }); } @Override public boolean onKeyDown(int keyCode, KeyEvent event) { // TODO Auto-generated method stub soundPool.play(soundMap.get(5), 1, 1, 0, 0, 1); return super.onKeyDown(keyCode, event); } @Override public boolean onCreateOptionsMenu(Menu menu) { // Inflate the menu; this adds items to the action bar if it is present. getMenuInflater().inflate(R.menu.activity_main, menu); return true; } }