作者:eoe_zvivi521


目录

 [隐藏] 

  • 1 Controlling Your App’s Volume and Playback
  • 1.1 确认使用的是哪个音频流
  • 1.2 使用硬件音量键控制应用音频音量
  • 1.3 使用硬件播放键来控制音频播放

Controlling Your App’s Volume and Playback

好的用户体验是可预知的。如果您的应用能够播放媒体文件,让用户使用硬件或者软件设备、蓝牙耳机、手机来控制音量是非常重要的。

同样,在适当和有效的应用使用的音频流上、播放、停止、暂停、快进和快退媒体录放控制按键需要执行各自的动作。

确认使用的是哪个音频流

创建可预知的音频体验第一步是理解应用使用的音频流。

Android为播放音乐、警报、通知、电话铃声、系统声音、通话音量、双音多频音维护了单独的音频流。首先允许用户控制每个单独流的音量。

大部分的流被系统消息限制,除非您的应用是警告铃声,大部分时候使用STREAM_MUSIC流来播放音频。

使用硬件音量键控制应用音频音量

默认情况下,按音量控制键会改变实际的音频流的音量。如果您的应用当前没有播放任何东西、按音量键会调整电话音量。

如果你有个游戏或者音乐应用,尽管当前在歌曲连接处和当前游戏中没有声音,当用户按音量键控制游戏或者音乐的音量也是可以的。或许你会用这个方法进行尝试、听取音量按键按下和修改音频流音量。抵制这个强烈要求。Android 提供了便利的setVolumeControlStream()方法让音量按键直接处理你指定的音频流。

确定了应用使用的音频流之后,需要将音频流设置为音量流目标。在应用生命周期中应该尽早调用--因为您只需要在activity生命周期中调用一次,最典型的是onCreate()方法中调用(在Activity或控制媒体的Fragment).这保证了不管应用是否可见,音量控制功能仍然像用户期待的。 

setVolumeControlStream(AudioManager.STREAM_MUSIC);

使用硬件播放键来控制音频播放

在许多手机,有线和无线耳机上都有媒体播放按键,如播放、暂停、停止、快进和快退.当用户操作这些键时,系统会广播一个含有ACTION_MEDIA_BUTTON动作的intent。

为了响应媒体按键,需要在manifest里面注册一个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 am = mContext.getSystemService(Context.AUDIO_SERVICE);
...
 
// Start listening for button presses
am.registerMediaButtonEventReceiver(RemoteControlReceiver);
...
 
// Stop listening for button presses
am.unregisterMediaButtonEventReceiver(RemoteControlReceiver);

一般而言,应用应该取消注册大多数的接收器,当他们变得不活跃或者不可见(像是在onStop()回调期间).但是,媒体按键应用不是那么简单-实际上,对应媒体按键处理是很重要的,如果你的应用不可见,视图最好不能进行控制。

一个更好地方法是当应用程序得到和失去音频焦点的时候,注册和取消注册媒体按钮事件接收器。这在下一课有详细介绍。