音频焦点 Android Audio Focus 进阶

旧焦点处理

示例调用链:

  1. requestAudioFocus() → propagateFocusLossFromGain_syncAf() → handleFocusLossFromGain()。
  2. 系统事件(如来电)→ 强制焦点变化 → handleFocusLossFromGain()。
函数
propagateFocusLossFromGain_syncAf 焦点持有者发生的焦点丢失通知
  1. 主要功能:
    • 当新的音频焦点请求到来时,通知当前所有焦点持有者可能发生的焦点丢失

    • 根据新的焦点增益类型决定哪些现有焦点持有者需要永久放弃焦点

    • 清理那些需要永久放弃焦点的持有者

  2. 关键处理逻辑:
    • 遍历当前焦点栈中的所有持有者,通知它们新的焦点变化

    • 对于多音频焦点模式,同样处理额外的焦点持有者列表

    • 收集所有需要永久放弃焦点的持有者并移除它们

  3. 参数作用:
    • focusGain: 新请求的焦点增益类型(如AUDIOFOCUS_GAIN等)

    • fr: 新的焦点请求者对象

    • forceDuck: 是否强制应用ducking效果(降低音量而非完全停止)

  4. 多音频焦点支持:
    • 当启用多音频焦点(mMultiAudioFocusEnabled)时,会额外处理mMultiAudioFocusList中的焦点持有者

/*** 当新的焦点请求到来时,传播相关的焦点丢失通知到当前焦点栈中的各个持有者。* 同时会移除那些收到永久性焦点丢失的栈条目。* * @param focusGain 新的焦点增益类型,将被添加到栈顶* @param fr 新的焦点请求者* @param forceDuck 是否强制应用 ducking 效果*/
@GuardedBy("mAudioFocusLock")
private void propagateFocusLossFromGain_syncAf(int focusGain, final FocusRequester fr,boolean forceDuck) {if (DEBUG) {Log.i(TAG, "propagateFocusLossFromGain_syncAf gain:" + focusGain);}// 创建一个列表来存储需要移除的客户端IDfinal List<String> clientsToRemove = new LinkedList<String>();// 遍历音频焦点栈,通知所有条目关于新的外部焦点增益if (!mFocusStack.empty()) {for (FocusRequester focusLoser : mFocusStack) {if (DEBUG) {Log.i(TAG, "propagateFocusLossFromGain_syncAf checking client:"+ focusLoser.getClientId());}// 处理焦点丢失,并判断是否是永久性丢失final boolean isDefinitiveLoss =focusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);if (isDefinitiveLoss) {// 如果是永久性丢失,则添加到移除列表clientsToRemove.add(focusLoser.getClientId());}}} else if (DEBUG) {Log.i(TAG, "propagateFocusLossFromGain_syncAf empty stack");}// 如果启用了多音频焦点且列表不为空,同样处理这些焦点持有者if (mMultiAudioFocusEnabled && !mMultiAudioFocusList.isEmpty()) {for (FocusRequester multifocusLoser : mMultiAudioFocusList) {final boolean isDefinitiveLoss =multifocusLoser.handleFocusLossFromGain(focusGain, fr, forceDuck);if (isDefinitiveLoss) {clientsToRemove.add(multifocusLoser.getClientId());}}}// 移除所有需要移除的焦点持有者for (String clientToRemove : clientsToRemove) {removeFocusStackEntry(clientToRemove, false /*signal*/,true /*notifyFocusFollowers*/);}
}
handleFocusLossFromGain
主要执行场景:
  1. 当有新的音频焦点请求时
    • 当一个新的应用请求音频焦点(如通过 requestAudioFocus())时,系统需要通知当前持有焦点的应用可能会失去焦点。

    • 该方法会被调用来检查当前焦点持有者是否需要因为新的焦点请求而失去焦点(或调整行为,如 ducking)。

  2. 焦点栈变化时
    • 在 propagateFocusLossFromGain_syncAf() 方法中,会遍历当前的焦点栈,对每个焦点持有者调用 handleFocusLossFromGain,以决定它们是否需要失去焦点或调整行为。

  3. 强制焦点变化时
    • 在某些系统事件(如来电、通知、系统强制打断)时,会触发焦点重新分配,该方法会被调用来处理当前焦点持有者的状态。

方法的作用:

• 该方法会根据新的焦点请求类型(如 AUDIOFOCUS_GAIN、AUDIOFOCUS_GAIN_TRANSIENT 等)和当前焦点持有者的状态,决定是否需要:

