安卓权威编程-笔记(19章 使用SoundPool播放音频)

黄沙百战穿金甲,不破楼兰终不还。这篇文章主要讲述安卓权威编程-笔记(19章 使用SoundPool播放音频)相关的知识,希望能为你提供帮助。
针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具。
SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件。因此所以,就算用户兴奋起来,狂按按钮播放全部音频,也不必担心会损坏应用或者耗光手机电量。
 
1. 创建SoundPool

1 /* 2* Lollipop引入了新的方式创建SoundPool:使用SoundPool.Builder。为了兼容api 16最低级别,只能选择使用SoundPool(int int int)这个老构造方法。 3* 第一个参数指定同时播放多少个音频,这里指定了5个。在播放5个音频时,如果在尝试播放第6个,SoundPool会停止播放原来的音频。 4* 第二个参数确定音频流类型。 5* 最后一个参数指定采样率转换品质。 不起作用 ,传入 0; 6*/ 7mSoundPool = new SoundPool(MAX_SOUNDS, AudioManager.STREAM_MUSIC, 0);
8//下为Sound.Builder方法

mSoundPool = new SoundPool.Builder() .setMaxStreams(MAX_SOUNDS) .setAudioAttributes(new AudioAttributes.Builder() .setLegacyStreamType(AudioManager.STREAM_MUSIC) .build()) .build();

 
2. 加载音频文件
相比其他音频播放方法,SoundPool还有个快速响应的优势,指令刚一发出,它就会立即开始播放,一点都不拖沓。代价就是在播放钱必须预先加载音频。SoundPool加载的音频文件都有自己的Integer类型ID。
在Sound类中添加mSoundId实例变量,并添加相应的获取方法和设置方法管理这写ID。
然后处理音频加载,在BeatBox中添加以下代码:
private void load(Sound sound)throws IOException{ AssetFileDescriptor afd = mAssets.openFd(sound.getAssetPath()); //调用load(AssetFileDescriptor, int)方法可以把文件载入SoundPool待播、 //此方法返回一个int性ID。这就是存储在mSoundId中的ID。 int soundId = mSoundPool.load(afd,1); sound.setSoundId(soundId); }

然后在BeatBox.loadSounds()方法中,调用load(Sound)方法载入全部音频文件。
3.播放音频
在BeatBox中添加一个play(sound)方法。
1public void play(Sound sound){ 2Integer soundId = sound.getSoundId(); 3//先检查并确保soundId是不是null值,Sound加载失败会导致soundId出现null值。 4if(soundId == null) 5return; 6/* 7* 调用play方法播放音频。 8* 这些参数依次是:音频ID,左音量,右音量,优先级(无效),是否循环以及播放速率。 9* 我们需要最大音量和长速播放,所以传入1.0,是否循环参数传入0值,代表不循环。 -1代表循环。 10*/ 11mSoundPool.play(soundId,1.0f,1.0f,1,0,1.0f); 12}

【安卓权威编程-笔记(19章 使用SoundPool播放音频)】最后添加按钮监听器方法,实现点击按钮播放音频。


    推荐阅读