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

原文地址:http://android.xsoftlab.net/training/managing-audio/audio-focus.html

因为可能会存在多个APP播放音频,所以考虑它们之间的交互方式是一件很重要的事情。为了避免多个音乐播放器APP在同一时间播放音乐,Android使用了音频焦点的方式来管理音频的播放,只有获取了音频焦点的APP才可以播放音频。

在APP开始播放音频之前,APP需要请求以及接收音频的焦点。同样的,APP还应该知道如何监听音频焦点的丢失事件,以及当事件发生的时候,如何恰当的作出响应。

请求音频焦点

在APP播放音频之前,APP应该对使用的音频流持有音频焦点。可以使用 requestAudioFocus() 方法来获取焦点,如果请求成功的话,它会返回 AUDIOFOCUS_REQUEST_GRANTED 。

你必须指定你所使用的音频流,并且还需要请求短暂的音频焦点,或者永久的音频焦点。当你想要播放一个短暂的音频时可以请求短暂的音频焦点(举例:当播放导航声音时)。当需要播放一个长时间的音频时,就需要请求永久的音频焦点(举例,播放音乐)。

下面的代码展示了对音乐音频流上请求了永久的音频焦点。你应该在开始播放之前立即请求音频焦点,比如当用户按下了播放按钮或者游戏中下节背景音乐开始之前。

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.registerMediaButtonEventReceiver(RemoteControlReceiver);// Start playback.
}

一旦APP结束了播放,应该确保调用了abandonAudioFocus()方法。这会通知到系统你不再需要请求焦点,以及它会解注与之关联的AudioManager.OnAudioFocusChangeListener回调接口。在丢弃短暂焦点的例子中,它允许任何被中止的APP可以继续播放音频。

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

当请求短暂的音频焦点时,有一些附加选项:无论你是否想要正常开启”ducking”选项,当一个友好的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.
}

闪避对间歇性的音频流APP来说特别适合,比如导航方向的播报信息。

当其它APP如上面描述的那样请求音频焦点时,它可以在永久的音频焦点或者短暂的音频焦点之间选择,这两个焦点会由请求焦点时注册的监听回调方法回调回来。

处理音频焦点的丢失

如果APP可以请求到音频焦点,那么接下来在其它APP请求焦点的时候,它就可能会失去那个焦点。APP如何响应焦点的丢失,取决于丢失的方式。

音频焦点改变接口的回调方法onAudioFocusChange()会接收一个参数,这个参数用于描述焦点改变事件。特别的,焦点的丢失事件可能与原先部分请求的焦点类型相对应–永久丢失,短暂丢失以及短暂的限制性闪避。

通常来说,音频焦点的短暂丢失应该致使APP的音频流静音。否则就应该保持相同的状态。你应该继续监视音频焦点的改变,以便当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}}
};

当闪避在允许的时候短暂的失去了音频焦点,不应该是暂停播放,而是”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}}
};

音频焦点的丢失是由大多数重要的广播影响的,但是不单单只是有它引起的。系统会广播一系列的意图来使你留意用户的听觉体验。下节课会演示如何监视音频焦点来增进用户的整体体验。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/479191.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

征稿 | ​2020年全国知识图谱与语义计算大会

