Android处理音频焦点AudioFocus

Android处理音频焦点AudioFocus

神马笔记播放声音的几处功能:

  1. 语音笔记
  2. 视频笔记
  3. 音乐笔记

其中视频笔记使用VideoView实现,VideoView已经对AudioFocus进行了处理。

视频开始播放之前取得焦点,播放完成或者停止播放时释放焦点。

语音笔记和音乐笔记目前还没有处理音频焦点的问题,会出现多个音源重叠的情况。

比如,使用播放器播放歌曲时,播放语音或者音乐笔记,与歌曲相互重叠,最终两者都听不清楚。

一、目标

处理音频焦点,避免多个音源同时播放。

二、实现方案

AudioManager提供了AudioFocus相关接口来实现这个功能。

1. 方法

方法 说明
public int requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint) 请求音频焦点,传入回调接口,音频流类型以及请求的时间长度。
public int abandonAudioFocus(OnAudioFocusChangeListener l) 传入回调接口释放音频焦点。

2. 监听器

1
2
3
public interface OnAudioFocusChangeListener {
public void onAudioFocusChange(int focusChange);
}

3. 常量定义

  • 流类型
常量 说明
STREAM_MUSIC 音乐
STREAM_RING 来电
STREAM_ALARM 闹钟
STREAM_NOTIFICATION 通知
STREAM_SYSTEM 系统
STREAM_VOICE_CALL 来电
STREAM_DTMF ???
STREAM_ACCESSIBILITY ???
  • 请求结果
常量 说明
AUDIOFOCUS_REQUEST_FAILED 请求失败
AUDIOFOCUS_REQUEST_GRANTED 请求成功
AUDIOFOCUS_REQUEST_DELAYED 延迟,Android8.0开始引入
  • 请求时间长度
常量 说明
AUDIOFOCUS_GAIN 长时间持有焦点
AUDIOFOCUS_GAIN_TRANSIENT 临时,比如导航,事件通知
AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK 临时,请降低音量,比如导航
AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE 临时,什么都别来吵我,比如语音备忘,语音识别
  • 音频焦点变化事件
常量 说明
AUDIOFOCUS_GAIN 持有焦点
AUDIOFOCUS_LOSS 失去焦点
AUDIOFOCUS_LOSS_TRANSIENT 临时失去焦点
AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 临时失去焦点,允许小声播放
  • 其他常量
常量 说明
AUDIOFOCUS_NONE Used to indicate no audio focus has been gained or lost, or requested.

三、参考文章

有关AudioFocus的使用方式,请参考以下文章。

文章 描述
Android音频焦点详解(上)
Android音频焦点详解(下)——源码详解
Android音频焦点AudioFocus处理
Android 音频焦点(Audio Focus)

以上文章非常详细讲解了AudioFocus的使用方式,非常感谢!

四、过程回顾

首先参考了VideoView的音频焦点处理方式,接下来查找了一些相关文章。

涉及到音频播放的功能,必须处理音频焦点以防止出现互相干扰的问题。

五、接下来

神马笔记中处理音频焦点事件。

六、Finally

佛告须菩提。 凡所有相。皆是虚妄。 若见诸相非相。即见如来。