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 ...
随机推荐
- js监听滚动条事件
(function () { if(document.addEventListener){ document.addEventListener('mousewheel',scrollFunc,fals ...
- [转]memmove函数
[FROM MSDN && 百科] 原型: void *memmove( void* dest, const void* src, size_tcount ); #include&l ...
- C++虚基类详解(转)
我们知道,如果一个派生类有多个直接基类,而这些直接基类又有一个共同的基类,则在最终的派生类中会保留该间接共同基类数据成员的多份同名成员.在引用这些同名的成员时,必须在派生类对象名后增加直接基类名,以避 ...
- MySQL 缓存 Query Cache
QueryCache(下面简称QC)是根据SQL语句来cache的.一个SQL查询如果以select开头,那么MySQL服务器将尝试对其使 用QC.每个Cache都是以SQL文本作为key来存的.在应 ...
- C盘不能新建文件的问题解决办法
C盘不能新建文件的问题解决办法 主要症状: 1.C 盘文件不能修改2.C 盘不能新建文件3.总之就是只能读取不能,写入和修改这样对于平时操作造成了极其的不方便~~~复制文件到C 盘会提示:错误0×80 ...
- C# 多线程编程 ThreadStart ParameterizedThreadStart
原文地址:http://club.topsage.com/thread-657023-1-1.html 在实例化Thread的实例,需要提供一个委托,在实例化这个委托时所用到的参数是线程将来启动时要运 ...
- JS中 submit提交与Form表单里的onsubmit的调用问题?
最近在开发中遇到了表单提交前验证的问题,用一个普通的button按钮代替submit按钮,在提交前触发这个button的onclick事件,在其事件中触发form的submit事件.问题出现了: &l ...
- 深入理解javascript闭包(一)
原文转自脚本之家(http://www.jb51.net/article/24101.htm) 闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. ...
- TCP回射客户程序:str_cli函数
str_cli函数完成客户处理循环: 从标准输入读入一行文本,写到服务器上,读回服务器对该行的回射,并把回射行写到标准输出上 读入一行,写到服务器 fgets读入一行文本,writen把该行发送给服务 ...
- iOS自定义的UISwitch按钮
UISwitch开关控件 开关代替了点选框.开关是到目前为止用起来最简单的控件,不过仍然可以作一定程度的定制化. 一.创建 UISwitch* mySwitch = [[ UISwitchalloc] ...