soundPool和audiofocus
audiofocus试验:
使用soundPool来写一个播放音频的porject.
资源初始化:
setContentView(R.layout.activity_main);
Button bt1 = (Button)findViewById(R.id.bt1);
Button bt2 = (Button)findViewById(R.id.bt2);
final SoundPool sp = new SoundPool(1, AudioManager.STREAM_RING, 5);
final HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
map.put(1, sp.load(MainActivity.this, R.raw.maid,1));
map.put(2,sp.load(MainActivity.this, R.raw.kali,1) );
final AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);
按键响应:
bt1.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int result = am.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
sp.play((Integer) map.get(1), 1, 1, 1, 2, 1);
}
}
});
bt2.setOnClickListener(new OnClickListener(){
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
int result = am.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
if(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
sp.play((Integer) map.get(2), 1, 1, 1, 2, 1);
}
}
});
onAudioFocusChangeListener:
final OnAudioFocusChangeListener onAudioFocusChangeListener = new OnAudioFocusChangeListener(){
@Override
public void onAudioFocusChange(int focusChange) {
// TODO Auto-generated method stub
if(focusChange == AudioManager.AUDIOFOCUS_LOSS){
}else if(focusChange == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
}else if(focusChange == AudioManager.AUDIOFOCUS_REQUEST_FAILED){
}else if(focusChange == AudioManager.AUDIOFOCUS_GAIN){
}else if(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
}else{
}
}
};
这个不是完美的验证AudioFocus的例子。由于soudPool构造函数本身就规定了最大音频流的数量
public soundPool(int maxStreams,int streamType,int srcQuality)
所以两个按键轮流响应并不构成对AudioFocus的争夺,仅仅要将最大流数量设置为1。当还有一个按键响应的时候还有一个音频就是停止了。在这就不考虑这个了。
其二。发现当音频较大几M的时候,soundPool由于要先缓存。程序初执行点击按键会提示须要等待初始化结束,而且audioFocus失去后不会立即静音,而会多播放1s或者2s。
以上是soundPool的问题,至于audioFocus则在于
AudioManager的使用。发起requestAudioFocus的请求。及在AudioFocus发生变化时在onAudioFocusChangeListener的响应处理。
基本按api使用就可以。
使用AudioFocus的核心是遵从AudioFocus的使用规则。遵循开放软件的标准,由于AudioFocus是一个竞争资源。假设有一个坏家伙不按规则工作就会出现功能失效进而影响其它应用的使用。这个问题在一些app上偶尔出现。
举个例子,在办事窗体前面排队,前面的家伙已经办完事了还不走站在窗体继续喝办事员对话。而你也要和办事员对话。两个人都叽里呱啦,办事员会疯掉。用户就是那个办事员~
soundPool和audiofocus的更多相关文章
- Android 使用SoundPool播放音效
在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高.延迟时间较长.不支持多个音频同时播放等.这些缺点决定了MediaP ...
- Android音频播放之SoundPool
SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...
- 使用SoundPool播放音效
针对应用程序经常需要播放密集.短促的音效,因为MediaPlayer存在如下缺点: 1.资源占用量较高.延迟时间较长. 2.不支持多个音效同时播放. SoundPool使用音效池的概念来管理多个短促的 ...
- Android SoundPool.play方法的音量与系统音量的关系
Android中播放音频,除了使用MediaPlayer,还可以使用SoundPool.SoundPool使用音效池的概念来管理多个短促的音效,对于需要短促的提示音的场景特别合适. 通常调用Sound ...
- Android中的音频播放(MediaPlayer和SoundPool)
Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...
- Android的SoundPool
开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,SoundPool类在SDK的android.media.S ...
- android SoundPool播放音效
MediaPlayer的缺点: 资源占用量高,延时时间较长 不支持多个音效同一时候播放 SoundPool主要用于播放一些较短的声音片段,CPU资源占用率低和反应延时小,还支持自行色设置声音的品质,音 ...
- SoundPool没有声音的问题
在项目中需要播放一个提示,很短的一个声音,Android中播放声音有两种方式:MediaPlayer和SoundPool.相对来说SoundPool比较轻量级一些,多用在播放比较短急的声音,Media ...
- Android MediaPlayer播放一般音频与SoundPool播放短促的音效
[1]使用MediaPlayer实现一般的音频播放 MediaPlayer播放通常的音频文件 MediaPlayer mediaPlayer = new MediaPlayer(); if (medi ...
随机推荐
- 【转】 iOS 原生二维码扫描(可限制扫描区域)
在用 AVFoundation 完成扫码后,遇到2个问题: 1,如何限制扫描范围? 2.条形码如何扫描? 一位朋友的文章帮助了我,特地转来,可以帮到有需要的朋友. 原文:http://blog.csd ...
- asp.net 图片质量压缩(不改变尺寸)
private static ImageCodecInfo GetEncoderInfo(String mimeType) { int j; ImageCodecInfo[] encoders; en ...
- UVA 10254 - The Priest Mathematician (dp | 汉诺塔 | 找规律 | 大数)
本文出自 http://blog.csdn.net/shuangde800 题目点击打开链接 题意: 汉诺塔游戏请看 百度百科 正常的汉诺塔游戏是只有3个柱子,并且如果有n个圆盘,至少需要2^n- ...
- 路由器to路由器
本文主要介绍一个主路由器连接两个子路由器的方法: 主路由器: 设置主路由器的开始ip地址为192.168.1.100,结束ip地址为192.168.150: 子路由器A: 第一步:LAN设置 第二步: ...
- 我牵头,你做事——C#委托实践
我牵头,你做事——C#委托实践一 2007-09-05 23:54:54 标签:委托 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http ...
- python ATM购物程序
需求: 模拟实现一个ATM + 购物商城程序 额度 15000或自定义 实现购物商城,买东西加入 购物车,调用信用卡接口结账 可以提现,手续费5% 每月22号出账单,每月10号为还款日,过期未还,按欠 ...
- JDBC与javaBean
1.JDBC的概念: Java数据库连接技术(Java DataBase Connectivity)能实现java程序对各种数据库的访问, 由一组使用java语言编写的类 和 接口(jdbc api) ...
- android视图切换动画:ViewAnimator类及其子类
类图:
- struts2的记住账号密码的登录设计
一个简单的基于struts2的登录功能,实现的额外功能有记住账号密码,登录错误提示.这里写上我在设计时的思路流程,希望大家能给点建设性的意见,帮助我改善设计. 登录功能的制作,首先将jsp界面搭建出来 ...
- Wad Manager的下载和运行
关于WAD版的软件 WAD版的软件分为两种: 独立安装版:程序完全安装在Wii的内置存储空间上,可以在Wii的主界面直接启动软件. Forwarder版:程序安装在Wii的内置存储空间上,同时在SD卡 ...