Android---控制多媒体应用程序的音量和播放

本文译自:http://developer.android.com/training/managing-audio/volume-playback.html

良好的用户体验是具有可预见性的。如果你的应用程序要播放多媒体,那么用户能够使用设备的硬件或软件来控制的音量,如蓝牙耳机或麦克等,这是至关重要的。

同样,在适当的情况下,你的应用程序应该在媒体流上分别提供播放、停止、挂起、跳过、向前等媒体播放操作。

识别要使用的音频流

要创建一个具有可预见性的音频体验,首先是要理解你的应用程序要所要使用的音量流。

Android把音频流分为播放音乐、警告音、通知音、电话铃声、系统声音、通话音、以及DTMF音调。这样做主要目的是允许用户能够独立的控制每个流的音量。

这些流大多受限于系统事件,因此除非你的应用是一个替换闹钟,否则几乎可以可定要使用STREAM_MUSIC流来播放你的音频。

使用硬件的音量键来控制应用程序的音频音量

默认情况下,按下音量控制键会修改正在播放的音频流的音量。如果你的应用程序当前没有播放任何音频,那么点击音量键会调整铃声的音量。

如果你有一个游戏程序或音乐播放器,那么即使在两首歌曲之间或当前游戏位置中没有音乐,使用游戏程序或音乐播放器的音量控制键来控制音量也是好的时机。

你可能想要监听音量按键,并使用这种方法来修改你的音频流的音量。放弃这种想法,Android提供了方便的setVolumeControlStream()方法用于把音量按键指向你所指定的音频流。

确定了你的应用程序要使用的音频流之后,你应该把它设置为音频流的目标。你应该在应用生命周期的早期来调用这个方法---因为在Activity生命周期内你只需要调用一次该方法,通常你应该在onCreate()方法(控制媒体播放的Activity或Fragment)中调用它。这样就会保证无论你的应用程序什么时候可见,音量控制功能都会时用户所期望的。

setVolumeControlStream(AudioManager.STREAM_MUSIC);

从这时开始,按下音量设备上的音量键就会影响到你指定的音频流,而不管目标ActivityFragment是否可见。

使用硬件播放控制键来控制应用程序的音频播放

在某些手持设备和很多有线或无线耳机上,会有一些媒体播放按钮,如播放、暂停、停止、跳过或前进等。无论用户什么时候按下这些硬件按键中的一个,系统都会发出一个ACTION_MEDIA_BUTTON操作类型的Intent广播。

要响应媒体按钮的点击事件,你需要在你的清单文件中注册一个BroadcastReceiver,来监听这个操作类型的广播,注册方法如下:

<receiverandroid: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_PAUSEKEYCODE_MEDIA_NEXT

下面代码片段显示了如何提取被按下的媒体按钮,从而影响媒体播放:

publicclassRemoteControlReceiverextendsBroadcastReceiver{ 
   
@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所控制。

注册和反注册媒体按钮事件接收器的一个比较好的方法是在你的应用程序获得或丢失音频焦点的时候。这会在下节课详细介绍。

展开阅读全文

没有更多推荐了,返回首页