【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 ...
随机推荐
- Java 通过先序后序序列生成二叉树
题目 二叉树的前序以及后续序列,以空格间隔每个元素,重构二叉树,最后输出二叉树的三种遍历方式的序列以验证. 输入: 1 2 3 4 5 6 7 8 9 10 3 2 5 4 1 7 8 6 10 9 ...
- Java8新特性-Lambda表达式
1. 什么是Lambda表达式? Lambda表达式就是可以把函数作为参数传递,或者说把代码作为数据传递给函数. 2. Lambda表达式的语法格式 基本语法格式如下: 基本语法下多个变体的说明: ...
- NancyFx 2.0的开源框架的使用-AspnetBootstrapping
新建一个空的Web项目AspnetBootstrappingDemo 然后添加NuGet组件 Nancy Nancy.Hosting.Aspnet Nancy.ViewEngines.Razor 继续 ...
- docker安装hadoop集群
docker安装hadoop集群?图啥呢?不图啥,就是图好玩.本篇博客主要是来教大家如何搭建一个docker的hadoop集群.不要问 为什么我要做这么无聊的事情,答案你也许知道,因为没有女票.... ...
- AngularJS操作DOM——angular.element
addClass()-为每个匹配的元素添加指定的样式类名 after()-在匹配元素集合中的每个元素后面插入参数所指定的内容,作为其兄弟节点 append()-在每个匹配元素里面的末尾处插入参数内容a ...
- 为什么字符串会有length属性-JS中包装对象
任何原始类型的数据 (primitive type) 比如 String类型的字符串 "abcd" "abcd" 是原始类型的数据 但是 当他调用 le ...
- Java基础知识二次学习--第七章 容器
第七章 容器 时间:2017年4月27日15:08:30 章节:07章01节~07章04节 视频长度:20:21 +12:38 +3:55 +2:57 内容:容器API 心得: Java API ...
- Linux服务器的远程IP限制
系统环境: Linux-centOS+ubuntu 操作: 编辑允许通过IP 路径:vim /etc/hosts.allow sshd:192.168.1.1 编辑禁止通过IP 路径:vim /etc ...
- Linux环境下配置JDK,java环境
1.查看Linux自带的JDK是否已安装 # java -version 2. 查看JDK信息 # rpm -qa | grep java 显示: java-x.x.x-gcj-compat-x.x. ...
- 开涛spring3(6.6) - AOP 之 6.6 通知参数
前边章节已经介绍了声明通知,但如果想获取被被通知方法参数并传递给通知方法,该如何实现呢?接下来我们将介绍两种获取通知参数的方式. 使用JoinPoint获取:Spring AOP提供使用org.asp ...