返回顶部
首页 > 资讯 > 精选 >Android音频焦点管理实例分析
  • 403
分享到

Android音频焦点管理实例分析

2023-06-29 01:06:36 403人浏览 薄情痞子
摘要

这期内容当中小编将会给大家带来有关Android音频焦点管理实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。音频焦点管理的意义两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会

这期内容当中小编将会给大家带来有关Android音频焦点管理实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。

    音频焦点管理的意义

    两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会将所有音频流混合在一起。虽然这是一项出色的技术,但却会给用户带来很大的困扰。为了避免所有音乐应用同时播放,Android 引入了“音频焦点”的概念。 一次只能有一个应用获得音频焦点。

    当您的应用需要输出音频时,它需要请求获得音频焦点,获得焦点后,就可以播放声音了。不过,在您获得音频焦点后,您可能无法将其一直持有到播放完成。其他应用可以请求焦点,从而占有您持有的音频焦点。如果发生这种情况,您的应用应暂停播放或降低音量,以便于用户听到新的音频源。

    音频焦点管理的行为准则

    • 在即将开始播放之前调用 requestAudioFocus(),并验证调用是否返回 AUDIOFOCUS_REQUEST_GRANTED。

    • 在其他应用获得音频焦点时,应该停止或者暂停播放,或者降低音量。

    • 播放停止后应该放弃音频焦点

    版本兼容

    从Android 8.0(O版本,api 26)开始,音频焦点的请求方式以及系统管理有了细微的变化,下面分两部分来说明。

    在Android 8.0(API 26) 之前对音频焦点具体处理实现

    当想录音或者播放歌曲的时候,最好(非必须)先请求音频焦点,这个时候需要调用AudioManager.requestAudioFocus()方法,函数原型如下

    AudioManager.requestAudioFocus(OnAudioFocusChangeListener l, int streamType, int durationHint)

    第一个参数用于监听焦点变化

    第二个参数表明请求的音频焦点影响的是那种类型流,例如,如果我们录音,我们肯定是要影响Music这一类型的音频流,因此可以选择AudioManager.STREAM_MUSIC。当然还有许多类型。

    public static final int STREAM_VOICE_CALL = AudiOSystem.STREAM_VOICE_CALL;public static final int STREAM_SYSTEM = AudioSystem.STREAM_SYSTEM;public static final int STREAM_RING = AudioSystem.STREAM_RING;public static final int STREAM_MUSIC = AudioSystem.STREAM_MUSIC;public static final int STREAM_ALARM = AudioSystem.STREAM_ALARM;

    第三个参数用于表明音频焦点的持续时间,这个很关键,它也有许多种类型,下面一一列出。

    • AudioManager.AUDIOFOCUS_GaiN: API文档说请求的这类音频焦点持续时间是未知的,通常用来表示长时间获取焦点,可以用来播放音乐,录音等等。

    • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT: 表明请求的音频焦点持续时间比较短,通常用来播放导航路线的声音,或者播放通知声音。

    • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: 这个也是表明请求的音频焦点持续时间比较短,但是在这段时间内,它希望其他应用以较低音量继续播放。例如,我们在使用导航的时候可以听音乐,当出现导航语音的时候,音乐音量会降低以便我们能听清楚导航的语音,当导航语音播放完毕后,音乐恢复音量,继续播放。

    • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE: 这个也是表明音请求的音频焦点持续时间比较短,但是在这段时间内,不希望任何应用(包括系统应用)来做任何与音频相关的事情,就算是降低音量播放音乐也是不被希望的。例如当我们进行录音或者语音识别的时候,我们不希望其他的声音出现干扰。

    AudioManager.requestAudioFocus()的返回值表明请求的结果AudioManager.AUDIOFOCUS_REQUEST_FAILED表明请求焦点失败,AudioManager.AUDIOFOCUS_REQUEST_GRANTED表明请求焦点成功。

    当我们成功请求焦点后,就可以做一些与音频有关的事情,例如播放音乐,录音,或者语音识别。当完成这些工作后,我们必须调用AudioManager.abandonAudioFocus(onAudioFocusChangeListener l)释放音频焦点。

    8.0 之后实现

    从Android 8.0开始(API 26),请求音频焦点的方式以及系统对音频焦点变化的管理有些微妙的变化。 首先,对音频焦点变化的管理的变化体现在两个方面,延迟获取焦点和自动降低音量。

    延迟获取焦点

    在Android 8.0之前,当我们请求音频焦点的时候,只会返回两种结果,要么请求成功(AUDIOFOCUS_REQUEST_GRANTED),要么请求失败(AUDIOFOCUS_REQUEST_FAILED)。

    而从Android 8.0开始,还有一种结果,延迟成功请求(AUDIOFOCUS_REQUEST_DELAYED),这个也是成功的请求,但是这个请求具有延迟性。例如当我们处于通话状态的时候,我们很显然不希望任何app来获取到音频焦点来做些事,例如播放音乐。

    然而只有设置过AudioFocusRequest.Builder.setAcceptsDelayedFocusGain(true)才能获取到这种结果,这个我们后面会讲到。那么我们怎么知道什么时候获取到了音频焦点呢,当然还需要设置AudioManager.OnAudioFocusChangeListener这个音频焦点变化的监听器,通过回调确认何时获取到了音频焦点。

    自动降低音量

    在Android 8.0之前,如果请求焦点使用了AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK参数,它表明希望拥有了音频焦点的其他应用降低音量来使用音频,然而并不是所有的应用都会这样做(有可能开发者忘记了优化),因为这并不是系统强制的。But, 从Android 8.0开始,这个降低音量的工作,就是系统默认行为了,可以说是一个良心的优化。

    如果我不希望系统自动给我降低音量,而是想自己暂停音频相关的工作,那咋办?这个可以通过AudioFocusRequest.Builder.setWillPauseWhenDucked(true)方法取消系统的默认行为,然后通过监听音频焦点变化

    音频焦点请求方式

    从 Android 8.0(API 级别 26)开始,当您调用 requestAudioFocus() 时,必须提供 AudioFocusRequest 参数。要释放音频焦点,请调用 abandonAudioFocusRequest() 方法,该方法也接受 AudioFocusRequest 作为参数。在请求和放弃焦点时,应使用相同的 AudioFocusRequest 实例

    要创建 AudioFocusRequest,请使用 AudioFocusRequest.Builder。由于焦点请求始终必须指定请求的类型,因此此类型会包含在构建器的构造函数中。使用构建器的方法来设置请求的其他字段

    • setFocusGain(): 只有这个方法是必须的,而传入的参数与8.0之前使用AudioManager.requestAudioFocus()传入的第三个参数一样,都是用来表示持续时间。

    • setAudioAttributes(): 这个方法是用来描述app的使用情况。这方法需要传入一个AudioAttributes对象,这个对象也是使用Builder模式来构造,例如使用AudioAttributes.Builder.setUsage()来描述使用这个音频来干什么,我们可以传入一个AudioAttributes.USAGE_MEDIA来表明用这个音频来作为媒体文件来播放,也可以传入一个AudioAttributes.USAGE_ALARM来表明用这个来作为闹铃。

    • setWillPauseWhenDucked(): 这个前面说过,是为了覆盖系统默认降低音量的行为,但是必须要设置AudioManager.OnAudioFocusChangeListener才能自己处理这类情况。

    • setAcceptsDelayedFocusGain(): 这个前面也说过,这个是为了能够延迟获取到焦点的必须条件,但是同时也必须要设置AudioManager.OnAudioFocusChangeListener才能得知何时获取到焦点。

    • setOnAudioFocusChangeListener(): 音频焦点变化监听器。值得一提的是这个方法有个重载的方法,有一个重载方法有两个参数,第二个参数为Handler对象,看到Handler应该明白了,是为了使用它的消息队列来顺序处理这个回调

    响应音频焦点更改

    当应用获得音频焦点后,它必须能够在其他应用为自己请求音频焦点时释放该焦点。出现这种情况时,您的应用会收到对 AudioFocusChangeListener 中的 onAudioFocusChange() 方法的调用,该方法是您在应用调用 requestAudioFocus() 时指定的。

    传递给 onAudioFocusChange() 的 focusChange 参数表示所发生的更改类型。它对应于获取焦点的应用所使用的持续时间提示。您的应用应该做出适当的响应

    暂时性失去焦点

    如果焦点更改是暂时性的(AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK 或 AUDIOFOCUS_LOSS_TRANSIENT),您的应用应该降低音量(如果您不依赖于自动降低音量)或暂停播放,否则保持相同的状态。

    在暂时性失去音频焦点时,您应该继续监控音频焦点的变化,并准备好在重新获得焦点后恢复正常播放。当抢占焦点的应用放弃焦点时,您会收到一个回调 (AUDIOFOCUS_GAIN)。此时,您可以将音量恢复到正常水平或重新开始播放。

    永久性失去焦点

    如果是永久性失去音频焦点 (AUDIOFOCUS_LOSS),则其他应用会播放音频。您的应用应立即暂停播放,因为它不会收到 AUDIOFOCUS_GAIN 回调。要重新开始播放,用户必须执行明确的操作,例如在通知或应用界面中按播放传输控件。

    附音频基础知识

    采样和采样频率:一秒钟内采样的次数称为采样频率。采样频率越高,越接近原始信号,但是也加大了运算处理的复杂度。根据Nyquist采样定理,要想重建原始信号,采样频率必须大于信号中最高频率的两倍。人能感受到的频率范围为20HZ--20kHZ, 一般音乐的采样频率为44.1kHZ, 更高的可以是48kHZ和96kHZ,不过一般人用耳听感觉不出差别了。语音主要是以沟通为主,不需要像音乐那样清晰,用16k采样的语音就称为高清语音了。现在主流的语音采样频率为16kHz。

    采样位数:数字信号是用0和1来表示的。采样位数就是采样值用多少位0和1来表示,也叫采样精度,用的位数越多就越接近真实声音。如用8位表示,采样值取值范围就是-128--127,如用16位表示,采样值取值范围就是-32768--32767。现在一般都用16位采样位数。

    声道:声道是指处理的声音是单声道还是立体声。Android支持双声道立体声和单声道。CHANNEL_IN_MONO单声道,CHANNEL_IN_STEREO立体声。单声道在声音处理过程中只有单数据流,而立体声则需要左、右声道的两个数据流。显然,立体声的效果要好,但相应的数据量要比单声道的数据量加倍。

    码率:就是比特率。比特率是指每秒传送的比特(bit)数。码率=采样率X采样位数X声道数。

    音频采集和播放:一般用专门的芯片(通常叫codec芯片)采集音频,做AD转换,然后把数字信号通过I2S总线(主流用I2S总线,也可以用其他总线,比如PCM总线)送给CPU处理(也有的会把codec芯片与CPU芯片集成在一块芯片中)。当要播放时CPU会把音频数字信号通过I2S总线送给codec芯片,然后做DA转换得到模拟信号再播放出来。

    Android是什么

    Android是一种基于linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

    上述就是小编为大家分享的Android音频焦点管理实例分析了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Android音频焦点管理实例分析

    本文链接: https://lsjlt.com/news/321519.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    猜你喜欢
    • Android音频焦点管理实例分析
      这期内容当中小编将会给大家带来有关Android音频焦点管理实例分析,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。音频焦点管理的意义两个或两个以上的 Android 应用可同时向同一输出流播放音频。系统会...
      99+
      2023-06-29
    • Android音频焦点管理实例详解
      目录音频焦点管理的意义音频焦点管理的行为准则版本兼容在Android 8.0(API 26) 之前对音频焦点具体处理实现8.0 之后实现延迟获取焦点自动降低音量音频焦点请求方式响应音...
      99+
      2024-04-02
    • Python中音频调整音量的示例分析
      这篇文章主要为大家展示了“Python中音频调整音量的示例分析”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Python中音频调整音量的示例分析”这篇文章吧。环境依赖ffmpeg环境安装ffmp...
      99+
      2023-06-21
    • Java数组高频考点实例分析
      这篇文章主要介绍“Java数组高频考点实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Java数组高频考点实例分析”文章能帮助大家解决问题。1、数组理论基础数组是存放在连续内存空间上的相同类型...
      99+
      2023-06-29
    • Android开发之音视频协议分析
      这篇文章主要介绍“Android开发之音视频协议分析”,在日常操作中,相信很多人在Android开发之音视频协议分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android开发之音视频协议分析”的疑惑有所...
      99+
      2023-06-30
    • vue状态管理实例分析
      这篇文章主要介绍“vue状态管理实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“vue状态管理实例分析”文章能帮助大家解决问题。场景:一个地图应用,有个侧边栏...
      99+
      2024-04-02
    • 基于Matlab实现数字音频分析处理系统
      目录一、语音处理简介1语音信号的特点2语音信号的采集3语音信号分析技术4语音信号的时域分析5语音信号的频域分析二、部分源代码三、运行结果一、语音处理简介 1 语音信号的特点 通过对大...
      99+
      2024-04-02
    • Android图片处理实例分析
      本文实例讲述了Android图片处理的方法。分享给大家供大家参考,具体如下: package cn.szbw.util; import Android.content.Con...
      99+
      2022-06-06
      Android
    • html5中音频与视频监听器应用的示例分析
      这篇文章将为大家详细讲解有关html5中音频与视频监听器应用的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。 一 介绍1、<au...
      99+
      2024-04-02
    • Android编程中PopupWindow的用法分析【位置、动画、焦点】
      本文实例讲述了Android编程中popupwindow用法。分享给大家供大家参考,具体如下: 在Android中有很多级别的Window,不同级别的Window按照z-ind...
      99+
      2022-06-06
      popupwindow 动画 Android
    • Android AlertDialog实例分析
      这篇文章主要讲解了“Android AlertDialog实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Android AlertDialog实例分析”吧!AlertDialog可以...
      99+
      2023-06-25
    • 如何基于Matlab实现数字音频分析处理系统
      这篇文章主要介绍了如何基于Matlab实现数字音频分析处理系统,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。一、语音处理简介1 语音信号的特点通过对大量语音信号的观察和分析发...
      99+
      2023-06-29
    • mysql用户权限管理实例分析
      本文实例讲述了mysql用户权限管理。分享给大家供大家参考,具体如下: 本文内容: 什么是用户权限 恰当的用户权限 查看权限 修改权限 删除权限 首发日期:2018-04-19 什么是用户...
      99+
      2022-05-15
      mysql 用户权限管理
    • mysql用户管理操作实例分析
      本文实例讲述了mysql用户管理操作。分享给大家供大家参考,具体如下: 本文内容: 用户的介绍 查看用户 创建用户帐户 修改账户 删除帐户 关于匿名用户 首发日期:2018-04-19 ...
      99+
      2022-05-15
      mysql 用户管理
    • JavaScript包管理器实例比较分析
      这篇文章主要讲解了“JavaScript包管理器实例比较分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JavaScript包管理器实例比较分析”吧!包管...
      99+
      2024-04-02
    • RAC_OCR管理的示例分析
      这篇文章给大家介绍RAC_OCR管理的示例分析,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。管理OCROCR是Oracle RAC配置信息仓库,它管理集群...
      99+
      2024-04-02
    • Python Pandas数据处理高频操作实例分析
      这篇文章主要介绍“Python Pandas数据处理高频操作实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python Pandas数据处理高频操作实例分析”文章能帮助大...
      99+
      2023-07-02
    • Android Handler 原理分析及实例代码
      Android Handler 原理分析 Handler一个让无数android开发者头疼的东西,希望我今天这边文章能为您彻底根治这个问题 今天就为大家详细剖析下Handler...
      99+
      2022-06-06
      handler Android
    • Java实现学生管理系统实例分析
      这篇“Java实现学生管理系统实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java实现学生管理系统实例分析”文章吧...
      99+
      2023-07-02
    • package.json管理依赖包版本实例分析
      这篇文章主要介绍了package.json管理依赖包版本实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇package.json管理依赖包版本实例分析文章都会有所收获,下面我们一起来看看吧。npm版本号定...
      99+
      2023-07-02
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作