RK3568/3588 Android 12 源碼默認使用藍牙mic錄音

遇到客戶一個需求,如果連接了帶mic的藍牙耳機,默認所有的錄音要走藍牙mic通道。

這個功能搞了好久,終于搞定了。

1. 向RK尋求幫助,先打通 bt sco能力。

此時,還無法默認就切換到藍牙 mic通道,接下來我們需求默認切換到藍牙通道。

2. 修改frameworks/av/services/audiopolicy/enginedefault/src/Engine.cpp,

默認走bt sco的mic錄音輸入源? ? ?

switch (inputSource) {
case AUDIO_SOURCE_DEFAULT:
case AUDIO_SOURCE_MIC:
device = availableDevices.getDevice(
AUDIO_DEVICE_IN_BLUETOOTH_A2DP, String8(""), AUDIO_FORMAT_DEFAULT);
if (device != nullptr) break;
if (audio_is_bluetooth_out_sco_device(commDeviceType)) {
device = availableDevices.getDevice(
AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, String8(""), AUDIO_FORMAT_DEFAULT);
if (device != nullptr) break;
}
device = availableDevices.getFirstExistingDevice({
+ ???????????????AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET,
AUDIO_DEVICE_IN_BLE_HEADSET, AUDIO_DEVICE_IN_WIRED_HEADSET,
AUDIO_DEVICE_IN_USB_HEADSET, AUDIO_DEVICE_IN_USB_DEVICE,
AUDIO_DEVICE_IN_BLUETOOTH_BLE, AUDIO_DEVICE_IN_BUILTIN_MIC});
break;


case AUDIO_SOURCE_CAMCORDER:
// For a device without built-in mic, adding usb device
device = availableDevices.getFirstExistingDevice({
- ? ? ? ? ? ? ? AUDIO_DEVICE_IN_USB_DEVICE,
+ ? ? ? ? ? ? ?AUDIO_DEVICE_IN_BLUETOOTH_SCO_HEADSET, AUDIO_DEVICE_IN_USB_DEVICE,
AUDIO_DEVICE_IN_BACK_MIC, AUDIO_DEVICE_IN_BUILTIN_MIC});
break;
case AUDIO_SOURCE_VOICE_DOWNLINK:

3. 很關鍵的一步,在一個常駐service里邊(或者可以在system ui模塊實現)監聽插入藍牙耳機,進行默認sco模式切換

IntentFilter filter = new IntentFilter();
filter.addAction(BluetoothDevice.ACTION_ACL_CONNECTED);
filter.addAction(BluetoothDevice.ACTION_ACL_DISCONNECTED);
registerReceiver(myReceiver, filter);
BroadcastReceiver myReceiver = new BroadcastReceiver() {@Overridepublic void onReceive(Context context, Intent intent) {if (BluetoothDevice.ACTION_ACL_CONNECTED.equals(intent.getAction())) {Log.d("mod@bt", "bt connected");startBluetoothRecording(context);});} else if (BluetoothDevice.ACTION_ACL_DISCONNECTED.equals(intent.getAction())) {Log.d("mod@bt", "bt disconnected");stopRecording(context);}}}
};

? ? public void startBluetoothRecording(Context context) {
try {
AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

? ? ? ? ? ? if (!audioManager.isBluetoothScoOn()) {
audioManager.setMode(AudioManager.MODE_IN_COMMUNICATION);
audioManager.setBluetoothScoOn(true);
audioManager.startBluetoothSco();
}
} catch (Exception e) {
e.printStackTrace();
}
}

? ? public void stopRecording(Context context) {
try {

? ? ? ? ? ? AudioManager audioManager = (AudioManager) context.getSystemService(Context.AUDIO_SERVICE);

? ? ? ? ? ? if (audioManager.isBluetoothScoOn()) {
audioManager.setBluetoothScoOn(false);
audioManager.stopBluetoothSco();

? ? ? ? ? ? }

? ? ? ? ? ? audioManager.setMode(AudioManager.MODE_NORMAL);
audioManager.setSpeakerphoneOn(true);
} catch (Exception e) {
e.printStackTrace();
}
}

4. 如上操作后,每次即使應用選擇了系統默認mic,也會走bt sco通道錄音。

5. 當然,可能會遇到其他的優化問題,如果你有需求,歡迎給我留言。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/88855.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/88855.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/88855.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解鎖HTTP:從理論到實戰的奇妙之旅

目錄一、HTTP 協議基礎入門1.1 HTTP 協議是什么1.2 HTTP 協議的特點1.3 HTTP 請求與響應的結構二、HTTP 應用場景大揭秘2.1 網頁瀏覽2.2 API 調用2.3 文件傳輸2.4 內容分發網絡(CDN)2.5 流媒體服務三、HTTP 應用實例深度剖析3.1 使用 JavaScript 的 fetc…

uvm_config_db examples

通過uvm_config_db類訪問的UVM配置數據庫,是在多個測試平臺組件之間傳遞不同對象的絕佳方式。 methods 有兩個主要函數用于從數據庫中放入和檢索項目,分別是 set() 和 get()。 static function void set ( uvm_component cntxt,string inst_name,string …

(C++)任務管理系統(文件存儲)(正式版)(迭代器)(list列表基礎教程)(STL基礎知識)

目錄 前言: 源代碼: 代碼解析: 一.頭文件和命名空間 1. #include - 輸入輸出功能2. #include - 鏈表容器3. #include - 字符串處理4. using namespace std; - 命名空間 可視化比喻:建造房子 🏠 二.menu()函數 …

Java 中的異步編程詳解

前言 在現代軟件開發中,異步編程(Asynchronous Programming) 已經成為構建高性能、高并發應用程序的關鍵技術之一。Java 作為一門廣泛應用于后端服務開發的語言,在其發展過程中不斷引入和優化異步編程的支持。從最初的 Thread 和…

MySQL邏輯刪除與唯一索引沖突解決

問題背景 在MySQL數據庫設計中,邏輯刪除(軟刪除)是一種常見的實踐,它通過設置標志位(如is_delete)來標記記錄被"刪除",而不是實際刪除數據。然而,當表中存在唯一約束時&am…

php命名空間用正斜杠還是反斜杠?

在PHP中,命名空間使用反斜杠(\)作為分隔符,這是PHP語言規范明確規定的。反斜杠在命名空間中扮演路徑分隔的角色,用于區分不同層級的命名空間。 具體說明:語法規則 PHP命名空間使用反斜杠(\&…

《從依賴糾纏到接口協作:ASP.NET Core注入式開發指南》

在C#的ASP.NET Core開發中,依賴注入絕非簡單的技術技巧,而是重構代碼關系的底層邏輯。它像一套隱形的神經網絡,讓程序模塊擺脫硬編碼的束縛,在運行時實現動態連接,從而為系統注入可測試、可進化的核心生命力。理解其深…

星云ERP本地環境搭建筆記

看到星云ERP兩個比較實用的功能,編號規則和打印模板,如下圖所示,于是本地跑起來學習學習。開發環境必備:1. JDK 1.82. MySQL 5.73. Redis 44. RabbitMQ 3.12.45. nodejs 206. pnpm 9.7.1 (npm install -g pnpm9.7.1)其他開發工具&…

RedisJSON 的 `JSON.ARRAPPEND`一行命令讓數組動態生長

1 、 為什么選擇 JSON.ARRAPPEND 在傳統的鍵值模型里,若要往數組尾部追加元素,通常需要 取→改→寫 三步: GET 整個 JSON;在應用層把元素 push 進數組;SET 回 Redis。 一條 JSON.ARRAPPEND 則可一次完成,具…

14:00開始面試,14:08就出來了,問的問題有點變態。。。

從小廠出來,沒想到在另一家公司又寄了。 到這家公司開始上班,加班是每天必不可少的,看在錢給的比較多的份上,就不太計較了。沒想到4月一紙通知,所有人不準加班,加班費不僅沒有了,薪資還要降40%…

Unity物理系統由淺入深第四節:物理約束求解與穩定性

Unity物理系統由淺入深第一節:Unity 物理系統基礎與應用 Unity物理系統由淺入深第二節:物理系統高級特性與優化 Unity物理系統由淺入深第三節:物理引擎底層原理剖析 Unity物理系統由淺入深第四節:物理約束求解與穩定性 物理引擎的…

深入淺出Kafka Consumer源碼解析:設計哲學與實現藝術

一、Kafka Consumer全景架構 1.1 核心組件交互圖 #mermaid-svg-JDEEOd2M5PzLkYa6 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-JDEEOd2M5PzLkYa6 .error-icon{fill:#552222;}#mermaid-svg-JDEEOd2M5PzLkYa6 .erro…

Matplotlib(一)- 數據可視化與Matplotlib

文章目錄一、數據可視化1. 數據可視化的概念2. 數據可視化流程3. 數據可視化目的4. 常見的可視化圖表4.1 折線圖4.2 柱形圖4.3 條形圖4.4 堆積圖4.4.1 堆積面積圖4.4.2 堆積柱形圖和堆積條形圖4.5 直方圖4.6 箱形圖4.7 餅圖4.8 散點圖4.9 氣泡圖4.10 誤差棒圖4.11 雷達圖二、Py…

傳輸層協議UDP原理

端口號回顧端口號的作用類似pid,用來標識進程的唯一性。只是為了與系統解耦,所以有了端口號。通過ip來確定唯一主機,再通過端口號找到指定的進程。就可以讓全網內唯一的兩個進程通信了。所以一個完整的報文至少要攜帶ip和端口號,i…

【牛客刷題】小紅的數字刪除

文章目錄 一、題目介紹1.1 題目描述1.2 輸入描述:1.3 輸出描述:1.4 示例11.5 示例2二、解題思路2.1 核心觀察2.2 關鍵問題處理三、算法實現四、算法分析4.1 算法流程圖4.2 為什么這么設計算法?4.3 算法復雜度五、模擬演練數據示例1: "103252"示例2: "333&quo…

《大數據技術原理與應用》實驗報告三 熟悉HBase常用操作

目 錄 一、實驗目的 二、實驗環境 三、實驗內容與完成情況 3.1 用Hadoop提供的HBase Shell命令完成以下任務 3.2 現有以下關系型數據庫中的表和數據,要求將其轉換為適合于HBase存儲的表并插入數據: 四、問題和解決方法 五、心得體會 一、實驗目的…

微服務初步入門

服務拆分原則 單一職責原則 單一職責原則原本是面向對象設計的一個基本原則,是指一個類應該專注于單一的功能,不要存在多于一個導致類變更的原因 在微服務架構中,是指一個微服務只負責一個功能或者業務領域,每個服務應該由清晰的定…

Liunx操作系統筆記5

用戶管理命令: useradd命令: useradd命令的功能是創建并設置用戶信息。使用useradd命令可以自動完成用戶信息、基本組、家目錄等的創建工作,并在創建過程中對用戶初始信息進行定制。語法格式:useradd 參數 用戶名常用參數: -M 不建立用…

spring-ai-alibaba 接入Tushare查詢股票行情

最近spring-ai-alibaba主干分支新增了對Tushare的支持&#xff0c;一起來看看如何使用簡單樣例老樣子&#xff0c;分三步進行&#xff1a;第一步&#xff1a;添加依賴<dependency><groupId>com.alibaba.cloud.ai</groupId><artifactId>spring-ai-aliba…

Java使用Langchai4j接入AI大模型的簡單使用(一)

一、LangChain4j 簡介 LangChain4j 是 Java 生態中的 LangChain 實現&#xff0c;是一個用于構建大語言模型(LLM)應用程序的框架。它提供了與各種LLM服務集成的能力&#xff0c;并簡化了構建復雜AI應用的過程。 LangChain4j官方文檔&#xff1a;Integrations | LangChain4j …