Android官方开发文档Training系列课程中文版:管理音频播放之控制APP的音量与播放

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

引言

如果APP需要播放音频,允许用户可以控制音频的播放状态是很重要的一点。为了保证有极佳的用户体验,还有很重要的一点就是,APP需要管理音频的焦点来确保不会有多个APP同时播放音频。

在稍后的课程中,将会学习如何使APP响应物理按键的按下事件,这需要在播放音频时,请求音频的焦点,以及需要适当的响应由系统或者其它应用程序引起的音频焦点改变。

控制APP的音量以及播放状态

一个良好的用户体验是可预测的。如果APP可以播放媒体,那么用户可以通过设备上的物理按键或者虚拟按键来控制APP的音量是非常重要的一点。比如蓝牙耳机或者头戴式耳机。

同样,在适当的情况下,通过APP所使用的音频流基础之上来控制播放,停止,暂停,跳过,以及原始的媒体播放按键都应该执行其各自的行为和功能。

识别所用的音频流

创建可预测的音频体验的第一步是理解APP将使用的音频流。

Android对播放音乐、闹钟、通知以及电话铃声、系统声音、呼叫音量和DTMF铃声都维护了单独的音频流。这么做主要是允许用户可以控制每个流各自的音频。

大部分流都会受限于系统事件,所以除非APP是个闹钟应用,否则,几乎可以确定APP播放音频所使用的就是STREAM_MUSIC流。

使用物理按键控制APP声音的音量

默认情况下,按下音量键会修改当前正在活动的音频流的音量。如果APP当前没有播放任何东西,按下音量键只会调整铃声的音量。

如果正在使用一款游戏APP或者音乐APP,那么当用户按下音量键的时候调整音量是极好的,因为用户想要控制游戏或者音乐的音量,即使现在在两首歌之间或者当前的游戏界面上没有播放音乐。

你可能想试着监听音量按键的按下事件,然后修改音频流的音量。忍住这股冲动吧。Android提供了更方便的setVolumeControlStream()方法来让音量键直接用于到你所指定的音频流。

如果已经确认使用的音频流类型,你应该将其设置为音量流的目标。你应该确保这个调用在APP的生命周期之前,因为只需要在Activity的生命周期中调用一次,你应该在具有代表性的方法中调用它,比如onCreate()方法。这可以确保每当APP处于可见状态时,音量控制功能可用更符合用户的期望。

setVolumeControlStream(AudioManager.STREAM_MUSIC);

从这点往后,每当目标activity或者fragment可见时,按下设备上的音量键会影响你所指定的音频流(在这个例子中是”音乐”)。

使用物理播放控制键来控制APP的音频播放

媒体播放按钮,如播放、暂停、停止、跳跃,和以前的一些手机和许多有线连接或无线连接的耳机。当用户按下了其中的某个键时,系统会广播一个ACTION_MEDIA_BUTTON行为的意图。

为了响应媒体按钮的点击事件,你需要在清单文件中注册一个BroadcastReceiver,以便监听这个广播行为:

<receiver android:name=".RemoteControlReceiver"><intent-filter><action android:name="android.intent.action.MEDIA_BUTTON" /></intent-filter>
</receiver>

接收器的实现需要提取出哪一个键被按下而引起的广播。Intent会包含EXTRA_KEY_EVENT这个依据,类KeyEvent中包含了一列以KEYCODE_MEDIA_*开头的静态常量,这些静态常量代表了每个按下的媒体键,比如:KEYCODE_MEDIA_PLAY_PAUSE及KEYCODE_MEDIA_NEXT。

下面这段代码展示了如何抽取媒体键的按下事件以及来影响媒体的播放:

