Android中播放音频,除了使用MediaPlayer,还可以使用SoundPool。SoundPool使用音效池的概念来管理多个短促的音效,对于需要短促的提示音的场景特别合适。

通常调用SoundPool.load来加载某个音频文件,获得一个音效id,然后就可以用play方法来播放。

SoundPool的play方法原型如下:

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

play方法第二、三个参数用于指定左右声道的音量,取值范围是0.0~1.0。这里要说的就是这个音量值与系统音量的关系。

比如你使用AudioManager.STREAM_MUSIC或者AudioManager.STREAM_VOICE_CALL来播放提示音,此时的媒体音量或通话音量为 A (AudioManager.getStreamVolume(AudioManager.STREAM_MUSIC),那使用SoundPool.play方法播放音效时,实际的音量大小,就相当于:

leftVolume * A

注意,实际的音量效果,是乘积关系。

下面是网上流传的一段代码,其中对音量的设置就存在一个容易忽略的Bug:

AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

int currentVolume = am.getStreamVolume(AudioManager.STREAM_MUSIC);

int maxVolume = am.getStreamMaxVolume(AudioManager.STREAM_MUSIC);

float volume = ((float)currentVolume)/maxVolume;

...

mSoundPool.play(soundID, volume, volume, 1, -1, 1);

上面的代码根据当前媒体音量和媒体音量的最大值,计算出一个比值传递给play方法,作为左右声道的音量,这样的结果是缩小了实际音量!尤其是(Bug),你在播放开始前将媒体音量调整为0,开始播放后,你将听不到声音!此时你再通过音量键调整音量,也听不到声音!(我今天刚解了一个类似的Bug)

所以,如果想按照用户设置的音量来播放音效,正确的做法是:

mSoundPool.play(soundID, 1, 1, 1, -1, 1);

而如果想按系统设置音量的一半来播放音效,则可以用类似下面的代码:

mSoundPool.play(soundID, 0.5f, 0.5f, 1, -1, 1);

Android开发文档没有SoundPool.play的音量参数做详尽的说明,不过我们自己需要注意哦,否则就容易出现问题。

android soundpool设置音量,Android SoundPool.play方法的音量与系统音量的关系相关推荐

  1. android roboto字体下载,Android字体设置及Roboto字体使用方法

    本文实例讲述了Android字体设置及Roboto字体使用方法.分享给大家供大家参考.具体分析如下: 一.自定义字体 1.android Typeface使用TTF字体文件设置字体 我们可以在程序中放 ...

  2. android设置wifiip地址,android Wifi 设置静态ip地址的方法

    调用setIpWithTfiStaticIp()即可为连接好的wifi配置 静态Ip.支持Android4.0以上及以下的版本.(PS:以下的函数使用条件是:wifi是连接好的) 测试成功的 /** ...

  3. android wifi连接分配ip,android Wifi 设置静态ip地址的方法

    调用setIpWithTfiStaticIp()即可为连接好的wifi配置 静态Ip.支持Android4.0以上及以下的版本.(PS:以下的函数使用条件是:wifi是连接好的) 测试成功的 /** ...

  4. Android设备设置代理的两种方法

    本文将介绍两种给给android设备设置网络代理的方法,一种是直接在网络设置中操作,另一种是通过adb指令操作 第一种最常用的通过设置页面操作(此处以夜神模拟器为例讲解,其他设备操作方式基本类似) 操 ...

  5. android textview 设置字体,Android TextView设置字体风格

    在开发应用过程中经常会遇到显示一些不同的字体风格的信息犹如默认的LockScreen上面的时间和充电信息.对于类似的情况,可能第一反应就是用不同的多个TextView来实现,对于每个TextView设 ...

  6. android 动态设置padding,Android动态设置控件大小以及设定margin以及padding值

    http://www.aichengxu.com/Java/73893.htm Android动态设置控件大小以及设定margin以及padding值,有需要的朋友可以参考下. 一.概述 在andro ...

  7. android 状态栏设置工具栏,Android状态栏工具

    参考了一些文章做了一些修改,变成了自己的工具类.其中有很多地方欠考虑,有待改进,欢迎路过的大佬给点建议. 经过前两篇的介绍我们对如何修改状态栏的效果有了大致的了解,本篇介绍一种使用更加简单的方式 设置 ...

  8. android datepicker设置日期,Android DatePicker

    前言 话说日期时间选择控件许多项目都会用到,今天小可不才,也发一个自己写的日期选择控件 先上图 CC8V2$(JPZ`{WT42ICK7F}K.png demo.gif 1.首先自定义日期选择工具类 ...

  9. android imageview设置边框,android ImageView 添加边框

    有两种方法可以给ImageView添加边框,一种是通过xml文件配置shape.另一种是重写ImageView的ondraw方法,这里用第二中方法: package org.example.image ...

  10. android 自定义设置界面,Android 设置界面之 Preference

    Android系统为设置界面的UI提供了一系列的接口,设置界面的部分和Activity是分离的,会有一个PreferenceScreen的对象 是根目录,在其中会包含CheckBoxPreferenc ...

最新文章

  1. vue 如何防止xss攻击 框架_LearningNotes-1/Vue/Vue中防止XSS脚本攻击 at master · axuu/LearningNotes-1 · GitHub...
  2. 用什么方式链接oracle数据库,使用cx_Oracle 连接oracle数据库的几种方式
  3. html5的文档申明为什么是!DOCTYPE html?
  4. 一汽奔腾b7o价位_全新第三代奔腾B70有何资格对合资品牌降维打击?
  5. 数组任意取三个数中乘积最大值
  6. Javascript深入理解构造函数和原型对象
  7. debian下,下载linux内核
  8. 只用几行代码,我让模型『训练』加速了3倍以上!
  9. 爱客影视 程序存在文件写入漏洞 分析
  10. Javascript必须掌握的js库
  11. preg_match_all() 函数
  12. tensorflow2没有slim模块
  13. 手机参数中的4+64G到底是什么?
  14. 日语自我介绍 自己紹介・自己PR
  15. 前端可以用到的渐变色代码
  16. win10无线显示未连接到服务器,解决win10无线网络已连接但上不了网的方法
  17. 【论文笔记】《Blockchained On-Device Federated Learning》精读笔记
  18. 【英语:基础高阶_全场景覆盖表达】K9.口语主题陈述——饮食健康类
  19. ios获取UUID的方法
  20. 软件公司项目经理岗位职责

热门文章

  1. 使用VUE3.0版本搭建H5模板
  2. iPhone判断运营商
  3. Cordova Plugin /JPush PhoneGap 极光推送_本地推送_消息推送
  4. 三层转发、arp协议
  5. 钢材和不锈钢切削液-市场现状及未来发展趋势
  6. Centos7.9宝塔安装cloudreve
  7. getshell思路
  8. Android App耗电发热分析
  9. react native StatusBar的简单见解
  10. 计算机图形学 - surface,layer,pipeline