Android编程权威指南(第二版)第十九章-使用SoundPool播放音频
private static final int MAX_SOUNDS = 5;
private SoundPool mSoundPool;
mSoundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);
//第一个参数指定同时播放多少个音频,当多余这个数时,会自动暂停原来的音频
//第二个参数确定音频流类型,Android有很多不同的音频流,它们都有各自独立的音量控制选项。
//最后一个参数指定采样率转换品质。参考文档说这个参数不起作用,所以这里传入0值。
private void load(Sound sound) throws IOException {
AssetFileDescriptor afd = mAssets.openFd(sound.getAssetPath());
int soundId = mSoundPool.load(afd, 1);
sound.setSoundId(soundId);//类种的设置一个id属性,为Integer
}
调用mSoundPool.load(AssetFileDescriptor, int)方法可以把文件载入SoundPool待播。为方便管理、重播或卸载音频文件,mSoundPool.load(...)方法会返回一个int型ID。这实际就是存储在mSoundId中的ID。调用openFd(String)方法有可能抛出IOException,load(Sound)方法也是如此。
然后,对每个sound对象调用load(sound);//加载到SoundPool 。
public void play(Sound sound) {
Integer soundId = sound.getSoundId(); //Integer是一个类,可以为NULL int不能为NULL
if (soundId == null) {
return;
}
mSoundPool.play(soundId, 1.0f, 1.0f, 1, 0, 1.0f);
}
播放前要检查并确保soundId不是null值。Sound加载失败会导致soundId出现null值。检查通过以后,就可以调用SoundPool.play(int, float, float, int, int, float)方法播放音频了。这些参数依次是:音频ID、左音量、右音量、优先级(无效)、是否循环以及播放速率。我们需要最大音量和常速播放,所以传入值1.0。是否循环参数传入0值,代表不循环。(如果想无限循环,可以传入-1。我们觉得这会非常令人讨厌。)
音频播放完毕,应调用SoundPool.release()方法释放SoundPool

浙公网安备 33010602011771号