Android 8.0后音频焦点处理小结

Android  2020年10月14日 pm10:12发布4年前 (2020)更新 91es.com站长
67 0 0

前提

两个或两个以上的 Android 应用可同时向同一输出流播放音频,系统会将所有音频流混合在一起。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。

一次只能有一个应用获得音频焦点。

音频焦点采用合作模式

对,合作模式,你可以准守也可以不准守。

Android建议应用遵守音频焦点准则,但系统不会强制执行这些准则。如果应用想要在失去音频焦点后继续大声播放,系统无法阻止它。

下面我们只关心Android 8.0 以后版本的焦点申请。

requestAudioFocus()的使用

// 初始化AudioManager

AudioManager mAudioManager = (AudioManager) mContext.getSystemService(Context.AUDIO_SERVICE);

// mAudioAttributes 配置(多媒体场景,申请的是音乐流)
AudioAttributes mAudioAttributes = new AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_MEDIA)
.setContentType(AudioAttributes.CONTENT_TYPE_MUSIC)
.build();

// 初始化AudioFocusRequest
mAudioFocusRequest = new AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN)
.setAudioAttributes(mAudioAttributes)
.setAcceptsDelayedFocusGain(true) //设置是否允许延迟获取焦点
.setWillPauseWhenDucked(true) //设置AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK会暂停,系统不会压低声音
.setOnAudioFocusChangeListener(mFocusChangeListener) //设置焦点监听回调
.build();

// requestAudioFocusshe申请焦点
int audioStatus = mAudioManager.requestAudioFocus(mAudioFocusRequest);

申请的焦点类型

申请的焦点类型有如下几种

  1. AudioManager.AUDIOFOCUS_GAIN

永久获取焦点

其他应用监听OnAudioFocusChangeListener 收到的焦点状态变化是AudioManager.AUDIOFOCUS_LOSS。

  1. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT

临时获取焦点

其他应用监听OnAudioFocusChangeListener 收到的焦点状态变化是AudioManager.AUDIOFOCUS_LOSS_TRANSIENT。

  1. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK

临时获取焦点且可以被压低声音播放

其他应用监听OnAudioFocusChangeListener 收到的焦点状态变化是AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK。

  1. AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE

用于指示音频焦点的临时请求,预计将持续很短的时间,在此期间,其他任何应用程序或系统组件均不应播放任何内容。 专用音频音频请求和瞬时音频焦点请求的示例包括语音备忘录记录和语音识别,在此期间,系统不应播放任何通知,并且媒体播放应已暂停。(此部分来自于谷歌翻译Android文档)

申请焦点回调的状态值

audioStatus 为焦点状态,有三种情况

  1. AUDIOFOCUS_REQUEST_FAILED = 0

焦点申请失败,不能播放

  1. AUDIOFOCUS_REQUEST_GRANTED = 1

焦点申请成功,可以播放

  1. AUDIOFOCUS_REQUEST_DELAYED = 2

焦点延迟获取,不可以播放。

如果有重新获取焦点,会通过onAudioFocusChange()进行回调才可以播放。

这个需要在AudioFocusRequest.Builder通过setAcceptsDelayedFocusGain(boolean)允许延迟获取焦点。

private OnAudioFocusChangeListener mFocusChangeListener = new OnAudioFocusChangeListener() {
        @Override
        public void onAudioFocusChange(int focusChange) {
            Log.i(TAG, "mdeia_onAudioFocusChange:" + focusChange);
            try {
                switch (focusChange) {
                    case AudioManager.AUDIOFOCUS_LOSS:
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT:
                        break;
                    case AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK:
                        break;
                    case AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE:
                        break;
                    case AudioManager.AUDIOFOCUS_GAIN:
                        break;
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    };

通过onAudioFocusChange()的回调是表示重新获取或丢失焦点。

  1. AUDIOFOCUS_LOSS 永久丢失焦点

其他应用申请的是永久焦点,我们应用就会永久丢失焦点,然后不能发声,且需要释放资源。

如果要发声需要重新走申请流程。

  1. AUDIOFOCUS_LOSS_TRANSIENT

临时丢失焦点

  1. AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK

临时丢失焦,但可以播放,且声音被压低的

  1. AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE

临时丢失,不可以播放(具体看上面解)

  1. AUDIOFOCUS_GAIN

重新获取焦点或者是延迟获取焦点时的回调,可以播放

参考文章

  1. Android音频焦点处理
  2. Android官方文档-管理音频焦点
  3. Android音频焦点处理

 历史上的今天

  1. 2021: 冰心:我们把春天吵醒了(0条评论)
  2. 2019: 张晓风:经济学的旁听生(0条评论)
版权声明 1、 本站名称: 91易搜
2、 本站网址: 91es.com3xcn.com
3、 本站内容: 部分来源于网络,仅供学习和参考,若侵权请留言
3、 本站申明: 个人流水账日记,内容并不保证有效

暂无评论

暂无评论...

随机推荐

[代码片段]ListView+Letter排序代码

前言需求:歌曲按照A-Z(或a-z)#排序,并触摸左侧字母可定位对应的字母Item(参考通讯录字母查询)实例:通讯录和音乐中会用到正文隐藏内容!付费阅读后才能查看!¥5多个隐藏块只需支付一次付费阅读参考文章无

反射之泛型类简单介绍

前言对于泛型类型,Android源码中是很常见的。偶尔需要对泛型进行反射,因此,记录一下,方便自己查阅。Android P,不同版本可能不同正文本文以hook一下ActivityManager.startActivity(),在startActivity()启动新的Activity时打...

[摘]Android稳定性(二)bootup fail

前言之前我也有整理相关的,但没有摘抄的这篇文章那么详细,因此这里摘抄于此,方便自己查阅。本文摘抄,感谢作者分析。好记性不如烂笔头正文下面就简单介绍一下Android系统启动流程。BootLoader启动开机供电,硬件电路会产生一个确定的复位时序用于硬件启动顺序,直至最后CPU启动;C...

李娟: 通往一家人去的路

有时候我会扔下杂货店跑出去满山遍野地玩,来店里买东西的人就只好坐在我家帐篷里耐心等待,顺便替我守着店,有人来买东西的话,就告诉他:“人不在。”有时候他实在等急了,就出去满山遍野地找我。而有的时候呢,我在帐篷里耗一整天,也没有一个人来买东西,连把头伸进帐篷看一眼的人也没有。害我白白浪费了本该出去玩的...

周国平:爱的距离

好的爱情有韧性,拉得开,但又扯不断。相爱者互不束缚对方,是他们对爱情有信心的表现。谁也不限制谁,到头来仍然是谁也离不开谁,这才是真爱。好的两性关系有弹性,彼此既非僵硬地占有,也非软弱地依附。相爱的人给予对方的最好礼物是自由。两个自由人之间的爱,拥有必要的张力。这种爱牢固,但不板结;缠绵,但不黏滞...

乔叶:曾经这样爱过你

曾经这样爱过一个人:爱的人知道,被爱的人不知道,这是暗恋吗?爱着的时候,就整天鬼迷心窍地琢磨着你。你偶然有句话,就想着你为什么要这样说?你在说给谁听?有什么用?你偶然的一个眼神掠过,就会颤抖,欢喜,忧伤,沮丧。怕你不看自己,也怕你看到自己。更怕你似看不看的余光,轻轻地扫过来,又飘飘地带过去,...