audiofocus试验:

使用soundPool来写一个播放音频的porject.

资源初始化:

  1. setContentView(R.layout.activity_main);
  2. Button bt1 = (Button)findViewById(R.id.bt1);
  3. Button bt2 = (Button)findViewById(R.id.bt2);
  4. final SoundPool sp = new SoundPool(1, AudioManager.STREAM_RING, 5);
  5. final HashMap<Integer, Integer> map = new HashMap<Integer, Integer>();
  6. map.put(1, sp.load(MainActivity.this, R.raw.maid,1));
  7. map.put(2,sp.load(MainActivity.this, R.raw.kali,1) );
  8. final AudioManager am = (AudioManager)getSystemService(Context.AUDIO_SERVICE);

按键响应:


  1. bt1.setOnClickListener(new OnClickListener(){
  2. @Override
  3. public void onClick(View v) {
  4. // TODO Auto-generated method stub
  5. int result = am.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
  6. if(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
  7. sp.play((Integer) map.get(1), 1, 1, 1, 2, 1);
  8. }
  9. }
  10. });
  11. bt2.setOnClickListener(new OnClickListener(){
  12. @Override
  13. public void onClick(View v) {
  14. // TODO Auto-generated method stub
  15. int result = am.requestAudioFocus(onAudioFocusChangeListener, AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);
  16. if(result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
  17. sp.play((Integer) map.get(2), 1, 1, 1, 2, 1);
  18. }
  19. }
  20. });

onAudioFocusChangeListener:

  1. final OnAudioFocusChangeListener onAudioFocusChangeListener = new OnAudioFocusChangeListener(){
  2. @Override
  3. public void onAudioFocusChange(int focusChange) {
  4. // TODO Auto-generated method stub
  5. if(focusChange == AudioManager.AUDIOFOCUS_LOSS){
  6. }else if(focusChange == AudioManager.AUDIOFOCUS_REQUEST_GRANTED){
  7. }else if(focusChange == AudioManager.AUDIOFOCUS_REQUEST_FAILED){
  8. }else if(focusChange == AudioManager.AUDIOFOCUS_GAIN){
  9. }else if(focusChange == AudioManager.AUDIOFOCUS_LOSS_TRANSIENT){
  10. }else{
  11. }
  12. }
  13. };

这个不是完美的验证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. loop_login.sh

    [oracle@ora10g scripts]$ cat loop_login.sh #/bin/bash####################export ORACLE_BASE=/u01/app ...

  2. Oracle的卸载与安装

    今天在做一个CURD的web小应用,为后面使用ExtJS搭建一个后台.因为还没有使用过Oracle数据库,因此今天也特的地的使用oracle数据库作为后台的数据库,也当练习使用oracle. 但是今天 ...

  3. PHP Countable接口

    实现该接口可以使用count()方法来获取集合的总数

  4. 事件的委托处理(Event Delegation)

    javascript的事件模型,采用”冒泡”模式,也就是说,子元素的事件会逐级向上”冒泡”,成为父元素的事件. 利用这一点,可以大大简化事件的绑定.比如,有一个表格(table元素),里面有100个格 ...

  5. 11_RHEL安装Maya2015

    1. 解压 tar -xvf ./Autodesk_Maya_English_2015_Linux_64bit.tgz 2. 运行 ./setup 2.1补充 如果提示缺少 libpng12.so.0 ...

  6. jquery mobile 主题

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name ...

  7. Java JNDI Datasource HOW-TO Problem

    在开发JAVA的时候发生了点问题,解决方案记录一下,在这里http://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto. ...

  8. 【转】火火火火火!看HomeKit如何改变物联网和智能家居?

    摘要: 智能家居并非新概念,然而在苹果等巨头插足之前,它却只是一盘散沙,各自为营,苹果又将如何凭借HomeKit构建起拥有统一界面和控制中心的平台来实现各种智能家居设备与应用之间的无缝连接,真正实现智 ...

  9. MongoDB-性能优化之索引

    首先看一个实例 >;i<;i++){ db.indexdemo.insert({),"create":new Date});} WriteResult({ }) > ...

  10. mongodb3.2系统性学习——4、find()操作

    find 操作语法展示: find()操作实例 : //连接数据库 dbService = connect("localhost:27017"); //选择插入集合 db = db ...