China Conference on Knowledge Graph and Semantic Computing(CCKS 2020)www.sigkg.cn/ccks2020征稿启事(第二轮)2020年8月15日-18日,南昌征稿截止: 2020年5月21日第十四届全国知识图谱与语义计算大会(CCKS: China Conference o…

新手福利:百度官方中文教程,过年也要深度学习!

很多小伙伴在后台给我留言,零基础如何入门深度学习?想要做算法工程师,自学了python基础,现在还来得及吗?这个问题很大。很难说一篇文章几句话就能解决这个问题。今天我给大家说一下自己的一些个人经验,比较…

LeetCode 232. 用栈实现队列(双栈法-队列)

1. 题目 使用栈实现队列的下列操作: push(x) – 将一个元素放入队列的尾部。 pop() – 从队列首部移除元素。 peek() – 返回队列首部的元素。 empty() – 返回队列是否为空。 来源:力扣(LeetCode) 链接:https://le…

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

原文地址:http://android.xsoftlab.net/training/managing-audio/audio-output.html 当用户使用Android设备享受音频时,它有多重的可选择替代方案。大多数的设备内置了一套音频系统:扬声器以及有线耳机的耳机插孔,也有很多功能蓝…

pytorch-pretrained-bert的模型下载慢的问题

原文地址:https://blog.csdn.net/w5688414/article/details/103666409 今天需要用到pytorch-pretained-bert,但是下载预训练的模型花费了好长时间,这里来分享以下解决方法,其安装过程为: pip install pytorch-pretrain…

论文浅尝 | Tree-to-sequence 学习知识问答

论文笔记整理:谭亦鸣,东南大学博士生,研究兴趣:知识图谱问答。来源:Neurocomputing 372: 64-72 (2020)链接:https://sciencedirect.xilesou.top/science/article/abs/pii/S0925231219312639对于知识图谱问答…

别再搞纯文本了!多模文档理解更被时代需要!

文 | Ryan都已经2021年了,互联网已经今非昔比,20年前纯文本的日子已经一去不复返,文字已经满足不了网页、文章的需求,绝大部分都会有着精心设计的表格、图片,甚至视频。PDF文档这种富文本格式拥有更加复杂的结构信息&a…

iOS 覆盖率检测原理与增量代码测试覆盖率工具实现

背景 对苹果开发者而言,由于平台审核周期较长,客户端代码导致的线上问题影响时间往往比较久。如果在开发、测试阶段能够提前暴露问题,就有助于避免线上事故的发生。代码覆盖率检测正是帮助开发、测试同学提前发现问题,保证代码质量…

LeetCode 199. 二叉树的右视图(DFS 按层queue)

文章目录1. 题目2. 解题2.1 DFS2.2 queue按层从右边遍历1. 题目 给定一棵二叉树&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例:输入: [1,2,3,null,5,null,4] 输出: [1, 3, 4] 解释:1 <--…

Android官方开发文档Training系列课程中文版:调用相机之简单拍照

原文地址&#xff1a;http://android.xsoftlab.net/training/camera/index.html 导言 在富媒体开始流行之前&#xff0c;整个世界是一个灰暗且平淡无奇的地方。还记得Gopher吗&#xff1f;我或许不记得了。自从APP成为用户生活的一部分之后&#xff0c;这便给他们提供了一种方…

谈谈工业界落地能力最强的机器学习算法

尽管BERT为代表的预训练模型大肆流行&#xff0c;但是身处工业界才会知道它落地有多难&#xff0c;尤其是QPS动辄几百的在线推荐、搜索系统&#xff0c;哪怕在大厂也很难在线上系统见到它们。 今天就想反其道而行之&#xff0c;谈谈工业界搜索、推荐、广告这类核心场景中落地能…

论文浅尝 | 中科院百度微软等学者最新综述论文40+最新方法阐述知识图谱提升推荐系统准确性与可解释性...

本文转载自公众号&#xff1a;先知。【导读】近来&#xff0c;知识图谱用于推荐系统是关注的焦点&#xff0c;能够提升推荐系统的准确性与可解释性。如何将知识图谱融入到推荐系统呢? 最近中科院计算所百度微软等学者最新综述论文《A Survey on Knowledge Graph-Based Recomm…

美团酒旅起源数据治理平台的建设与实践

背景 作为一家高度数字化和技术驱动的公司&#xff0c;美团非常重视数据价值的挖掘。在公司日常运行中&#xff0c;通过各种数据分析挖掘手段&#xff0c;为公司发展决策和业务开展提供数据支持。 经过多年的发展&#xff0c;美团酒旅内部形成了一套完整的解决方案&#xff0c;…

LeetCode 1103. 分糖果 II

1. 题目 排排坐&#xff0c;分糖果。 我们买了一些糖果 candies&#xff0c;打算把它们分给排好队的 n num_people 个小朋友。 给第一个小朋友 1 颗糖果&#xff0c;第二个小朋友 2 颗&#xff0c;依此类推&#xff0c;直到给最后一个小朋友 n 颗糖果。 然后&#xff0c;我…

计算广告与推荐系统有哪些区别?

文 | King James本文已获作者授权&#xff0c;禁止二次转载计算广告和推荐系统总感觉有千丝万缕的关系&#xff0c;但是它们之间又有什么异同呢&#xff1f;话不多说&#xff0c;上图&#xff01;计算广告和推荐系统有交集&#xff0c;但是不能说推荐系统是计算广告的一部分。因…

Android官方开发文档Training系列课程中文版:调用相机之简单摄像

原文地址&#xff1a;http://android.xsoftlab.net/training/camera/videobasics.html 这节课解释了如何通过已有的相机应用拍摄视频。 假设你的程序含有摄像功能&#xff0c;但是它只是程序很小的一部分功能&#xff0c;你并不想在这么小的功能上花费很大的精力。幸运的是&a…

解决cuda版本与pytorch版本不兼容问题

解决PyTorch与CUDA版本不匹配&#xff1a; 2 pytorch官网查看安装命令 https://pytorch.org/get-started/locally/ 如果你发现你的版本与上面的都不符合&#xff0c;可以点击 进入以前版本页面&#xff1a;https://pytorch.org/get-started/previous-versions/的安装命令&am…

论文浅尝 | 重新实验评估知识图谱补全方法

论文作者&#xff1a;Farahnaz Akrami&#xff0c;美国德州大学阿灵顿分校&#xff0c;博士生。笔记整理&#xff1a;南京大学&#xff0c;张清恒&#xff0c;硕士生。链接&#xff1a;https://arxiv.org/pdf/2003.08001.pdf代码&#xff1a;https://github.com/idirlab/kgcomp…

Android组件化方案及组件消息总线modular-event实战

背景 组件化作为Android客户端技术的一个重要分支&#xff0c;近年来一直是业界积极探索和实践的方向。美团内部各个Android开发团队也在尝试和实践不同的组件化方案&#xff0c;并且在组件化通信框架上也有很多高质量的产出。最近&#xff0c;我们团队对美团零售收银和美团轻收…

Android官方开发文档Training系列课程中文版:调用相机之控制相机

原文地址&#xff1a;http://android.xsoftlab.net/training/camera/cameradirect.html 在这节课&#xff0c;我们会讨论如何使用Android框架API来直接控制相机硬件。 直接控制设备的相机拍照或者摄像的代码远比通过其他相机应用来完成要多得多。然而&#xff0c;如果你想构建…