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

在你的APP播放音频之前,你的APP必须首先请求和获取音频焦点。同样的,要知道如何监听音频焦点的失去,以及做出相应的动作。

请求音频焦点

在你的APP播放音频之前,首先要获取到你要使用的播放流的音频焦点。利用requestAudioFocus()来获取这个音频焦点,当这个函数返回AUDIOFOCUS_REQUEST_GRANTED时候,表示请求音频焦点成功。

你必须指明你要使用的音频流,是否是需要短暂音频焦点或者是要长时间保持音频焦点。请求短暂的音频焦点,表示你只播放很短时间的音频文件。请求一个长久的音焦点,如的当你要播放一个可预期长度的歌曲。

下面的代码片段就是请求了一个长久的音频焦点,使用的是music音频播放流。在直接播放之前,如用户按下播放按钮或者是游戏的背景音乐切换到下一个之前,首先我们要获取这个播放流的焦点。

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,// Use the music stream.AudioManager.STREAM_MUSIC,// Request permanent focus.AudioManager.AUDIOFOCUS_GAIN);if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);// Start playback.
}

一旦播放完成,请保证调用abandonAudioFocus()。这个函数会通知系统你的APP不再需要音频焦点,同时注销了和AudioManager.OnAudioFocusChangeListener的联系,不在监听焦点的变化。

下面的例子就是如何释放一个短暂的音频焦点,这个代码可以让任何APP停止音频的播放。

// Abandon audio focus when playback complete
am.abandonAudioFocus(afChangeListener);

当请求短暂的音频焦点的时候,有另外一个选项是,你APP是不是想要”ducking“这个特性,一般来说,一个好的音频播放APP会在它的播放为静音的时候就会释放掉这个焦点。你的APP获取到一个短暂的音频焦点的时候,这个音频焦点的获取会允许其他的APP继续播放他们的音频,只是其他APP播放音频的声音会降低,直到焦点重新被它们获取。如下:

// Request audio focus for playback
int result = am.requestAudioFocus(afChangeListener,// Use the music stream.AudioManager.STREAM_MUSIC,// Request permanent focus.AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK);if (result == AudioManager.AUDIOFOCUS_REQUEST_GRANTED) {// Start playback.
}

“ducking”这种音频焦点,特别适合于那些间歇性的播放短暂的音频的APP,如导航语言播报

不管是否是用上面的方式获取音频焦点,在你的请求音频焦点的时候注册的那个焦点监听函数里面,只会返回短暂和长久这2种音频焦点的监听,你不需要去区分是不是“ducking”。

处理失去音频焦点的情况

你的APP可以获取焦点,那就意味着别的APP也可以获取焦点,那么会导致你的APP失去焦点。你的APP会如何对失去焦点做处理,完全取决于你对失去焦点的管理动作。

onAudioFocusChange()这个函数,是你在请求音频焦点的时候注册的用来监听焦点变化的函数,当你请求的叫的时候会接收到一个描述焦点变化的变量。特别说明的是,接收到的失去焦点的事件都是对应着前面你请求时候的焦点,如长久焦点失去,短暂焦点失去,短暂的ducking焦点失去。一般来说,一个短暂的音频焦点丢失,会导致你的APP的音频播放进入静音模式,但是也有可能是保持原状。你要继续监听这个这个音频焦点的变化,当重新获取到的时候,要去恢复音频的播放。

如果失去的音频焦点是一个长久焦点,假定另外一个APP开始监听使用这个焦点,那么你的APP要正确有效的结束自己的音频播放。在实际的操作中,就是停止播放,移除音频按钮的监听,让新的音频播放器去使用这些操作事件,移除你的音频焦点。之后,如果用户在你的APP上面点击了播放,在你播放音频之前,要重新请求重新获取焦点。

下面的代码片段中,在失去短暂焦点的时候,我们停止播放音频,在重新获取的时候,再次播放。

OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {public void onAudioFocusChange(int focusChange) {if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT// Pause playback} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {// Resume playback } else if (focusChange == AudioManager.AUDIOFOCUS_LOSS) {am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);am.abandonAudioFocus(afChangeListener);// Stop playback}}
};

当失去一个”ducking”类型的短暂音频焦点的时候,相比于上面暂停,可以使用“duck”操作来代替。

Duck!

ducking操作就是降低你的音频播放声音,从而让其他的APP可以简单的获取到音频播放焦点,但是又不中断你的APP的音频播放。下面的代码片段就是失去焦点的时候适当的降低我们的音频播放声音,在得到焦点的时候,再恢复。

OnAudioFocusChangeListener afChangeListener = new OnAudioFocusChangeListener() {public void onAudioFocusChange(int focusChange) {if (focusChange == AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK) {// Lower the volume} else if (focusChange == AudioManager.AUDIOFOCUS_GAIN) {// Raise it back to normal}}
};

失去焦点的广播是最重要的一个,但不仅仅就这一种广播。在用户对音频操作的时候,系统会广播一系列的广播来表示这个变化。下一节我们会讲如何监听这些变化,达到更好的用户体验。

创建多媒体APP 之 音频播放:管理音频焦点相关推荐

  1. html的音频播放,HTML5 音频播放 audio

    众所周知,在HTML5诞生之前网页上要播放一段视频基本都是依靠flash插件,而HTML5诞生了和标签,使得在HTML5上播放视频或者音频就像显示图片那么轻松 如果我们现在不需要使用浏览器内部的aud ...

  2. ios+html+音频播放,iOS音频篇:使用AVPlayer播放网络音乐

    2018-11-13更新:已更新工程配置和修改部分代码,Xcode9能直接运行此项目了.但由于项目中使用的豆瓣API已经停止支持,所以项目已不能正常演示,是否会继续更新就看缘分嘞 _... 引言 假如 ...

  3. Android官方开发文档Training系列课程中文版:管理音频播放之音频输出硬件的处理

    原文地址:http://android.xsoftlab.net/training/managing-audio/audio-output.html 当用户使用Android设备享受音频时,它有多重的 ...

  4. vue自定义音频播放组件_易于创建Vue的自定义音频播放器组件

    vue自定义音频播放组件 音频更好 (vue-audio-better) Easy to create custom audio player components for Vue.js. 易于为Vu ...

  5. 流媒体开发(一)音频播放

    序言 随着人们学习.娱乐和工作的需要,人们对如何在网络上传输海量的视频.音频等多媒体信息有了进一步的要求.在这种背景下,iOS流媒体技术应运而生.通俗的讲,所谓的iOS流媒体技术,就是将视音频文件经过 ...

  6. Android直播开发之旅(13):使用FFmpeg+OpenSL ES播放PCM音频

    文章目录 1. OpenSL ES原理 1.1 OpenSL ES核心API讲解 1.1.1 对象(Object)与接口(Interface) 1.1.2 [OpenSL ES的状态机制](https ...

  7. 安卓接收耳机按键控制音频播放

    全栈工程师开发手册 (作者:栾鹏) 安卓教程全解 如今连接移动设备的耳机上基本都有按键,来控制音频的播放,暂停,下一首,上一首,或电话的拨打,视频的播放等功能.而外置媒体按键的按下,安卓系统接收到这个 ...

  8. FFmpeg从入门到入魔(4):OpenSL ES播放PCM音频

    1. OpenSL ES原理  OpenSL ES(Open Sound Library for Embedded Systems),即嵌入式音频加速标准,是一个无授权费.跨平台.针对嵌入式系统精心优 ...

  9. iOS 9音频应用播放音频之ios9音频基本功能

    iOS 9音频应用播放音频之ios9音频基本功能 在iOS 9音频应用开发中最为简单和常用的就是AVFoundation框架中的AVAudioPlayer类.虽然AVAudioPlayer类不能播放网 ...

最新文章

  1. linux成长笔录——week_1
  2. 风控评分模型全流程的开发及应用
  3. 【完结】AI1000问以后知识星球和B站见啦
  4. 一个基于xml的超级orm框架-世界是由懒人创造的。
  5. Win7 x64 PL/SQL 连接 Oralce 提示 Could not initialize %ORACLE_HOME%\bin\oci.dll
  6. 图论 —— k 短路
  7. AAAI 2021中的目标检测(详细版with code)
  8. 通过js适配不同的屏幕大小
  9. C#中ToString()格式详解
  10. 也说说angularJs里的evalAsync
  11. 计算机数据结构图知识点,2011考研计算机数据结构复习重点解析:图的应用
  12. Matlab Coder将m文件转换成C/C++
  13. 简单实用计划提醒便签软件 界面简洁功能一目了然
  14. cns服务搭建+手机ml,百度直连
  15. INSTALL_FAILED_NO_MATCHING_ABIS 的解决办法
  16. 输入某年某月某日,判断这一天是这一年的第几天?考虑闰年的情况
  17. 中文乱码与字体库windows
  18. ar面部识别_苹果现场演示四款 AR 内容,iPhone X 面部识别效果惊艳
  19. 弧齿锥齿轮零件图_弧齿锥齿轮加工原理
  20. Resteasy ,从学会使用到了解原理

热门文章

  1. VMware宿主机与虚拟机之间的文件夹相互共享(看图操作)
  2. 英特尔、高通等多家科技巨头禁止员工与华为交流!
  3. 电容笔和触控笔的区别是什么?好用的电容笔测评
  4. 5G商用价值到底在哪里,可以赋予哪些能力?
  5. Warshall‘s algorithm 算法的实现及优化
  6. WiFi DFS(动态频率选择)
  7. springboot:实现文件上传下载实时进度条功能【附带源码】
  8. 树的搜索问题1(深度优先、广度优先,爬山法和best-first)
  9. 什么叫单模光纤_什么是OS1,OS2的单模光纤
  10. 人参果水果宣传文案模版,水果店文案人参果