注:本文翻译自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界面被控制,时还能响应媒体按键的事件时很重要的。
一个更好的方法是在你的应用获取和丢失音频焦点时,注册或注销媒体按钮事件接收器。