良好的用户体验是可以被预测的。如果你的App需要播放多媒体,那么你的用户可以通过你的App利用硬件或软件的方式来控制他们的设备的音量,蓝牙耳机,头带耳机等对于他们来说是非常必要的。
同样的,在哪个位置合理恰当地提供播放、停止、暂停、跳过以及回放功能的按钮需要根据他们各自在你的App中对于audio stream的处理来决定。
控制App的音量和多媒体文件的播放主要有以下三个方面:
确认需要使用哪个Audio Stream
建立一个可预测的audio体验的第一步是理解你的App需要用到哪个audio stream。
Android系统提供一套不同的audio stream提供给播放音乐、闹钟、通知、来电提示、系统声音,通话音量以及双音多频的声调。这套机制为App的使用者通过独立的Stream来控制音量提供了可能性。
多数的stream受限于系统的事件,因此,除非你的App定位于替代系统的闹钟,你在设计时基本上会使用STREAM_MUSIC stream来播放你的audio。
使用硬件按钮来控制你的App的Audio音量
通常,通过按音量控制按钮来控制正在被使用的audio stream的音量。如果你的App没有播放任何的多媒体文件,按音量控制按键时会调整铃声的大小。
如果你安装了游戏或者是音乐的App,那么当用户按音量按钮的时候他们通常是想要控制游戏或是音乐的音量,甚至是在歌曲的间隔或者是没有背景音乐的游戏场景。
这个时候你可能会尝试监听音量按钮的点击事件,然后调整你App使用的audio stream的音量。这种方法我们不推荐。Android系统提供了便利的setVolumeControlStream() 方法,在按音量按钮时直接调整你指定的audio stream的音量。
在确定了你的应用会使用哪个audio stream之后,你应该将其设置为volume stream的目标。你应该在你的App的生命周期中尽早地调用这个方法,因为在活动的生命周期中你只需要调用setVolumeControlStream()方法一次,推荐在onCreate()(控制你的多媒体播放的Activity或是Fragment使用)回调方法被调用时使用。这样就确保了不管你的App是否可见,音量都会按照用户的预期被控制。
1 setVolumeControlStream(AudioManager.STREAM_MUSIC);
在调用了setVolumeControlStream()方法后,按设备的音量按钮会影响你指定的audio stream的音量(在上面的例子中是“music”),不管目标activity或fragment是否可见。
使用硬件的播放控制按钮来控制App audio的播放
在某些连接网络或者是无线的手机上面多媒体按钮是可用的,例如播放、暂停、停止、下一个与前一个。不管何时一个用户按上面硬件中的任何一个,系统将发一条广播,该广播的intent包含 ACTION_MEDIA_BUTTON 的action。
为了响应多媒体按钮的点击事件,你需要在你的manifest中注册一个 BroadcastReceiver来监听 ACTION_MEDIA_BUTTON action。
1 <receiverandroid:name=".RemoteControlReceiver"> 2 <intent-filter> 3 <actionandroid:name="android.intent.action.MEDIA_BUTTON"/> 4 </intent-filter> 5 </receiver>
上述receiver表明它需要获取到是哪个按钮被点击从而导致上述的广播。在Intent中的extra的key为EXTRA_KEY_EVENT 中有相应的信息,在KeyEvent类中定义了一组静态变量KEYCODE_MEDIA_*,它们代表了每个可能被点击的多媒体按钮,例如KEYCODE_MEDIA_PLAY_PAUSE 和 KEYCODE_MEDIA_NEXT.
下面的代码片段展示出了如何获取多媒体按钮的点击事件并且依据该事件来影响多媒体的播放。
1 publicclassRemoteControlReceiverextendsBroadcastReceiver{ 2 @Override 3 publicvoid onReceive(Context context,Intent intent){ 4 if(Intent.ACTION_MEDIA_BUTTON.equals(intent.getAction())){ 5 KeyEventevent=(KeyEvent)intent.getParcelableExtra(Intent.EXTRA_KEY_EVENT); 6 if(KeyEvent.KEYCODE_MEDIA_PLAY ==event.getKeyCode()){ 7 // Handle key press. 8 } 9 } 10 } 11 }
因为许多应用程序都可能会监听多媒体按钮的点击事件,你需要在你的App需要监听多媒体按钮的点击事件的时候通过编码的方式监听并控制多媒体按钮的点击事件。
下面的代码可以用在你的App中,使用 AudioManager注册和注销你的多媒体按钮点击事件receiver。当receiver被注册后,你注册的广播接收器是接收多媒体按钮广播唯一的接收器。
1 AudioManager am = mContext.getSystemService(Context.AUDIO_SERVICE); 2 ... 3 4 // Start listening for button presses 5 am.registerMediaButtonEventReceiver(RemoteControlReceiver); 6 ... 7 8 // Stop listening for button presses 9 am.unregisterMediaButtonEventReceiver(RemoteControlReceiver); 10
通常,Android的应用程序需要在他们变得不活跃或是不可见(例如在onStop()回调方法被调用时)的时候注销它们的receivers。然而,对于多媒体播放的App来说往往并非如此简单,当你的应用程序运行在后台的时候往往更需要响应多媒体播放按钮的点击事件。
在你的应用程序获得audio焦点时注册多媒体按钮事件监听receiver,在失去audio焦点时注销多媒体按钮事件监听receiver是一个更好解决方案。在下一章将会详细讲解。