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. Mavne + Spring整合CXF

    http://blog.csdn.net/xiongyu777888/article/details/23787615(没毛病) http://blog.csdn.net/hbsong75/artic ...

  2. scn转换为十进制

  3. 更改tabBarItem图片的问题

    代码: UIImage *normal = [[UIImage imageNamed:@"tabbar_home_default"] imageWithRenderingMode: ...

  4. 【USACO 3.2.1】阶乘

    [描述] N的阶乘写作N!表示小于等于N的所有正整数的乘积.阶乘会很快的变大,如13!就必须用32位整数类型来存储,70!即使用浮点数也存不下了.你的任务是找到阶乘最后面的非零位.举个例子,5!=1* ...

  5. [C++] 对象地址与接口指针的故事

    刚想到一个问题,一直在思考C++中对象地址与接口指针的故事. 问题:多继承的情况下,一个具体类对象实现了多个接口,那么多该对象获取的不同接口指针是一样的吗?不是一样吗?不是对象地址吗?-- 困惑原因, ...

  6. Open vSwitch在openstackHavana概述

    最近再看Open vSwitch一些东西,我认为openstack官网上对这一块做了一些了解,所以就把这一块翻译出来以供参考,英语不好,翻译得很粗糙. Open vSwitch插件是最有名的核心插件之 ...

  7. ubuntu用户及用户组文件信息

    1.用户帐号文件 /etc/passwd中存放当前系统的用户列表及用户基本的设置信息: 文件中每一行对应一个用户信息,用户信息用":"来分隔,各项内容含义如下: 用户名:用户密码: ...

  8. linux dd命令测试U盘读写速度

    1. dd命令简述: if=输入文件, of=输出文件, ibs=一次读取字节数, obs=一次写入字节数, bs=设置一次读取写入的字节数, skip=跳过的bs数, count=拷贝的块数 2. ...

  9. 实现跨线程访问UI控件的3种方法

    namespace 多线程 { public partial class Form2 : Form { public Form2() { InitializeComponent(); } privat ...

  10. 002.AngularJs调用Restful实现CRUD

    本节我们主要给大家介绍AngularJs如何调用Restful,实现数据的CRUD. 主要用到的技术: 后端:ASP.NET WebApi + SQLServer2008 前端:AngularJs,B ...