什么叫音频焦点 (audio focus)?

android系统是一个多任务操作系统,因此同一时刻允许许多任务同时工作。但是这对音频类应用来说是个挑战,因为如果多个音频同时播放的话,很多情况下用户体验会相当的差!比如听音乐时,来了个电话,这时你的耳机里就是电话和音乐共同工作,绝对是个悲剧!

为了解决这个问题从android2.2开始引入audio focus的概念。当你需要播放音乐或者发送一个通知的时候,你可以去要求获得音频焦点。一旦获得,就可以自由的使用音频输出设备。但是同时它也在时时刻刻的监听着音频焦点的变化。当音频焦点变化时,你需要去合适的处理你的音频输出。

音频焦点工作的示例:

第一步

首先你要获得一个音频管理服务AudioManager

mAudioManager = (AudioManager)getSystemService(AUDIO_SERVICE);

这个通常在service的oncreate中完成。

第二步

然后在合适的地方,比如播放音乐的按钮中放置获得音频焦点的代码

mAudioManager.requestAudioFocus(mAudioFocusListener,
                AudioManager.STREAM_MUSIC, AudioManager.AUDIOFOCUS_GAIN);

requestAudioFocus方法可以获得音频焦点,其有三个参数,解释如下:

第一个参数 OnAudioFocusChangeListener:就是音频焦点变化时的监听器,这是音频焦点控制的重点。

第二个参数streamType:焦点获得之后的数据传输类型,这里是AudioManager.STREAM_MUSIC

第三个参数durationHint :告知系统,你要求获得音频焦点的用途,系统根据你所要求的类型来给其他监听者发出相应的焦点控制参数。有三种可选

AUDIOFOCUS_GAIN_TRANSIENT:只是短暂获得,一会就释放焦点,比如你只是想发个notification时用下一秒不到的铃声。

AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK:只是背景获得,之前的音频焦点使用者无需释放焦点给我,我将与其共同使用。

AUDIOFOCUS_GAIN:我要求完全获得焦点,其他人需要释放焦点。比如我要播放音乐了,这时就要抢占整个音频焦点。

第三步

实现音频焦点监听器OnAudioFocusChangeListener,这个监听器会根据当前音频焦点的变化,调用onAudioFocusChange(int focusChange)方法,focusChange主要有以下四种参数:

AUDIOFOCUS_AGIN:你已经完全获得了音频焦点

AUDIOFOCUS_LOSS:你会长时间的失去焦点,所以不要指望在短时间内能获得。请结束自己的相关音频工作并做好收尾工作。比如另外一个音乐播放器开始播放音乐了(前提是这个另外的音乐播放器他也实现了音频焦点的控制,baidu音乐,天天静听很遗憾的就没有实现,所以他们两个是可以跟别的播放器同时播放的)

AUDIOFOCUS_LOSS_TRANSIENT:你会短暂的失去音频焦点,你可以暂停音乐,但不要释放资源,因为你一会就可以夺回焦点并继续使用

AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:你的焦点会短暂失去,但是你可以与新的使用者共同使用音频焦点

具体示例如下:

private OnAudioFocusChangeListener mAudioFocusListener = new OnAudioFocusChangeListener(){

public void onAudioFocusChange(int focusChange) {
            switch(focusChange){
                case AudioManager.AUDIOFOCUS_LOSS:
                    if(isPlaying()){
                      //we do not need get focus back in this situation

//会长时间失去,所以告知下面的判断,获得焦点后不要自动播放
                        mPausedByTransientLossOfFocus = false;

pause();//因为会长时间失去,所以直接暂停
                    }
                    break;
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                    if(isPlaying()){
                       //短暂失去焦点,先暂停。同时将标志位置成重新获得焦点后就开始播放

mPausedByTransientLossOfFocus = true;
                        pause();
                    }
                    break;
                case AudioManager.AUDIOFOCUS_GAIN:

//重新获得焦点,且符合播放条件,开始播放
                    if(!isPlaying()&&mPausedByTransientLossOfFocus){
                        mPausedByTransientLossOfFocus = false;
                        resume();
                    }
                    break;
            }
        }};

最后

在适当的时候注销掉这个监听器比如在onDestroy()中

mAudioManager.abandonAudioFocus(mAudioFocusListener);
到此整个音频焦点的控制就完成了

讲一个自己的故事,mPausedByTransientLossOfFocus 这个参数一开始没理解有什么作用,就没写。直到发现,我的音乐播放器在我已经手动暂停的情况下,总是在我打完电话后自动播放音乐,才发现他的作用。打完电话,手机就这么一路唱着歌在我的口袋里二逼呵呵的欢乐着。自己还不知道,等再要用手机的时候发现电都被搞掉了不少,且无数人侧目看我是一个怎样的二货喜欢外放音乐.....庆幸手机里没有凤凰传奇的歌曲。

