SoundPool一般用来播放的文件特点有:声音短,文件小,延时慢(不像使用MediaPlayer类播放音乐时,需要等待一段时间),因此常用来播放游戏时的音效,解锁时的铃声等。注意:该类不适合播放太大的文件资源,我测试了个900K左右的文件,播放不了

使用SoundPool一般需要下面几个步骤:

1、将音乐文件拷贝到工程下;

2、新建一个SoundPool实例;

3、使用load()方法,让SoundPool实例加载音效资源,该方法会返回一个整型的soundID,在第四步需要用到;

4、使用play()方法播放音效,该方法会返回一个整型的streamID,这个返回值可以保存起来,在需要暂停 /  恢复播放时需要用到。

具体实现以及参数如下:


1、新建一个工程,我取名SoundPoolDemo,在res文件夹下新建一个raw文件夹,将.mp3文件拷贝到其中

2、新建一个SoundPool实例。SoundPool只有一个构造方法,

SoundPool(int maxStreams, int streamType, int srcQuality)

参数如下:

int  maxStreams:在声音池中允许同时存在的声音数量。当池子中的声音超过这个数量时,优先级(后面会提到)最低、或者最早(Oldest,原谅我可怜的翻译水平)放进池中的,将被移除。这个数值不是越大越好,因为越大也就意味着,Android会给你预分配一个更大的空间,如果不需要使用会造成浪费。

int  streamType:声音流的类型,有STREAM_RING、STREAM_MUSIC等等,一般都是使用后者,即AudioManager.STREAM_MUSIC。

int srcQuality:官网解释为“采样速率转化器的质量”(再次原谅我的翻译),这个参数目前没有什么实际意义(可能还没实现这个功能),所以设置什么数值都无所谓,官方建议用0;

3、加载资源方法:

public int load(Context context, int resId, int priority)

参数如下:

Context  context:这个不必多解释,一般都是设置为getApplicationContext()获取

int resId:想要加载的音效资源ID,我用的是R.raw.XXX

int priority:音效播放时的优先级,官方解释这个参数在这个方法中不起作用,建议用1暂时代替(Currently has no effect. Use a value of 1 for future compatibility.)

注:该方法会返回一个soundID,在以后使用中需要使用

4、播放

07-08注:在load声音资源后,并不能立即调用play,否则无法播放声音,因为声音资源还没加载完成,应该给足够时间让它加载完成,比如在onCreate中load,在onclick中play

public final int play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate)

参数如下:

int  soundID:在第3步中提到了。

float  leftVolume:左声道音量大小,这是一个相对值,大小在0.0f - 1.0f之间,具体计算方法为:你想要的声音大小 / 最大音量,比如取值0.8f表示最大音量的80%

float  rightVolume:右声道音量大小,具体如上

int  priority:优先级,值越大优先级越高,0的优先级最低。之前在第3步中也有一个优先级参数,但是那里无效,而现在这里的这个参数是正儿八经有效果的。

int loop:是否需要循环播放,取值不限。其中负数表示无穷循环(官方建议,如果无穷循环,用-1,当然-2、-3等也行),非负数表示循环次数,比如0表示循环0次,也就是播放一次就不再循环了,总共就只播放一次;1则表示循环1次(总共播放2次)。

float  rate:这个参数有点意思,可以理解为播放速率(就是快进、快退啥的),取值0.5f - 2.0f,其中0.5表示播放速度为正常的0.5倍。1表示正常速率播放。

下面开始正式编码:

1、资源文件如下图:

2、布局文件不解释了,只有一个简单的Button。下面是MainActivity.java的代码(总共就一个类)

[java] view plain copy
  1. package com.exam.soundpooldemo;
  2. import android.app.Activity;
  3. import android.media.AudioManager;
  4. import android.media.SoundPool;
  5. import android.os.Bundle;
  6. import android.view.View;
  7. import android.view.View.OnClickListener;
  8. import android.widget.Button;
  9. public class MainActivity extends Activity {
  10. Button playButton;
  11. SoundPool sp;
  12. int soundID_1,soundID_2;
  13. int streamID_1,streamID_2;
  14. @Override
  15. protected void onCreate(Bundle savedInstanceState) {
  16. super.onCreate(savedInstanceState);
  17. setContentView(R.layout.activity_main);
  18. sp=new SoundPool(10, AudioManager.STREAM_MUSIC,0);
  19. soundID_1=sp.load(getApplicationContext(), R.raw.lingsheng, 1);
  20. soundID_2=sp.load(getApplicationContext(), R.raw.moon, 1);
  21. playButton=(Button)findViewById(R.id.play);
  22. playButton.setOnClickListener(new OnClickListener() {
  23. @Override
  24. public void onClick(View v) {
  25. streamID_1=sp.play(soundID_1, 0.8f, 0.8f,1, -1, 1.0f);
  26. streamID_2=sp.play(soundID_2, 0.8f, 0.8f,1, -1, 1.0f);
  27. }
  28. });
  29. }
  30. }

