针对BeatBox应用,可以使用SoundPool这个特别定制的实用工具。

SoundPool能加载一批声音资源到内存中,并支持同时播放多个音频文件。因此所以,就算用户兴奋起来,狂按按钮播放全部音频,也不必担心会损坏应用或者耗光手机电量。

1. 创建SoundPool

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

   public void play(Sound sound){
Integer soundId = sound.getSoundId();
//先检查并确保soundId是不是null值,Sound加载失败会导致soundId出现null值。
if(soundId == null)
return;
/*
* 调用play方法播放音频。
* 这些参数依次是:音频ID,左音量,右音量,优先级(无效),是否循环以及播放速率。
* 我们需要最大音量和长速播放,所以传入1.0,是否循环参数传入0值,代表不循环。 -1代表循环。
*/
mSoundPool.play(soundId,1.0f,1.0f,1,0,1.0f);
}

最后添加按钮监听器方法,实现点击按钮播放音频。

最后在onDestroy()方法中释放音频。

4.保留fragment

setRetainInstance(true)

表示以保留的activity不会随activity一起被销毁,会一致保留并在需要时原封不懂的传递给新的activity

最新文章

  1. C# XML转JSON,不引用第三方JSON.NET类库
  2. bzoj 2563: 阿狸和桃子的游戏
  3. JS中函数声明与函数表达式的不同
  4. OpenBSD内核之引导MBR
  5. 基于S5PC100裸机程序之SPI(上)
  6. OpenGL7-2-快速绘制
  7. 右下角显示提示窗口(New-Object,COM)
  8. Javascript基础学习(1)_类型、值和变量
  9. My.Ioc 代码示例——实现自动注册/解析
  10. 《编程简介(Java) ·10.3递归思想》
  11. 利用EF ORM Mysql实体运行程序出错解决方案
  12. 4.5管道实现机制和模拟构建管道「深入浅出ASP.NET Core系列」
  13. liunx系统下调整Swap分区大小
  14. (转)薛飞 基于VLC的Unity视频播放器(二)
  15. Prometheus 入门与实践
  16. Deep learning深度学习的十大开源框架
  17. phpstudy----------phpstudy开启apache日志并且按照日期划分创建。
  18. 使用freemarker和itext把html转pdf
  19. 【基本功】Java动态追踪技术探究 不重启JVM,替换掉已经加载的类?不重启JVM,获知运行时对象的属性
  20. datepicker动态初始化

热门文章

  1. Huffman编码实验
  2. dynamic用法
  3. C# 查找其他应用程序并打开、显示、隐藏、关闭的API
  4. MySQL修改最大连接数的两个方法,偏爱第一种
  5. Ret2shellcode
  6. 吴裕雄--天生自然C语言开发:位域
  7. Docker系列一: docker简介及基本环境安装
  8. 利用VLC解码youtube视频链接
  9. C#阶段小结
  10. Angular开发者指南(四)控制器