其实这个参数的作用就是可以让播放器仅仅在短暂失去音频焦点并重新获得后才开始播放音乐。而不是任何时候重新获得焦点都开始播放。

音频焦点 (audio focus)(二)相关推荐

  1. Android 音频焦点(Audio Focus)

    原址 CONTENTS 引子 音频焦点 一个简单的示例 注意: 引子 说 Audio Focus 前先说个很简单需求:来电时暂停正在播放的音乐,电话结束时恢复播放. 看到这个需求,第一反应肯定是:监听 ...

  2. android音频焦点Audio Focus

    为了便于理解,我们以android的8.0以前的版本为例,8.0以后有一定改动,但是基本思路一样. 关于管理音频焦点(8.0以前和更高版本)的官方文档:https://developer.androi ...

  3. 【安卓R 源码】获取音频焦点和释放音频焦点

    一. 获取焦点流程 1. 电话焦点只有系统可以申请,如果是电话焦点,系统会把所有多媒体和游戏的音频流实例全部mute.同理电话焦点释放会解除mute操作 2. 系统管理的焦点栈有大小限制限制为100. ...

  4. Android音频焦点处理

    概要 Android系统允许多个应用同时播放音频,这种特性有利有弊.例如当我们正在听音乐的时候突然点开了一个视频,如果我们发现音乐的声音和视频的的声音混合了在一起,这显然让我们非常不爽.而如果我们在播 ...

  5. Android音频焦点申请处理

    为了便于理解,我们以android的8.0以前的版本为例,8.0以后有一定改动,但是基本思路一样. 关于管理音频焦点(8.0以前和更高版本)的官方文档:https://developer.androi ...

  6. Android官方开发文档Training系列课程中文版:管理音频播放之管理音频焦点

    原文地址:http://android.xsoftlab.net/training/managing-audio/audio-focus.html 因为可能会存在多个APP播放音频,所以考虑它们之间的 ...

  7. android汽车音频焦点方案,管理音频焦点  |  Android 开发者  |  Android Developers

    两个或两个以上的 Android 应用可同时向同一输出流播放音频.系统会将所有音频流混合在一起.虽然这是一项出色的技术,但却会给用户带来很大的困扰.为了避免所有音乐应用同时播放,Android 引入了 ...

  8. Android音频焦点

    因为系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何交互,为了避免多个应用程序同时播放 音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音 ...

  9. 创建多媒体APP 之 音频播放:管理音频焦点

    因为很多APP都会潜在需要去播放音频文件,所有要考虑多个APP在播放音频文件的时候会产生的影响,这个非常重要.为了防止同时有多个APP播放音频,android采用了音频焦点这个概念来节制APP对音频的 ...

最新文章

  1. 大龄开发人员如何破局
  2. 一款好用的轮播插件swiper,适用于移动端和web
  3. Java中的List你真的会用吗
  4. leetcode 860. 柠檬水找零(贪心算法)
  5. 前端学习(2971):静态打包资源
  6. poj 2421 ConstructingRoads 最小生成树 Prim、Kruskal
  7. 割线法求解过程_浸入边界法求解流固耦合问题
  8. js 自动分配金额_深入解析Node.js事件循环工作机制
  9. Advanced IP Scanner - 网络扫描器
  10. ABBYY FineReader15最新免费下载安装地址激活2020注册机教程
  11. 2018 PKU_WC 长沙游 《我到长沙来看雪》
  12. java floor(),Java floor()用法及代码示例
  13. Python直角坐标系画图
  14. Kettle 9.1 下载
  15. alevel计算机教材答案,alevel计算机教材电子版及内容和目录大纲
  16. 开放机器人控制软件Orocos
  17. 元组 序列解封 元素推导式
  18. 特异性敏感性的意义_敏感性特异性和有意义的分类
  19. ABAP_ALV01-选择屏
  20. 使用opencv从mp4视频中抽帧并保存

热门文章

  1. Android产品研发(八)--App数据统计
  2. 腾讯云服务器安装mysql
  3. 3D 点云综述(深度学习篇)
  4. 微信聊天内容可以被监听吗
  5. linux 查看文件大小的命令
  6. 建模助手有什么好用的?说说你现在用的建模助手。
  7. CEVA-X16自由式编程-3-破译指令编码
  8. 纳米的尺度究竟有多大?
  9. 7-zip 7z压缩文件的时候排除指定的目录文件夹
  10. 绿色低碳节能无纸化办公,让企业发展更长远