• 完全失去焦点(AUDIOFOCUS_LOSS)。

• 临时失去焦点(如 AUDIOFOCUS_LOSS_TRANSIENT)。

• 降低音量(ducking,AUDIOFOCUS_LOSS_TRANSIENT_CAN_DUCK)。

• 返回 true 表示焦点持有者需要被移除出焦点栈(永久失去焦点),false 表示可以保留在栈中(如临时失去焦点后可能恢复)。

/*** 处理由于给定焦点增益导致的焦点丢失。* @param focusGain 导致焦点丢失的焦点增益类型* @param frWinner 新的焦点所有者* @param forceDuck 是否强制闪避* @return 如果焦点丢失是永久性的则返回true,否则返回false*/
@GuardedBy

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

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

相关文章

MFC UI对话框

文章目录对话框模态对话框创建销毁关闭CDialog::OnCancel()EndDialog()CDialog::DestroyWindow()非模态对话框创建销毁关闭delete this对话框 模态对话框 ​​阻塞父窗口​​&#xff0c;强制用户先处理对话框。关闭前父窗口无法响应事件。 创建 推荐&#xff1a;非指针方式…

RabbitMQ--@RabbitListener及@RabbitHandle

两者区别 在 Spring AMQP 中&#xff0c;RabbitListener 和 RabbitHandler 是处理 RabbitMQ 消息的核心注解&#xff0c;但职责和使用场景完全不同。以下从 定义、区别、场景、示例 逐层解析&#xff1a;一、核心定义1. RabbitListener作用&#xff1a;标记 方法或类 为 Ra…

【基于CKF的IMM】MATLAB例程,CV和CT两个模型下的IMM,二维,滤波使用CKF(容积卡尔曼滤波),附下载链接

本程序实现了基于交互多模型&#xff08;IMM&#xff09;容积卡尔曼滤波&#xff08;CKF&#xff09;的多模型融合定位方法&#xff0c;并与纯CV−CKFCV-CKFCV−CKF&#xff08;匀速模型&#xff09;和CT−CKFCT-CKFCT−CKF&#xff08;匀角速度转弯模型&#xff09;方法对比。…

AI资讯日报 - 2025年07月28日

AI资讯日报 | 2025年07月28日 周一 今日核心要点 精华提炼 技术突破 • 腾讯混元&#xff1a;开源发布、3D技术 • 书生Intern&#xff1a;开源发布、多模态 企业动态 • AI工具集&#xff1a;协同创作、视频生成 数据概览分类数量重点关注技术突破2 条开源发布、3D技术企业动态…

大语言模型 LLM 通过 Excel 知识库 增强日志分析,根因分析能力的技术方案(1):总体介绍

文章大纲 1. 核心目标 2. 系统总体架构 3. Google Cloud 端到端方案(含无 RAG & RAG 双模式) 3.1 无 RAG:Function-Calling 查表模式 3.2 RAG:托管式向量检索 4. 开源轻量级方案 5. 数字孪生联合验证(实验性) 6. 知识图谱增强(Neo4j) 7. 监控与持续优化(CometLLM)…

Deepseek + browser-use 轻松实现浏览器自动化

在数字化时代&#xff0c;浏览器应用广泛&#xff0c;浏览器自动化可大幅提升效率。Deepseek 是强大的智能语言模型&#xff0c;能精准解析复杂指令&#xff0c;browser - use 是专注浏览器操作的工具&#xff0c;提供丰富 API 接口&#xff0c;支持主流浏览器的各类自动化操作…

开疆智能ModbusTCP转Profient网关连接西门子PLC与川崎机器人配置案例

本案例是西门子PLC与川崎机器人通过Profient转ModbusTCP网关进行通讯转换的配置案例&#xff0c;西门子作为profinet主站&#xff0c;机器人作为ModbusTCP服务器。配置过程&#xff1a;机器人配置川崎机器人控制器提供了RS232、以太网的通信接口&#xff0c;同时也可通过加装选…

Docker多主机网络连接:实现跨主机通信

Docker 是一种流行的容器化平台&#xff0c;它可以帮助开发人员更方便地构建、发布和管理应用程序。在 Docker 中&#xff0c;容器是独立运行的应用程序包装&#xff0c;包含了运行所需的所有文件、库和环境变量。Docker 提供了多种网络连接方式&#xff0c;使得容器之间可以进…

OSPF笔记

