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的音量参数做详尽的说明,不过我们自己需要注意哦,否则就容易出现问题。

转载于:https://www.cnblogs.com/hehehaha/p/6147407.html

Android SoundPool.play方法的音量与系统音量的关系相关推荐

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

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

  2. iOS 设置系统音量和监听系统音量变化

    很简单的调用 首先在工程引入MediaPlayer.framework #import <MediaPlayer/MediaPlayer.h> 1. 获取系统音量 // 获取系统音量 MP ...

  3. android多音频输出,基于Android车载系统的多路音频输出的方法、装置及系统与流程...

    本发明涉及Android车载系统领域,特别涉及一种基于Android车载系统的多路音频输出的方法.装置及系统. 背景技术: 车载系统主要由主机.显示屏.操作键盘(遥控器)和天线组成.它实现了野外踏勘. ...

  4. android系统音量监控

    当应用程序通过AudioManager的setStreamVolume方法设置音量时,会发送如下代码广播: Intent intent = new Intent(AudioManager.VOLUME ...

  5. android小工具-系统音量管理器

    简介:调节系统音量的小工具,能够快捷的调节系统铃声,媒体音乐.闹钟和通话声音.你可能会想,手机自带的音量键还不够快捷吗?还得写个程序?首先,用音量键调音只能调节一种声音,像闹钟这种声音不能直接调.其次 ...

  6. android通话音量和多媒体音量,Android中获取与设置媒体,通话等音量的方法

    获取系统音量 通过程序获取android系统手机的铃声和音量.同样,设置铃声和音量的方法也很简单! 设置音量的方法也很简单,AudioManager提供了方法: public void setStre ...

  7. android intent铃声选择,Android 设置系统铃声和系统音量

    android系统铃声设置 public class Main extends Activity { /** Called when the activity is first created. */ ...

  8. Android x86启动后拖动系统音量设置

    基于Android x86 android 9. 1.进入系统音量设置(系统 app)中,拖动媒体音量控制条控件,可以输出声音=>ok dumpsys audio: 可以看到player有sta ...

  9. Android 修改系统音量及监听

    效果 修改系统音量这种操作还是挺常见的,一般在多媒体开发中都多少会涉及到. 常用方法 获取音频管理器 mAudioManager = this.getSystemService(Context.AUD ...

最新文章

  1. bug诞生记——const_cast引发只读数据区域写违例
  2. pytorch 测试每一类_DeepFM全方面解析(附pytorch源码)
  3. 爬虫基础分享Scrapy框架流程图与安装
  4. swift自行车品牌介绍_品牌101:简介
  5. 使用通用mapper实现条件查询_【微服务】152:Stream流和通用mapper批量查询的使用...
  6. python字符串相加_Python实用技法第33篇:字符串连接及合并
  7. mysql全局变量的使用_mysql - 变量的使用
  8. python 线程同步_python线程同步(2)
  9. Shell编程语言(一)
  10. html安装方正兰亭,方正兰亭字体
  11. [012计算机网络系列] | Cisco packet 怎样清空一台PC的ARP Table?
  12. potentially fixable with the `--fix` option.
  13. OpenHarmony开发环境WSL2配置踩坑
  14. html5最新滚动效果,jQuery和CSS3炫酷滚动页面内容元素动画特效插件
  15. 北上广租房技巧(希望大家都少走点坑)
  16. 社区社群运营,如何打造火爆营销的方法?
  17. Python实现list列表的有序子集查找
  18. 【Spring系列】- 手写模拟Spring框架
  19. 自动发帖程序的一些总结
  20. 牛客客似云来(大数算法)

热门文章

  1. python turtle画圆、循环法_实验与作业(Python)-03 Python程序实例解析(函数、循环、range、turtle)...
  2. 如何读取服务器的文件夹大小,请教如何获取outlook文件夹对话框中服务器数据大小?...
  3. python深入与提高_关于提高Python计算性能的说明摘要,深入,提升,python,笔记,小结,不,定时,更新...
  4. python csv文件写入失败_python解析csv文件失败
  5. dj打碟怎么学_南京学DJ打碟
  6. MATLAB学习笔记(一)
  7. eclipse新建项目有红叉_selenum+java+eclipse环境搭建和浏览器驱动配置
  8. 信息系统项目管理师优秀论文:项目风险管理
  9. Jquery获取select标签的值、文本方式
  10. Winform中设置Dialog的显示位置居中