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的更多相关文章

  1. Android 使用SoundPool播放音效

    在Android开发中我们经常使用MediaPlayer来播放音频文件,但是MediaPlayer存在一些不足,例如:资源占用量较高.延迟时间较长.不支持多个音频同时播放等.这些缺点决定了MediaP ...

  2. Android音频播放之SoundPool

    SoundPool 一.基本概念 在Android应用程序的开发过程中,经常需要播放多媒体文件,也许最先想到的会是MediaPlayer类了,该类提供了播放.暂停.停止及重复播放等功能性方法(该类位于 ...

  3. 使用SoundPool播放音效

    针对应用程序经常需要播放密集.短促的音效,因为MediaPlayer存在如下缺点: 1.资源占用量较高.延迟时间较长. 2.不支持多个音效同时播放. SoundPool使用音效池的概念来管理多个短促的 ...

  4. Android SoundPool.play方法的音量与系统音量的关系

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

  5. Android中的音频播放(MediaPlayer和SoundPool)

    Android中音频和视频的播放我们最先想到的就是MediaPlayer类了,该类提供了播放.暂停.停止.和重复播放等方法.该类位于android.media包下,详见API文档.其实除了这个类还有一 ...

  6. Android的SoundPool

    开发Android软件中我们可能经常需播放多媒体声音文件,一般使用MediaPlayer类但该类占用资源较多,对于游戏等应用可能不是很适合,SoundPool类在SDK的android.media.S ...

  7. android SoundPool播放音效

    MediaPlayer的缺点: 资源占用量高,延时时间较长 不支持多个音效同一时候播放 SoundPool主要用于播放一些较短的声音片段,CPU资源占用率低和反应延时小,还支持自行色设置声音的品质,音 ...

  8. SoundPool没有声音的问题

    在项目中需要播放一个提示,很短的一个声音,Android中播放声音有两种方式:MediaPlayer和SoundPool.相对来说SoundPool比较轻量级一些,多用在播放比较短急的声音,Media ...

  9. Android MediaPlayer播放一般音频与SoundPool播放短促的音效

    [1]使用MediaPlayer实现一般的音频播放 MediaPlayer播放通常的音频文件 MediaPlayer mediaPlayer = new MediaPlayer(); if (medi ...

随机推荐

  1. MySQL拷贝表的几种方式

    假如我们有以下这样一个表: id      username    password ----------------------------------- 1       admin       * ...

  2. OC - 20.多图下载

    效果图 常见问题及解决方法 图片重复下载 将内存保存在内存或沙盒中. 若下载的图片量较大,则会出现UI界面不流畅的现象 在子线程中执行下载操作,然后回到主线程成中进行UI界面的刷新. 由于cell的循 ...

  3. XML约束

    XML约束--能够看懂约束内容,根据约束内容写出符合规则的xml文件. DTD约束 1)导入dtd方式 内部导入 <!DOCTYPE note [ <!ELEMENT note (to,f ...

  4. 在fragment中获取他附着的activity中的变量

    final String data=(关联的activity类)getActivity().getData(); getData();自定义的方法

  5. SERVER全局数组

    [HTTP_HOST] => www.eduoautoweb.com [HTTP_CONNECTION] => keep-alive [HTTP_ACCEPT] => text/ht ...

  6. 学习python——博客记录第一天

    HELLO WORLD!   今天第一次开立博客,专门记载学习编程语言中的点点滴滴.今日学习内容: 搭建vs code+ python3.5 "ide" 学习廖雪峰python教程 ...

  7. 探究Android中Listview显示错乱问题

    问题 最近在项目中遇到过一个很棘手的问题,就是ListView在滑动后就莫名其妙的显示错乱,网上查阅资料后问题很容易的就解决了,但是对于问题产生的原因仍是一知半解,所以不甘心的我定下心来,狠读源码,终 ...

  8. vector list array deque

    因此在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面 的原则:   1.如果你需要高效的随即存取,而不在乎插入和删除的效率,使用vector   2.如果你需要大量的插入和 ...

  9. bzoj3576: [Hnoi2014]江南乐

    Description 小A是一个名副其实的狂热的回合制游戏玩家.在获得了许多回合制游戏的世界级奖项之后,小A有一天突然想起了他小时候在江南玩过的一个回合制游戏.    游戏的规则是这样的,首先给定一 ...

  10. iOS项目管理:目录结构和开发流程

    iOS项目管理:目录结构和开发流程     最近正在做一个大版本的更新,现在在重构中.... 发现很多人在一个项目的开始不知道开发流程是什么,也不是非常清晰的知道一个项目该有目录结构.如果项目小或者是 ...