一、OSPF基础1、技术背景&#xff08;RIP中存在的问题&#xff09;RIP中存在最大跳数为15的限制&#xff0c;不能适应大规模组网周期性发送全部路由信息&#xff0c;占用大量的带宽资源路由收敛速度慢以跳数作为度量值存在路由环路可能性每隔30秒更新2、OSPF协议特点没有跳数限…

kotlin基础【3】

Kotlin Playground: Edit, Run, Share Kotlin Code Online 资料&#xff1a;kotlin实战 第一章 data class Person(val name: String,val age:Int?null)//允许接受以age为空&#xff0c;当为空将它赋值为null,如果不这么写直接写age:Int?是否可以fun main(args:Array<St…

Java-数构二叉树

1.树 1.1概念 树是一种非线性的数据结构&#xff0c;它是由n个有限节点组成一个具有层次关系。这种结构有以下特点&#xff1a; 一个特殊的结点&#xff0c;称为根节点&#xff0c;根节点没有前驱节点除根节点以外&#xff0c;其余节点分成M个互不相交的集合。每个集合又是一…

编程中水合的理解

在编程中&#xff0c;水合&#xff08;Hydration&#xff09; 是一个常见概念&#xff0c;尤其在 前端开发 和 服务端渲染&#xff08;SSR&#xff09; 场景中频繁出现。它的核心含义是&#xff1a;将静态内容“激活”为交互式动态内容。1. 水合的本质简单理解&#xff1a;水合…

使用ffmpeg转码h265后mac默认播放器不支持问题

由于mac自带录屏是mov并且文件特别大&#xff0c;我使用ffmpeg转码视频为h265使用如下命令ffmpeg_command [ffmpeg_path,"-i", input_path,"-c:v", "libx265","-preset", "veryslow","-map_metadata", "0&q…

支持MySQL、PostgreSQL和Redis集群部署,1Panel开源面板v2.0.5版本发布

2025年7月24日&#xff0c;现代化、开源的Linux服务器运维管理面板1Panel正式发布v2.0.5版本。在这一版本中&#xff0c;1Panel新增数据库集群部署、邮件告警和主从节点灵活切换三项功能&#xff0c;聚焦为企业级运维场景提供更优使用体验。 1Panel v2.0.5版本是1Panel开源面板…

GaussDB 数据库架构师修炼(九) 逻辑备份实操

1 逻辑备份定义 逻辑备份是指与业务有关的对象进行备份&#xff0c;这个对象包括表、表的数据、视图、索引、过程、函数等等。GaussDB支持逻辑备份的工具为gs_dump、gs_restore&#xff0c;以下举例说明。 2 创建举例数据 以下创建testdb库&#xff0c;创建test1模式&#xf…

c# Winform发布成独立文件

改造前&#xff1a; 通过发布页面&#xff0c;修改部署模式为独立&#xff0c;输出文件目录没有完全包含所有dll改造后&#xff1a;通过修改项目文件方式修改csproj前&#xff1a;<PropertyGroup><OutputType>WinExe</OutputType><TargetFramework>net…

Android基础(一) 运行HelloWorld

Android基础&#xff08;一&#xff09; 运行HelloWorld一、创建你的第一个Android项目二、创建HelloWorld项目三、安装并启动模拟器四、安装三方模拟器五、使用真机一、创建你的第一个Android项目 学习任何一门编程语言&#xff0c;编写的第一个程序都是Hello World&#xff0…

MongoDB 和 Elasticsearch(ES)区别

MongoDB 和 Elasticsearch&#xff08;ES&#xff09;都是流行的 NoSQL 数据库&#xff0c;但设计目标和适用场景有显著区别。以下是它们的核心差异和典型使用场景对比&#xff1a;1. 核心定位特性MongoDBElasticsearch数据库类型文档数据库&#xff08;通用型 OLTP&#xff09…

【C++算法】89.多源BFS_01 矩阵

文章目录题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;题目链接&#xff1a; 542. 01 矩阵 题目描述&#xff1a; 解法 先看懂题目 解法一&#xff1a;一个位置一个位置求&#xff08;最差的情况下会非常恐怖&#xff09; 解法二&#xff1a;多源BFS正…

数据结构之 【排序】(归并排序)

目录 1.递归实现归并排序的思想及图解 2.递归实现归并排序的代码逻辑 2.1嵌套子函数 2.2递归过程 2.3递归结束条件 2.4归并及拷贝过程 3.非递归实现归并排序的思想及图解 4.非递归实现归并排序的代码逻辑 4.1边归并边拷贝 4.2某一gap下归并完成才进行拷贝 5.归并排…