Android音频焦点

什么是音频焦点?

音频焦点是 API 8 中引入的一个概念。它用于传达这样一个事实:用户一次只能专注于一个音频流,例如收听音乐或播客,但不能同时关注两者。在某些情况下,多个音频流可以同时播放,但只有一个是用户真正会听的(专注于),而另一个在后台播放。一个例子是,在播放音乐时,会播报行车路线,而音乐的音量会降低(又称为闪避)。

官方连接:https://developer.android.google.cn/reference/android/media/AudioFocusRequest?hl=en 在该文档解释了什么是音频焦点,也展示了一个播放有声读物的App如何处理音频焦点。

对于AudioAttributes中的setUsagesetContentType的含义,文档中也有对应说明:https://developer.android.google.cn/reference/android/media/AudioAttributes,在Builder中也有对应的使用示例:https://developer.android.google.cn/reference/android/media/AudioAttributes.Builder

AudioManager.requestAudioFocus()函数的作用:当一个应用程序请求音频焦点时,系统会通知其他正在播放音频的应用程序让出音频焦点。根据请求的类型和当前的音频焦点状态,其他应用程序可能会降低音量、暂停播放或完全停止播放音频。

对于focusGain参数:

  • AudioManager.AUDIOFOCUS_GAIN: 长时间获取焦点。
  • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT: 短时间获取焦点。
  • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_MAY_DUCK: 短时间获取焦点,允许其他应用降低音量(ducking)。
  • AudioManager.AUDIOFOCUS_GAIN_TRANSIENT_EXCLUSIVE: 短时间获取独占焦点。

这些参数如何选择,比如我是一个音乐播放器,播放音乐的时间可能很长,所以应用用AUDIOFOCUS_GAIN,这样我一请求音频焦点,别的应用就会收到AUDIOFOCUS_LOSS的通知,它们应该要完全停止播放了。

如果是一个通话app,则应该AUDIOFOCUS_GAIN_TRANSIENT,这样通话应该在请求焦点后,播放器app就会收到AUDIOFOCUS_LOSS_TRANSIENT,此时播放器应该暂停,通话结束后,调用audioManager.abandonAudioFocusRequest(audioFocusRequest)来释放音频焦点,此时播放器app就会收到AUDIOFOCUS_GAIN,此时就可以恢复播放之间暂停的音乐了。

示例代码如下:

fun log(msg: String) {Log.i("AAAA", msg)
}class MainActivity : AppCompatActivity() {private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }private val audioManager by lazy { getSystemService(Context.AUDIO_SERVICE) as AudioManager }// 创建音频焦点改变监听器private val audioFocusChangedListener = { focusChanged: Int ->when (focusChanged) {AudioManager.AUDIOFOCUS_GAIN -> log("获得焦点,此时可以恢复播放")AudioManager.AUDIOFOCUS_LOSS -> log("永久丢失焦点,如被其他播放器抢占,此时应该停止播放")AudioManager.AUDIOFOCUS_LOSS_TRANSIENT -> log("暂时丢失焦点,如来电,此时应该暂停播放")AudioManager.AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK -> log("暂时丢失焦点,但可以 duck,此时可以降低音量")}}// 创建音频属性private val audioAttributes: AudioAttributes = AudioAttributes.Builder().setUsage(AudioAttributes.USAGE_VOICE_COMMUNICATION) // USAGE_VOICE_COMMUNICATION: 当用途为语音通信(例如电话或 VoIP)时使用的使用值。.setContentType(AudioAttributes.CONTENT_TYPE_SPEECH) // CONTENT_TYPE_SPEECH:当内容类型为语音时使用的内容类型值。.build()// 创建焦点请求对象private val audioFocusRequest: AudioFocusRequest = AudioFocusRequest.Builder(AudioManager.AUDIOFOCUS_GAIN_TRANSIENT).setOnAudioFocusChangeListener(audioFocusChangedListener).setAudioAttributes(audioAttributes).build()override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(binding.root)binding.requestAudioFocus.setOnClickListener { requestAudioFocus() }binding.releaseAudioFocus.setOnClickListener { releaseAudioFocus() }}/** 请求音频焦点 */private fun requestAudioFocus() {// 请求音频焦点when (audioManager.requestAudioFocus(audioFocusRequest)) {AudioManager.AUDIOFOCUS_REQUEST_GRANTED -> log("请求焦点成功")AudioManager.AUDIOFOCUS_REQUEST_FAILED -> log("请求焦点失败")AudioManager.AUDIOFOCUS_REQUEST_DELAYED -> log("请求焦点失败,但一会可能会成功(通过监听器通知结果)")}}/** 释放音频焦点 */private fun releaseAudioFocus() {audioManager.abandonAudioFocusRequest(audioFocusRequest)}}

注:上面音频焦点API使用的是新出的API,在API 26才出的,也有过时的API可用,但是不推荐。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/844304.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2021职称继续教育--实行高水平对外开放,积极参与全球经济治理体系改革,开拓合作共赢新局面

单选题(共7题,每题5分) 1、根据本讲,我国目前已有()个省份设立了自贸区。 C、21 2、根据本讲,“一带一路”的官方翻译为()。 A、The Belt and Road Initiative 3、根据…

故障诊断 | 基于KAN故障诊断模型

效果一览 文章概述 故障诊断 | 基于 KAN故障诊断模型。KAN是一种全新的神经网络架构,它与传统的MLP架构不同,能够用更少的参数量在Science领域取得惊人的表现,并且具备可解释性,有望成为深度学习模型发展的一个重要方向。运用KAN&…

从0开始学web之信息收集

web1~源代码 web1:where is flag?直接右键源代码找到。 web2~源代码 无法查看源代码确实右键不了,F12用不了, 但是还可以在URL前加上view-source: web3~HTTP响应 web3:where is flag?右键源代码没有,那就看看HTTP 头,F12抓…