public class RemoteControlReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())) {KeyEvent event = (KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT);if (KeyEvent.KEYCODE_MEDIA_PLAY == event.getKeyCode()) {// Handle key press.}}}
}

因为可能存在多个程序想要监听媒体按钮的按下事件,所以APP应该接收媒体按钮按下事件时,你还必须通过编程来进行动态的控制。

下面的代码可以直接应用到APP中去,它可以通过AudioManager来注册与解注媒体按钮事件接收器。当被注册后,广播接收器会专门接收所有的媒体按钮广播。

AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...
// Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

从通常情况上讲,APP应该在不活动时或者不可见时解注其它的接收器(比如onStop()回调方法)。然而,对媒体播放APP来说没有那么简单,实际上,当程序不可见以及不能够屏幕上的UI来控制媒体播放时,这时,通过广播响应媒体播放按钮事件就非常重要了。

更进一步的方法就是当程序获取或者失去音频焦点时注册或者解注媒体按钮事件接收器。这些知识将会在下节课详细讨论。

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

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

相关文章

LeetCode 1038. 从二叉搜索树到更大和树(逆中序-右根左-降序)

1. 题目 2. 解题 二叉搜索树 逆中序遍历&#xff08;右根左&#xff09;是降序的 class Solution { public:TreeNode* bstToGst(TreeNode* root) {stack<TreeNode*> stk;int sum 0;TreeNode *rootcopy root;while(root || !stk.empty()) {while(root){stk.push(root);…

Inode 导致 电脑的网络适配器和访问点出现问题

1 电脑好好的&#xff0c;由于项目原因需要安装inode去访问外网的数据集。安装好inode没有什么问题&#xff0c;网络依然可以用。然后不小心重启了一下电脑&#xff0c;发现电脑所有的网络均不正常。网络诊断是电脑的适配器和访问点出现故障。根据网络上的解决方案&#xff0c;…

应用实践 | 南方科技大学研发基于新型冠状病毒知识图谱模式挖掘系统

本文转载自公众号&#xff1a;南方科技大学计算机科学与工程系。随着新型冠状病毒疫情的不断发展&#xff0c;有关疫情的各类信息也在不断更新&#xff0c;如何利用知识图谱从大量新型冠状病毒肺炎信息中高效挖掘相关频繁模式&#xff08;如病毒的宿主、传播途径&#xff09;成…

java.lang.NoClassDefFoundError: * : Landroid/support/v7/gridlayout/R$styleable 异常终极解决办法

该问题解决办法适用于任何类似问题。 问题的标准异常描述为&#xff1a;java.lang.NoClassDefFoundError: Failed resolution of: Landroid/support/v7/gridlayout/R$styleable 今天由于项目需要&#xff0c;想在项目中使用GridLayout&#xff0c;无奈&#xff0c;标准库中的…

训练一个130亿参数的模型要用几个GPU?微软:一个就够

文&#xff5c;蛋酱、张倩源&#xff5c;机器之心现在的模型动辄数百、数千亿参数&#xff0c;普通人训不动怎么办&#xff1f;前不久&#xff0c;谷歌发布了参数量为 1.6 万亿的语言模型Swith Transformer&#xff0c;将 GPT-3 创下的参数量记录&#xff08;1750 亿&#xff0…

技术年货:美团技术沙龙合辑大放送——85个演讲,70+小时视频

你好&#xff0c;2019 再见&#xff0c;2018 又到了一年辞旧迎新的时候&#xff0c;大家应该也和美美一样&#xff0c;在忙着总结回顾和展望规划吧。 按老惯例&#xff0c;我们该献上技术年货了。今年首先出场的&#xff0c;是我们的技术沙龙大套餐&#xff01; 美团技术沙龙是…

LeetCode 442. 数组中重复的数据

1. 题目 给定一个整数数组 a&#xff0c;其中1 ≤ a[i] ≤ n &#xff08;n为数组长度&#xff09;, 其中有些元素出现两次而其他元素出现一次。 找到所有出现两次的元素。 你可以不用到任何额外空间并在O(n)时间复杂度内解决这个问题吗&#xff1f; 示例&#xff1a;输入:…

如何恢复在 PyCharm 中误删的整个项目文件

如何恢复在 PyCharm 中误删的整个项目文件 方案1: 在误删项目的原始文件地址下新建相同文件名的空文件夹,即新文件夹与被误删项目的路径相同. 在 PyCharm 中打开该新文件夹,右键文件夹,点击 Local History 下的 Show History. 页面左侧为删除的文件信息(时间等),点击文件名右…

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

原文地址&#xff1a;http://android.xsoftlab.net/training/managing-audio/audio-focus.html 因为可能会存在多个APP播放音频&#xff0c;所以考虑它们之间的交互方式是一件很重要的事情。为了避免多个音乐播放器APP在同一时间播放音乐&#xff0c;Android使用了音频焦点的方…

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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;谈谈工业界搜索、推荐、广告这类核心场景中落地能…