在Android系统中可能会有多个应用程序会播放音频,所以需要考虑他们之间该如何交互,为了避免多个应用程序同时播放音乐,Android 系统使用音频焦点来进行统一管理,即只有获得了音频焦点的应用程序才可以播放音乐。
我们的应用在开始播放音频文件前,首先应该请求获得音频焦点,并且应该同时注册监听音频焦点的丢失通知,即如果音频焦点被系统或其他的应用程序抢占时,应该做出什么响应。
“音频焦点”这个翻译可能有点难以理解。其实audio focus的本意是说用户在同一时刻只能聚焦(focus on)在一个音频流的播放上,不可能同时听两个播放的音频流,由此演化出了audio focus的概念。
Android平台上的音频焦点分为以下四类
AudioManager#AUDIOFOCUS_GAIN 永久性的音频焦点。
AudioManager#AUDIOFOCUS_GAIN_TRANSIENT 暂时性的音频焦点。
AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 请求附带“降低音量”的暂时性焦点,表示您只希望在短时间内播放音频,并允许前一个持有焦点的应用在降低其音量输出的情况下继续播放,也就是允许两个音频流同时出声。特别适合于语音导航、语音助手的场景使用。
AudioManager#AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 请求暂时性的音频焦点,同时不希望系统播放任何其他音频,常用于录音或者需要做语音识别的场景。
因为每个焦点类型都是以整型定义的,所以可以通过抓日志adb logcat | egrep -i focus来从日志判断某个应用申请的是什么类型的
Android系统通过音频焦点管理多个应用的音频播放,确保同一时间只有一个应用播放音乐。应用在播放前需请求音频焦点并监听焦点丢失,焦点类型包括永久、暂时、短暂降低音量和短暂独占。API 26后音频焦点管理更简便,对应四种焦点通知事件。音频焦点的实现基于栈数据结构,栈顶应用拥有焦点。
订阅专栏 解锁全文
2385