发现按下按钮,可以听到两种音效同时播放(因为我的代码中是播放2种)。

尾声:

前面提到播放音效的方法play()会返回一个streamID,这个返回值在暂停 / 恢复时需要用到,比如恢复:

[java] view plain copy
  1. public final void resume (int streamID)

看到了吧,所以最好用一些变量将他们保存起来。

如果还有不懂的,可以直接参考API:

http://www.android-doc.com/reference/android/media/SoundPool.html

安卓的SoundPool(音效池)播放声音(及具体参数解析)相关推荐

  1. python的用途实例-python进程池作用展示及实例解析

    在以下的文章之中我们来了解一下什么是python中的进程池.了解一下python进程池的相关知识,以及进程池在python编程之中能起到什么样的作用. 进程池 Pool类描述了一个工作进程池,他有几种 ...

  2. 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )

    文章目录 一.线程池 execute 方法源码解析 二.线程池 execute 方法完整源码及注释 一.线程池 execute 方法源码解析 进入 ThreadPoolExecutor 中 , 查看线 ...

  3. c++ socket线程池原理_ThreadPoolExecutor线程池实现原理+源码解析

    推荐学习 被微服务轰炸?莫怕!耗时35天整出的「微服务学习教程」送你 死磕「并发编程」100天,全靠阿里大牛的这份最全「高并发套餐」 闭关28天,奉上[Java一线大厂高岗面试题解析合集],备战金九银 ...

  4. 安卓网络操作全解:发起请求,解析响应

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 安卓网络操作全解. 发起请求,解析xml响应流 //发起一个请求 private void connect(String urlpath) {//启动 ...

  5. 玩转JDBC打造数据库操作万能工具类JDBCUtil,加入了高效的数据库连接池,利用了参数绑定有效防止SQL注入

    转载请注明出处:http://blog.csdn.net/linglongxin24/article/details/53750584 本文出自[DylanAndroid的博客] 玩转JDBC打造数据 ...

  6. 【多线程】线程池的创建和参数设定

    为什么要使用线程池 在日常开发中为了提高代码运行效率,或多或少会用线程去执行异步任务,线程的创建和销毁是需要占用一定资源的. 首先我们看一下一个线程的创建步骤: 为线程堆栈分配和初始化大量内存块 需要 ...

  7. 【开源项目】动态线程池框架Hippo4j源码解析

    动态线程池框架Hippo4j源码解析 项目简介 Hippo-4J 通过对 JDK 线程池增强,以及扩展三方框架底层线程池等功能,为业务系统提高线上运行保障能力. 快速开始 https://hippo4 ...

  8. 线程池中的七大参数(三)

    线程池中的七大参数如下: (1)corePoolSize:线程池中的常驻核心线程数. (2)maximumPoolSize:线程池能够容纳同时执行的最大线程数,此值大于等于1. (3)keepAliv ...

  9. [Android]【安卓】Json数据的快速拼装和解析

    [Android][安卓]Json数据的快速拼装和解析 本篇博客已收录到我的安卓开发小结中--点击[安卓开发小结] 参考资料:介绍 Json 一.什么是Json数据 JSON(JavaScript O ...

最新文章

  1. hive export import
  2. python声明编码作用_Python源代码中的编码声明字符串的作用
  3. Apache Flink 读取本地文件,处理数据,导入ES
  4. 反转字符串中的单词 III leetcode
  5. c语言 %15s,c语言求助
  6. 深度学习——第一次浪潮、寒冬及解冻
  7. 正则表达式大全(汇总)
  8. sql选择题_SQL选择
  9. Java中字符串比较的注意点
  10. JSP教程第9讲笔记
  11. pjsip代码分析(1)——modules框架
  12. 椭圆形中间一个大写的v_Shift键在 Word 中的 9 个经典操作,第一个你可能就不知道!【Word教程】...
  13. 海思mpp_sample例子详解
  14. LTP学习笔记(基本安装+执行)
  15. apollo(阿波罗) 分布式部署指南
  16. 产品经理需要掌握的十大知识模块
  17. PoetryGenerator的参数
  18. FBX导入Unity中模型没有材质的处理
  19. 二分插入排序法-Python版
  20. Eclipse BreakPoint断点调试技巧和基本步骤方法

热门文章

  1. 记录一下Ubuntu下安装Docker遇到的坑
  2. 深入学习VMware vSphere---基础知识
  3. 【算法】高精度(加减乘除)包含高精度*高精度高精度/高精度
  4. 多个wordpress共享用户信息、共享Cookie
  5. 标准盒子模型与怪异盒子模型
  6. J-Link 下载程序 接线图
  7. 基于Php美妆化妆品商城购物网站
  8. WEB前端学习 (3)CSS复习二 ( 复合选择器+元素显示模式+ 背景)
  9. Python3.7对文本批量进行词频分析
  10. Jeecgboot-Vue3 v1.2.0 版本正式发布,企业级低代码平台