注:本文翻译自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. 控制你应用的音量和播放的更多相关文章

  1. 【Android Developers Training】 43. 序言:管理音频播放

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  2. 【Android Developers Training】 50. 控制相机

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  3. 【Android Developers Training】 45. 控制音频焦点

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  4. 【Android Developers Training】 108. 使用模拟定位进行测试

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  5. 【Android Developers Training】 105. 显示一个位置地址

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  6. 【Android Developers Training】 104. 接受地点更新

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  7. 【Android Developers Training】 101. 显示快速联系人挂件(Quick Contact Badge)

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  8. 【Android Developers Training】 98. 获取联系人列表

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

  9. 【Android Developers Training】 96. 运行一个同步适配器

    注:本文翻译自Google官方的Android Developers Training文档,译者技术一般,由于喜爱安卓而产生了翻译的念头,纯属个人兴趣爱好. 原文链接:http://developer ...

随机推荐

  1. RabbitMQ学习3----运行和管理RabbitMQ

    1.服务为管理 Erlang天生就是为了让应用程序无需知道对方是否存在同一台机器上即可互相通信. Erlang节点:Erlang虚拟机的每个实例.多个Erlang应用程序可以运行在同一个节点之上.节点 ...

  2. 数组的重排序方法reverse()和sort()

    js数组中存在两个可以直接用来重排序的方法:reverse()和sort(). reverse()方法比较简单,直接反转数组项的顺序: var arr = [1, 3, 2, 4, 5]; arr.r ...

  3. VR全景智慧城市-VR大时代

    这是一个创业的时代,这是一个创新的社会,我们的国家从没有像今天这样高度重视创业创新,我们的社会从没有像今天这样对创业创新寄予如此厚望.李克强总理在2015年政府工作报告中指出:要把"大众创业 ...

  4. 【JS中循环嵌套常见的六大经典例题+六大图形题,你知道哪几个?】

    首先,了解一下循环嵌套的特点:外层循环转一次,内层循环转一圈. 在上一篇随笔中详细介绍了JS中的分支结构和循环结构,我们来简单的回顾一下For循环结构: 1.for循环有三个表达式,分别为: ①定义循 ...

  5. React源码学习——ReactClass

    前言 之前一直在使用react做开发,但是对其内部的工作机制却一点儿都不了解,说白了就是一直在套api,毫无成就感.趁最近比较闲,对源码做了一番研究,并通过博客的方式做一些记录. 进入正题 通过编写自 ...

  6. Fitting Bayesian Linear Mixed Models for continuous and binary data using Stan: A quick tutorial

    I want to give a quick tutorial on fitting Linear Mixed Models (hierarchical models) with a full var ...

  7. 未能加载文件或程序集Newtonsoft.Json, Version=4.5.0.0

    1.打开 程序管理器控制台  输入 PM> install-package newtonsoft.json 2.查看bin文件中是否有 newtonsoft.json.dll文件 3.在Web. ...

  8. iOS安全攻防之使用 Frida 绕过越狱设备检测

    Frida 是 一款有趣的手机应用安全分析工具. 文章参考:Bypass Jailbreak Detection with Frida in iOS applications 在 Mac Termin ...

  9. 码工具通过ICP备案

    5月22日,为广大程序员造福的在线工具--码工具 通过了ICP备案,这也意味着本站也越来越正规化,规范化.大家从今日起就可以在网站底部看到本站的ICP备案号. 备案/许可证编号:粤ICP备170597 ...

  10. MySql的学习笔记

    良好的理解sql语句: 列:理解可以运算的成变量 where: 理解成表达式,放在行中看是否成立 查出来的结果可以当成一张表理解,select 套用select综合查询:   五种查询 where g ...