安卓权威编程-笔记(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          */
7         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)方法。

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

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

时间: 2024-10-12 16:55:11

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

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

学习安卓编程权威指南第五章的时候自己写了个简单的Demo来加深理解两个Activity互相传递数据的问题,然后将自己的学习笔记贴上来,如有错误还请指正. IntentActivityDemo学习笔记 题目:ActivityA登录界面(用户名.密码.登陆按钮),ActivityB(Edit,返回按键:SubmitButton).A界面输入用户名和密码传到B中,B验证用户输入的用户名和密码,如果错误就返回A,并用Toast 显示用户名和密码错误:如果正确,就在第二个 activity中显示一个Edi

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

在Andorid的世界里,凡事要在屏幕上绘制的东西都可以叫drawable,比如抽象图形,Drawable的子类,位图图形等,我们之前用来封装图片的BitmapDrawable就是一种drawable. 本章我们还会看到更多的drawable:state list drawable.shape drawable和layer list drawable. 这三个drawable都定义在XML文件中,可以归为一类,统称为XML drawable. shape drawable 使用ShapeDraw

安卓权威编程指南-笔记(第26章 服务的作用)

1. IntentService IntentService也是一个context(Service是Context的子类),并能够响应intent. 一个最基本的IntentService实例如下: public class PollService extends IntentService { private static final String TAG = "PollService"; public static Intent newIntent(Context context)

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

本章需求:首先,让应用轮询新结果并在有所发现时及时通知用户,即使用户重启设备后还没有打开过应用.其次,保证用户在使用应用时不出现新结果通知. 1. 一般intent和broadcast intent 许多系统组件需要知道某些事件的发生(WIFI信号时有时无,电话的呼入等),为满足这样的需求,Andorid提供了broadcast intent 组件. broadcast intent的工作原理类似于之前学过的intent,但不同的是broadcast intent可以被多个叫做broadcast

安卓权威编程指南-笔记(第25章 搜索)

1. SearchView SearchView是个操作视图,所谓操作视图,就是可以内置在工具栏中的视图.SearchView可以让整个搜索界面完全内置在应用的工具栏中. 1.1 SearchView的配置 <?xml version="1.0" encoding="utf-8"?> <menu xmlns:android="http://schemas.android.com/apk/res/android" xmlns:ap

安卓权威编程指南-笔记 (第29章定制视图与触摸事件)

1.定制视图 Android自带众多优秀的标准视图与组件,但有时为追求独特的应用视觉效果,我们仍需创建定制视图. 定制视图分为两大类别: 简单视图: 简单视图内部也可以很复杂,之所以归为简单类别,是因为简单视图不包括子视图,而且简单视图几乎总是会执行定制绘制. 聚合视图:聚合视图由其他视图对象组成,聚合视图通常管理着子视图,但不负责执行定制绘制,图形绘制任务都委托给了各个子视图. 创建定制视图的所需的三大步骤: 选择超类.对于简单定制视图而言,View是个空白画布,因此它作为超类最常见,对于聚合

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

AsyncTask是执行后台线程的最简单方式,但它不适用于那些重复且长时间运行的任务. 1. Looper Android中,线程拥有一个消息队列(message queue),使用消息队列的线程叫做消息循环(message loop).消息循环会循环检查队列上是否有新消息. 消息循环由线程和looper组成,Looper对象管理着线程的消息队列. 主线程就是个消息循环,因此也拥有Looper,主线程的所有工作都是由其looper完成的,looper不断的从消息队列中抓去消息,然后完成消息指定的

安卓权威编程指南 挑战练习 22章 应用图标

本章使用了 ResolveInfo.loadLabel(...) 方法,在启动器应用中显示了各个activity的名 称. ResolveInfo 类还提供了另一个名为 loadIcon() 的方法.可以使用该方法为每个应用加载 显示图标.你要接受的挑战就是,为NerdLauncher应用中显示的所有应用添加对应的图标. 首先增加一个RecyclerView的条目布局,代码如下: 1 <?xml version="1.0" encoding="utf-8"?&

安卓权威编程 挑战练习 16章

16.7 挑战练习:优化照片显示 现在虽然能够看到拍摄的照片,但没法看到它们的细节. 请创建能显示缩放版本照片的 DialogFragment .只要点击缩略图,就会弹出这个 DialogFragment ,让用户查看缩放版本的陋习现场图片. 创建一个根节点为ImageView的布局文件,代码如下: <?xml version="1.0" encoding="utf-8"?> <ImageView xmlns:android="http: