音頻焦點 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
英文地址,請注明出處:http://en.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.歸并排…