APP中播放音频,最重要的一点就是要保证用户能够按预期的来控制音频的播放,还有就是保证多个APP不会同时播放音频。为了达到这两点要求,我们需要掌握如何控制音频的音量和播放,如何控制同一时刻只有有一个音频流,如何控制音频设备的输出等等。下面就从3个方面详细讲解。
1.音量和播放控制
用户能够控制APP播放音频的音量以及控制它的播放暂停快进后退等操作,这对提升APP体验来说是基本的。设想如果一个APP突然播放了声音,然后你不知声音从哪里来,没法停止播放,又没法调整音量,你肯定会很懊恼。
调整音量
首先我们要先了解音频流的概念。Android系统为不同的场景设定了不同的音频流,比如音乐播放,闹钟铃声,通知声音,来电铃声,系统声音和DTMF铃声等都有独立的音频流。我们可以独立地空着各类音频流而不会影响其他音频流。就像我们在用酷狗播放音乐时,我们通过物理按键调整音量,只会影响音乐音频流的声音大小,而来电铃声的音量不会改变。系统内定的音频流如下所示:
虽然有这么多的音频流,但是在同一时刻,只会有一个音频流处于激活状态。默认情况下,按音量加减物理键时会调整当前激活状态的音频流的音量。系统默认激活的音频流是STREAM_RING
,也就是说如果你的APP没有播放任何音频,那么按音量加减物理键调整的就是来电铃声的音量。Android系统提供了一个方法setVolumnControlStream()
来指定当前要调节音量的音频流。如果我们有用到音量调整功能,我们需要在Activity或Fragment的onCreate回调中明显地设置目标音频流,这样能保证不管我们的APP是否可见,音量控制都是符合用户预期的。比如播放音乐,我们需要调用如下代码:
setVolumeControlStream(AudioManager.STREAM_MUSIC);
这样调用之后,不管Activity或Fragment是否可见,按音量加减键时都会调整音乐播放的音频流的音量。
注意:上面讲述的物理音量加减键的响应。如果是虚拟音量加减按钮,我们只需要监听按钮的点击操作,然后调用AudioManager
的adjustStreamVolume(int streamType, int direction, int flags)
来调整音量。
控制播放或者暂停
播放,暂停,停止,跳过,上一首或者下一首等物理按键在许多手持设备中都有,甚至一些头戴设备如耳机也会有这些物理按钮。当这些物理按钮被按下时,Android系统会发送一个广播,ACTION指定为ACTION_ MEDIA_BUTTON
。我们需要实现这样一个广播监听器来响应这些按钮操作。
<receiver android:name=".RemoteControlReceiver">