安卓权威编程指南 -笔记(19章 使用SoundPool播放音频)
针对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播放音频)的更多相关文章
- 安卓权威编程指南 - 第五章学习笔记(两个Activity)
学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 ...
- 安卓权威编程指南-笔记(第21章 XML drawable)
在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable ...
- 安卓权威编程指南-笔记(第27章 broadcast intent)
本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent ...
- 安卓权威编程指南-笔记(第23章 HTTP与后台任务)
1. 网络连接基本 //通过指定URL获取原始数据,并返回一个字节流数组. public byte[] getUrlBytes(String urlSpec)throws IOException{ / ...
- 安卓权威编程指南-笔记(第22章 深入学习intent和任务)
本章,我们会使用隐式intent创建一个替换android默认启动器的应用.名为NerdLauncher. NerdLauncher应用能列出设备上的其他应用,点选任意列表项会启动相应应用. 1. 解 ...
- 安卓权威编程指南-笔记(第24章 Looper Handler 和 HandlerThread)
AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做 ...
- 安卓权威编程指南 -笔记(18章 处理assets)
resources资源可以存储声音文件,但当处理多个音乐文件时,效率会很低. assets可以被看作随应用打包的微型文件系统,支持任意层次的文件目录结构.类似游戏这样需要加载大量图片和声音资源的应用通 ...
- 安卓权威编程指南 挑战练习(第26章 在 Lollipop 设备上使用 JobService)
26.11 挑战练习:在 Lollipop 设备上使用 JobService 请创建另一个 PollService 实现版本.新的 PollService 应该继承 JobService 并使用 Jo ...
- 安卓权威编程指南 挑战练习 25章 深度优化 PhotoGallery 应用
你可能已经注意到了,提交搜索时, RecyclerView 要等好一会才能刷新显示搜索结果.请接受挑战,让搜索过程更流畅一些.用户一提交搜索,就隐藏软键盘,收起 SearchView 视图(回到只显示 ...
随机推荐
- CodeForces 993B Open Communication(STL 模拟)
https://codeforces.com/problemset/problem/993/b 这题不难,暴力就能过,主要是题意太难懂了 题意: 现在有两个人,每个人手中有一对数,第一个人手中的数是n ...
- 吴裕雄--天生自然 PYTHON3开发学习:MongoDB
import pymongo myclient = pymongo.MongoClient("mongodb://localhost:27017/") mydb = myclien ...
- 大集合List分为多个子集合
批量插入时如果一次插入的对象过多会导致超过mysql限定sql长度,通过命令查看 show VARIABLES like 'max_allowed_packet' ,如果数据太多,就将大集合List分 ...
- JS中的0b00与0x00表示什么
换成二进制表示:(0b表示二进制数,0x表示16进制数)
- Opencv笔记(十三)——图像的梯度
目标 认识图像梯度.边界 学习函数cv2.Sobel(),cv2.Schar(),cv2.Laplacian() 原理 图像梯度可以把图像看成二维离散函数,图像梯度其实就是这个二维离散函数的求导.Op ...
- Flume(三) —— 断点续传 与 事务
断点续传 # Name the components on this agent a1.sources = r1 a1.sinks = k1 a1.channels = c1 # Describe / ...
- 关于guava实现线程池
private ListeningExecutorService executorService = MoreExecutors.listeningDecorator(Executors.newCac ...
- 混合欧拉回路poj 1637 Sightseeing tour
把该图的无向边随便定向,计算每个点的入度和出度.如果有某个点出入度之差为奇数,那么肯定不存在欧拉回路.因为欧拉回路要求每点入度 = 出度,也就是总度数为偶数,存在奇数度点必不能有欧拉回路: 好了,现在 ...
- Winform下编译Dev控件时提示license.licx文件错误
有时候,用vs2005或2008,用到第3方控件的时候会自动生成licenses.licx.我用的是devexpress.在程序运行的时候总是出现dev的画面,很烦.在网上找了找,找到去掉画面的方法: ...
- 简单说说PHP优化
我们在编写程序时,总是想要使自己的程序占用资源最小,运行速度更快,代码量更少.往往我们在追求这些的同时却失去了很多东西.下面我想讲讲我对PHP优化的理解.优化的目的是花最少的代价换来最快的运行速度与最 ...