笔记60 | Android控制音量与音频播放的学习

控制音量与音频播放

编写:kesenhoo

良好的用户体验应该是可预期且可控的。如果我们的应用可以播放音频,那么显然我们需要做到能够通过硬件按钮,软件按钮,蓝牙耳麦等来控制音量。 同样地,我们需要能够对应用的音频流进行播放(Play),停止(Stop),暂停(Pause),跳过(Skip),以及回放(Previous)等动作,并且并确保其正确性。

鉴别使用的是哪个音频流(Identify Which Audio Stream to Use)

为了创建一个良好的音频体验,我们首先需要知道应用会使用到哪些音频流。Android为播放音乐,闹铃,通知铃,来电声音,系统声音,打电话声音与拨号声音分别维护了一个独立的音频流。这样做的主要目的是让用户能够单独地控制不同的种类的音频。上述音频种类中,大多数都是被系统限制。例如,除非你的应用需要做替换闹钟的铃声的操作,不然的话你只能通过STREAM_MUSIC来播放你的音频。

使用硬件音量键来控制应用的音量(Use Hardware Volume Keys to Control Your App’s Audio Volume)

默认情况下,按下音量控制键会调节当前被激活的音频流,如果我们的应用当前没有播放任何声音,那么按下音量键会调节响铃的音量。对于游戏或者音乐播放器而言,即使是在歌曲之间无声音的状态,或是当前游戏处于无声的状态,用户按下音量键的操作通常都意味着他们希望调节游戏或者音乐的音量。你可能希望通过监听音量键被按下的事件,来调节音频流的音量。其实我们不必这样做。Android提供了setVolumeControlStream()方法来直接控制指定的音频流。在鉴别出应用会使用哪个音频流之后,我们需要在应用生命周期的早期阶段调用该方法,因为该方法只需要在Activity整个生命周期中调用一次,通常,我们可以在负责控制多媒体的Activity或者Fragment的 onCreate()方法中调用它。这样能确保不管应用当前是否可见,音频控制的功能都能符合用户的预期。

setVolumeControlStream(AudioManager.STREAM_MUSIC);

自此之后,不管目标Activity或Fragment是否可见,按下设备的音量键都能够影响我们指定的音频流(在这个例子中,音频流是"music")。

使用硬件的播放控制按键来控制应用的音频播放(Use Hardware Playback Control Keys to Control Your App’s Audio Playback)

许多线控或者无线耳机都会有许多媒体播放控制按钮,例如:播放,停止,暂停,跳过,以及回放等。无论用户按下设备上任意一个控制按钮,系统都会广播一个带有ACTIONMEDIABUTTON的Intent。为了正确地响应这些操作,需要在Manifest文件中注册一个针对于该Action的BroadcastReceiver,如下所示:

<receiver android:name=".RemoteControlReceiver">
    <intent-filter>
        <action android:name="android.intent.action.MEDIA_BUTTON" />
    </intent-filter>
</receiver>

在Receiver的实现中,需要判断这个广播来自于哪一个按钮,Intent通过EXTRAKEYEVENT这一Key包含了该信息,另外,KeyEvent类包含了一系列诸如 KEYCODE_MEDIA_*的静态变量来表示不同的媒体按钮,例如KEYCODEMEDIAPLAY_PAUSE

KEYCODEMEDIANEXT。

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来为我们的应用注册监听与取消监听媒体按钮事件,当Receiver被注册上时,它将是唯一一个能够响应媒体按钮广播的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控件进行控制)的时候,仍然能够响应媒体播放按钮事件是极其重要的。为了实现这一点,有一个更好的方法,我们可以在程序获取与失去音频焦点的时候注册与取消对音频按钮事件的监听。这个内容会在后面的课程中详细讲解。


原文发布于微信公众号 - 项勇(xiangy_life)

原文发表时间:2017-12-29

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

Xcelsius(水晶易表)系列——入门篇!

今天是新专题的第一篇——Xcelsius(水晶易表)入门篇! 今天跟大家简单介绍下Xcelsius(水晶易表)这款动态交互式可视化产品。 它是SAP公司首屈一指...

3969
来自专栏程序员互动联盟

苹果系统编程必看书籍

1.iOS Core Animation: Advanced Techniques ? 很全面的解释了Core Animation,动画原理说得很浅显易懂,结合...

3224
来自专栏非著名程序员

吐血推荐:这个开源工具你值得拥有,让你轻松面对各种调试

前天晚上分享了一篇国人把 GitHub 玩出新高度的文章,培训机构的学员为了找工作买卖 GitHub 账号,很多人说:其实面试的时候,只要深度一点的询问,一问就...

721
来自专栏顶级程序员

Android学习路上会遇到的各种瓶颈总结

前言 对于大多数大三学生来说,这个暑假是人生最后一个暑假。对于IT专业的学生来说,开学后就要面对各大IT企业的秋招,很多人会成为从0开始的An...

4768
来自专栏乐享123

装服务器偶得

2455
来自专栏数据小魔方

瀑布图

今天要跟大家分享的图表是瀑布图! ▽▼▽ 瀑布图图在诸多图表中算是比较复杂的图表,因而在excel2013及以下版本中并没有办法直接制作,不过最近更新的exce...

2926
来自专栏司想君

2017年前端开发手册(二)-2017前端技术展望

1. Web Assembly, 获取刚刚到达顶峰。 2. `import`可能仅仅被用在`<script></script>`中。 3. 通用JavaScri...

3506
来自专栏walterlv - 吕毅的博客

在 Windows 10 上为 WPF 窗口添加模糊特效(就像开始菜单和操作中心那样)

发布于 2017-10-01 16:14 更新于 2018-02...

4443
来自专栏java一日一条

为Web开发者准备的10个最新工具

Web开发设计是一个很有前途的职业。然而,这其中也有许多挑战。现在的企业和品牌正在朝网络进军。这给了web开发者非常多的机会来展示他们的技能,并在他们的职业上取...

1313
来自专栏腾讯社交用户体验设计

效率至上—全新微云

1943

扫码关注云+社区