数据大屏方案 : 实现数据可视化的关键一环_光点科技

在数字时代的浪潮中,数据已经成为企业决策和操作的重要基础。因此,“数据大屏方案”逐渐成为业界关注的焦点。这类方案通过将复杂的数据集合以直观的形式展现出来,帮助决策者快速把握信息,做出更加明智的决策。 数据大屏的定义及作…

什么是银行虚拟户?

虚拟银行账户是一种不同于传统银行账户的银行服务形式。又称银行云账户,主要是一个结算账户,可以作为企业开立多个不同名称子账户的主账户。 这些子账户可以用于各种用途,包括企业核算、佣金支付等。,同时保证转账和报送的同音性…

机器学习-9-python中的pipeline以及sklearn中的pipeline

参考探秘Python的Pipeline魔法 参考sklearn之pipeline:pipeline函数/make_pipeline函数的简介及其区别联系、使用技巧、案例应用之详细攻略 参考Python函数式编程之pipeline——很酷有没有 1 什么是Pipeline? pipeline 管道借鉴于Unix Shell的管道操作——把若干个命令串起…

nginx 配置 gzip压缩及去除 html 缓存

server{listen 80;server_name test.exmaple.cn;gzip on; # 是否开启gzip# gzip_buffers 32 4K; # 缓冲(压缩在内存中缓冲几块? 每块多大?)gzip_comp_level 6; # 推荐6 压缩级别(级别越高,压的越小,越浪费CPU计算资源)gzip_min_length 1k; # 开始压缩的最小长度(再小就…

Java-数组内存解析

文章目录 1.内存的主要结构:栈、堆2.一维数组的内存解析3.二维数组的内存解析 1.内存的主要结构:栈、堆 2.一维数组的内存解析 举例1:基本使用 举例2:两个变量指向一个数组 3.二维数组的内存解析 举例1: 举例2&am…

java生产制造执行系统MES源码:系统环境:Java EE 8、Servlet 3.0、Apache Maven 3 2;

MES系统技术选型 系统环境:Java EE 8、Servlet 3.0、Apache Maven 3 2; 主框架:Spring Boot 2.2.x、Spring Framework 5.2.x、Spring Security 5.2.x 3 持久层:Apache MyBatis 3.5.x、Hibernate Validation 6.0.x、Alibaba Dru…

Ai绘画怎么正确使用关键词?

在AI绘画的过程中,关键词(提示词)是非常重要的组成部分,下面我以AI绘画常用的Stable Diffusion为例,来介绍下AI绘画怎么使用提示词吧! 一、提示词是什么 提示词(Prompt)就是我们对…

SOLIDWORKS 2024:零件亮点的升级与突破

随着科技的不断发展,工程设计软件也在持续进步,以更好地满足工程师和设计师的需求。SOLIDWORKS,作为一款广泛使用的三维CAD软件,一直在不断地推出新版本,以提供更强大、更便捷的功能。今天,我们将深入探讨S…

查找list集合中,持续时间>=ContinueTime的数据集合,保存在新的list中

在给定的包含时间戳的list中,查找连续continueNum次的且时间间隔为needDiff的集合。 eg:相邻两个数据的时间戳间隔为1分钟,且超过30分钟有数据 /**** param list 包含时间戳(10位)的list* param continueNum 至少持续…

初步研究Pose_300W_LP datasets.py

mat文件参数解读 Color_para:颜色参数,用于描述图像的颜色属性,比如图像的亮度、对比度等信息。 亮度属性、对比度属性、饱和度属性(颜色越鲜艳)、色调属性(色调越偏向蓝色)、色温属性&#xf…

Leecode热题100---二分查找---34:在排序数组中查找元素的第一个和最后一个的位置

题目: 给你一个按照非递减顺序排列的整数数组 nums,和一个目标值 target。请你找出给定目标值在数组中的开始位置和结束位置。 如果数组中不存在目标值 target,返回 [-1, -1]。 方法1、枚举 思路:通过正向枚举和反向枚举找到对应…

【EI会议】第二届计算机、物联网与智慧城市国际会议

第二届计算机、物联网与智慧城市国际会议 快速通道 投稿链接:loading 截稿时间:9月15日 检索:EI检索 一、会议信息 大会官网:www.ciotsc.org 会议地点:湖南株洲 会议时间:2023年11月15日-17日 二、征稿主…

Go语言redis框架 — go-redis

https://zhuanlan.zhihu.com/p/645669818 一、简述 1. API友好,命令名称和参数与Redis原生命令一致,使用简单方便。 2. 支持完整的Redis命令集,覆盖了字符串、哈希、列表、集合、有序集合、HyperLogLog等数据结构。 3. 支持连接池&#x…

MySQL中SQL表设计的注意事项

效率工具 推荐一个程序员的常用工具网站,效率加倍嘎嘎好用:程序员常用工具 云服务器 云服务器限时免费领:轻量服务器2核4G腾讯云:2核2G4M云服务器新老同享99元/年,续费同价阿里云:2核2G3M的ECS服务器只需99…

python读取xml列数据绘制3D散点图

python 读取excel 3d散点图 在Python中,要读取Excel文件并创建3D散点图,你可以使用pandas库来读取数据,然后使用matplotlib库来创建3D散点图。以下是一个简单的例子: 首先,确保安装了所需的库: pip inst…

初中地理的中考知识点 中考刷题

初中地理的中考知识点 小程序刷题,推荐用一叶兰 一,地球和地图 1、地球的形状是一个两极略扁,赤道略鼓的不规则的球体。地球的平均半径长是6371千米,赤道长约为4万千米。表面积约为5.1亿平方千米。 2、地球的自转所围绕的假想…