【Android Developers Training】 44. 控制你应用的音量和播放
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好。
原文链接:http://developer.android.com/training/managing-audio/volume-playback.html
一个良好的用户体验是一种可预测的。如果你的应用播放多媒体,那么很重要的一点就是你的用户可以通过他们设备上的(蓝牙耳机,耳机等等)硬件或软件音量控制方法,来调整应用的音量。
一). 确定使用的是什么媒体流
要创建一个可预测的音频体验,第一步是要明确你的应用要使用什么音频流。
Android系统中,对于播放音乐,闹铃,通知,来电铃声,系统提示音,按键音等都分别对应不同的音频流。这样做的目的主要是可以让用户分别对不同的音频流控制其音量。
大多数的这些音频流被限制为系统级事件,所以除非你的应用替代了闹铃,你才能使用STREAM_MUSIC流来播放你的音频。
二). 使用硬件音量键来控制你的应用音频音量
默认的,按下音量控制键会修改当前激活的音频流的音量。如果你的应用现在没有播放任何东西,那么按下音量键将会调整铃声音量。
如果你有一个游戏或者音乐音乐,那么当用户希望修改游戏或音乐的音量时,按下音量控制键是有效的,甚至用户现在处于两个音乐播放之间的间隔,或者在当前的游戏所处位置没有音乐在播放。
你可能很渴望尝试监听音量键按下的事件,并且通过这种方式来修改你的音频流的音量。放弃这种复杂的想法吧,Android提供了setVolumeControlStream()这个方法来直接调整你制定的音频流的音量。
确定了你的应用要使用的音频流之后,你应该将它设置为当前音量流目标。你应该在你应用生命周期的早期调用响应的方法,因为你只需要在Activity整个生命周期中调用它一次,你应该在控制你的媒体的Activity或者Fragment的onCreate()方法中调用它。这样可以保证不管你的应用当前是否是可见的,音量控制表现的将会与用户期望的一致。
setVolumeControlStream(AudioManager.STREAM_MUSIC);
从现在开始,按下设备的音量键将会影响你特定的音频流(此例中为“music”),不管目标activity或fragment是否是可见的。
三). 使用硬件的播放控制键老控制你的应用的音频播放
媒体播放按钮,比如播放、暂停、停止、跳过、回放键在一些手持设备或其他有限设备上面还是有的。当用户按下一个或其他这类硬件按键时,系统会广播一个具有ACTION_MEDIA_BUTTON行为的intent。
要响应媒体按钮的点击事件,你需要在你的清单文件中注册一个广播接收器(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 {
@Override
public 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.
}
}
}
}
因为大多数应用可能希望监听多媒体按键按下的事件,当你的应用希望接收媒体按键按下的事件时,你也必须从代码上控制多媒体。
下面的代码通过使用AudioManager来注册或者注销你的媒体按键事件接收器,这可以用在你的应用中。当注册了以后,你的广播接收器将会是唯一的,监听所有的媒体按钮广播的接收器:
AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE);
... // Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
... // Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);
通常情况下,应用应该在他们变成非激活状态或不可见时(比如在onStop()回调函数阶段),注销他们的接收器。然而,对于播放应用来说,事情没有那么简单。事实上,因为当你的应用不可见或者不能在当前屏幕的UI界面被控制,时还能响应媒体按键的事件时很重要的。
一个更好的方法是在你的应用获取和丢失音频焦点时,注册或注销媒体按钮事件接收器。
【Android Developers Training】 44. 控制你应用的音量和播放的更多相关文章
- 【Android Developers Training】 43. 序言:管理音频播放
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 50. 控制相机
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 45. 控制音频焦点
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 108. 使用模拟定位进行测试
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 105. 显示一个位置地址
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 104. 接受地点更新
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 101. 显示快速联系人挂件(Quick Contact Badge)
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 98. 获取联系人列表
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
- 【Android Developers Training】 96. 运行一个同步适配器
注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...
随机推荐
- 转:Redis配置文件详解
配置与特性详解 1. 在redis中,合法的"尺寸单位",无大小写区分. # 1k => bytes # 1kb => bytes # 1m => bytes # ...
- JDBC进阶
PreparedStatement的使用: conn = DriverManager.getConnection("jdbc:mysql://localhost/mydata?" ...
- .Net程序员学用Oracle系列(8):触发器、作业、序列、连接
1.触发器 2.作业 2.1.作业调度功能和应用 2.2.通过 DBMS_JOB 来调度作业 3.序列 3.1.创建序列 3.2.使用序列 & 删除序列 4.连接 4.1.创建连接 4.2.使 ...
- python+unittest框架整理(一点点学习前辈们的封装思路,一点点成长。。。)
预期框架整理目标: 1.单个用例维护在单个.py文件中可单个执行,也可批量生成组件批量执行 2.对定位参数,定位方法,业务功能脚本,用例脚本,用例批量执行脚本,常用常量进行分层独立,各自维护在单独的. ...
- JVM学习笔记三:垃圾收集器与内存分配策略
内存回收与分配重点关注的是堆内存和方法区内存(程序计数器占用小,虚拟机栈和本地方法栈随线程有相同的生命周期). 一.判断对象是否存活? 1. 引用计数算法 优势:实现简单,效率高. 致命缺陷:无法解决 ...
- 关于微信小程序拒绝授权后,重新授权并获取用户信息
最近公司做了一些有关微信小程序的项目,涉及到授权获取用户基本信息,但是在拒绝授权之后就不会再出现授权窗口: 看网上也有很多人遇到了同样的问题,所以记录下来我的处理方法,供大家和自己学习和记录: 当调用 ...
- asp.net MVC 网站图片防盗链的几种方法
目录 1. 通过 URL Rewrite Module 组件 2. 通过 nginx 图片防盗链 3.自定义 HttpHandler 处理 4. 通过 MVC 自定义路由规则防盗链 5. 通过 MVC ...
- IE低版本兼容的感悟
2017-04-09 曾经折磨一代人的兼容问题,如今也在同样折磨着我们,明明可以做JS判断来避免对ie低版本的兼容,但是却还是耐心的做着兼容,你可能会问这是为什么, 我们调的不是兼容,是整整一代人的情 ...
- Log4j2分析与实践
当前网络上关于Log4j2的中文文章比较零散,这里整理了一下关于Log4j2比较全面的一些文章,供广大技术人员参考 Log4j2分析与实践-认识Log4j2 Log4j2分析与实践-架构 Log4j2 ...
- javaCV开发详解之6:本地音频(话筒设备)和视频(摄像头)抓取、混合并推送(录制)到服务器(本地)
javaCV系列文章: javacv开发详解之1:调用本机摄像头视频 javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG.j ...