好的用户体验是可以预测的。如果你的应用程序播放音频,你的用户能使用硬件或者软件音量控制,来控制他们设备,蓝牙耳机,或者听筒的音量是非常重要的。
相似的,在适当的地方可用,播放,停止,暂停,上一首,和下一首媒体回放键,应该在你的应用使用的音频流上执行它们各自的动作。
确定在使用哪个音频流
—————————————————————————————————————————————————————————————————
创建一个可预测的音频体验的第一步是知道你的应用程序将会使用哪个音频流。
Android维护一个单独的音频流来播放音乐,铃声,消息,来电铃声,系统声音,来电,音量提升和DTMP调节。这样做的主要目的是为了允许用户来单独的控制每个流的音量。
大多数这些流都被系统事件限制,所以除非你的应用程序是闹钟的替代,你几乎肯定能使用STREAM_MUSIC流播放你的音频。
使用硬件音量键来控制你的应用个程序的音量
—————————————————————————————————————————————————————————————————
默认情况下,按音量键修改当前活动音频流的音量。如果你的应用当前没有播放任何音乐,按这个音量键调整铃声音量。
如果你有一个游戏或者音乐应用,他们想当用户按音量键的时候,是控制游戏或者音乐音量的好机会,即使他们当前在歌曲之间或者在当前游戏没有音乐播放。
你可能会尝试和并监听音量键,通过这种方法修改你的音频流的音量。抵制冲动。Android提供了便利的setVolumeControlStream()方法直接按音量键到你指定的音频流。
已经确定了你的应用程序将要使用的音频流,你应该把它设置为音频流目标。你应该在你的生命周期早期调用它—因为你仅仅需要在Activity生命周期调用它一次,你通常应该在onCreate()方法中调用它(控制你的媒体的Activity或者Fragment)。这保证你的应用在任何时候都是可见的,音量控制功能为用户所期待的。
setVolumeControlStream(AudioManager.STREAM_MUSIC);
从此以后,在设备上按压音量键将影响你指定的音频流(在”音乐“的请款跪下)无论目标Activity或者Fragment是否可见。
使用硬件回放控制键来控制你的应用程序的音频播放
—————————————————————————————————————————————————————————————————
媒体回放键,如播放,暂停,停止,上一首和先一手在一些手机和一些连接的无线耳机是有效的。无论用户什么时候按下这些键中的一个,系统广播一个包含ACTION_MEDIA_BUTTION动作的Intent。
为了响应音频按钮点击,你需要在你的清单文件中注册一个BroadcastReceiver,来监听这个广播动作,如下所示:
<receiver android:name=".RemoteControlReceiver">
<intent-filter>
<action android:name="android.intent.action.MEDIA_BUTTON" />
</intent-filter>
</receiver>
这个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注册或知道你的媒体按钮事件接受者。当注册的时候,你的broadcast receiver是所有媒体按钮广播的独有接受者。
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控制。
一个更好的方式是注册和注销媒体播放按钮事件接受者,在你的应用程序获取和失去音频焦点的时候。这在下一个课程中详细的说明。