针对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

安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)的更多相关文章

  1. 安卓权威编程指南 - 第五章学习笔记(两个Activity)

    学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...

  2. 安卓权威编程指南-笔记(第21章 XML drawable)

    在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable ...

  3. 安卓权威编程指南-笔记(第27章 broadcast intent)

    本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...

  4. 安卓权威编程指南-笔记(第23章 HTTP与后台任务)

    1. 网络连接基本 //通过指定URL获取原始数据,并返回一个字节流数组. public byte[] getUrlBytes(String urlSpec)throws IOException{ / ...

  5. 安卓权威编程指南-笔记(第22章 深入学习intent和任务)

    本章,我们会使用隐式intent创建一个替换android默认启动器的应用.名为NerdLauncher. NerdLauncher应用能列出设备上的其他应用,点选任意列表项会启动相应应用. 1. 解 ...

  6. 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)

    AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...

  7. 安卓权威编程指南 -笔记(18章 处理assets)

    resources资源可以存储声音文件,但当处理多个音乐文件时,效率会很低. assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构.类似游戏这样需要加载大量图片和声音资源的应用通 ...

  8. 安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)

    26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 Jo ...

  9. 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用

    你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...

随机推荐

  1. ERP上线通用模板

    一.引言    随着现代信息技术的发展与广泛应用,现代社会的快速发展和越来越追求效率的现状,对各行各业的管理的水平有了进一步的提高.XX企业作为我国的国民经济发展的基础产业,其信息化建设的水平直接关系 ...

  2. java package 包 学习笔记

    编译命令示例: javac -d . Main.java 注:带参数-d自动建立文件目录, 只使用javac 则需要手工创建目录 把 class文件打包 jar命令 jar cvf T.jar *; ...

  3. 吴裕雄--天生自然 PYTHON3开发学习:面向对象

    class MyClass: """一个简单的类实例""" i = 12345 def f(self): return 'hello wor ...

  4. elasticsearch min_hash 应用分析

    需求作相似文本查询 爬虫作页面去重,会用到simhash,第一个想到的是用simhash算法 但在现有数据集(elasticsearch集群)上用simhash,成本高,simhash值还好计算,不论 ...

  5. del|append()|insert()|pop()|remove()|sort()|sorted|reverse()|len()|range()|min()|max()|sum()|[:]|区分两种列表复制|

    fruit = ['apple','banana','peach'] print fruit[0],fruit[-1] fruit_1 =[] fruit_1.append('orange') pri ...

  6. 肯德基联手亚马逊Kindle试水咖啡主题店中店能成功吗?

    互联网上始终有一个传说:kindle与泡面是绝配.因为用kindle压着泡面,泡出来的味道格外的好.当然,这只是一个调侃.毕竟很多人购买kindle的动力是为了摆脱其他电子设备的诱惑,想去好好去读书. ...

  7. [SDOI2019]染色(DP)

    好神的题啊! 看了这题只会第一个subtask,又参考了HN-CJ鸽王zsy的题解,实在太菜了. 暴力转移是O(nc2),很显然没有分.考虑子任务1,2,只需要转移包含已染色格子的列,然后状态数只有O ...

  8. Monkey安装与配置教程

    一.JAVA环境的搭建 安装jdk1.8.0_221,完成环境变量的配置 然后再在系统变量中找到Path,添加%JAVA_HOME%\bin;,确定后,按win+r打开运行,输入cmd 在cmd窗口中 ...

  9. [LC] 430. Flatten a Multilevel Doubly Linked List

    You are given a doubly linked list which in addition to the next and previous pointers, it could hav ...

  10. linux_cat命令

    cat 命令可以用来显示文本文件的内容(类似于 DOS 下的 type 命令),也可以把几个文件内容附加到另一个文件中,即连接合并文件. 关于此命令,有人认为写 cat 命令的人是因为喜欢猫,因此给此 ...