鴻蒙ArkTS開發:微信/系統來電通話監聽功能實現

本文將介紹如何在鴻蒙應用中使用ArkTS實現通話監聽和錄音功能,利用harmony-utils工具庫簡化開發流程。

工具庫地址

一、功能概述

本實現包含以下核心功能:

  1. 通話狀態監聽:檢測來電、去電和通話中狀態

  2. 音頻流監控:通過麥克風使用情況判斷是否在通話

  3. 權限管理:動態申請麥克風和通話記錄權限

  4. 狀態管理:15秒寬限期后執行鎖定操作

二、完整實現代碼

import { PermissionUtil, ToastUtil } from "@pura/harmony-utils";
import { audio } from "@kit.AudioKit";
import { call, observer } from "@kit.TelephonyKit";@Entry
@Component
struct CallMonitorPage {private stillTalking: boolean = false; // 是否在通話中aboutToDisappear() {// 釋放資源let am = audio.getAudioManager();let audioStreamManager = am.getStreamManager();audioStreamManager.off('audioCapturerChange');observer.off('callStateChange')}// 檢測到通話后的處理private hearPhone() {if (this.stillTalking) return;ToastUtil.showToast('檢測到通話中,15秒后將鎖定頁面~');this.stillTalking = true;setTimeout(() => {if (this.stillTalking) {// 這里可以添加鎖定頁面的邏輯ToastUtil.showToast('頁面已鎖定,請結束通話后繼續');}}, 15000);}// 申請錄音監聽權限async useAudioStreamManager() {// 1. 檢查麥克風權限PermissionUtil.checkRequestPermissions("ohos.permission.MICROPHONE").then((res) => {if (!res) {// 2. 如果沒有權限則申請PermissionUtil.requestPermissionOnSetting("ohos.permission.MICROPHONE").then((res) => {if (!res) {ToastUtil.showToast('請給予錄音權限~');}this.onHear();});} else {this.onHear();}});// 3. 檢查通話記錄權限PermissionUtil.checkRequestPermissions("ohos.permission.READ_CALL_LOG").then(() => {// 4. 檢查當前是否有通話if (call.getCallStateSync()) {this.hearPhone();}// 5. 監聽主卡槽通話狀態變化observer.on('callStateChange', { slotId: 0 }, (data) => {this.handleCallStateChange(data);});// 6. 監聽副卡槽通話狀態變化observer.on('callStateChange', { slotId: 1 }, (data) => {this.handleCallStateChange(data);});});}// 處理通話狀態變化private handleCallStateChange(data) {// 來電狀態if (data.state === 0) {this.stillTalking = false;return;}// 通話中狀態(包括保持狀態)if ([3].includes(data.state)) {this.hearPhone();}}// 監聽音頻流變化private onHear() {let am = audio.getAudioManager();let audioStreamManager = am.getStreamManager();// 檢查當前是否有音頻活動if (audioStreamManager.isActiveSync(0)) {this.hearPhone();}// 監聽音頻捕獲變化audioStreamManager.on('audioCapturerChange', () => {setTimeout(() => {if (audioStreamManager.isActiveSync(0)) {// 通話中this.hearPhone();} else {this.stillTalking = false;}}, 500);});}build() {Column() {Button('開始監聽通話').onClick(() => {this.useAudioStreamManager();}).margin(20).width('80%')}.width('100%').height('100%')}
}
其中系統來電采用observer.on('callStateChange')監聽,而微信來電使用audioStreamManager.on('audioCapturerChange')有沒有在錄音來監聽,理論其他APP也是可以監聽到的

三、權限配置

module.json5中添加以下權限聲明:

json

{"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "需要錄音權限"}]}
}

四、核心API說明

API說明
call.getCallStateSync()獲取當前通話狀態
observer.on('callStateChange')監聽通話狀態變化
audioStreamManager.isActiveSync(0)檢測音頻流是否活躍
PermissionUtil.checkRequestPermissions()檢查并申請權限
PermissionUtil.requestPermissionOnSetting()二次申請權限

五、通話狀態值說明

-1無效狀態,當獲取呼叫狀態失敗時返回。
0表示沒有正在進行的呼叫。
1表示來電正在振鈴或等待。
2表示至少有一個呼叫處于撥號、通話中或呼叫保持狀態,并且沒有新的來電振鈴或等待。
3表示來電已經接聽。

六、實現原理

  1. 雙重檢測機制

    • 通過系統通話狀態API直接檢測

    • 通過音頻流變化間接檢測

  2. 權限管理

    • 使用harmony-utils簡化權限申請流程

    • 優雅處理權限拒絕情況

  3. 狀態管理

    • 設置15秒寬限期,避免誤判

    • 使用標志位防止重復處理

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

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

相關文章

NFS 重傳次數速率監控

這張圖展示的是 NFS 重傳次數速率監控,具體解釋如下: 1. 指標含義 監控指標 node_nfs_rpc_retransmissions_total 統計 NFS(網絡文件系統)通信中 RPC(遠程過程調用)的重傳次數,rate(node_nfs_…

【 <二> 丹方改良:Spring 時代的 JavaWeb】之 Spring Boot 中的國際化:支持多語言的 RESTful API

<前文回顧> 點擊此處查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、開篇整…

黑帽SEO之搜索引擎劫持-域名劫持原理分析

問題起源 這是在《Web安全深度剖析》的第二章“深入HTTP請求流程”的2.3章節“黑帽SEO之搜索引擎劫持”提到的內容&#xff0c;但是書中描述并不詳細&#xff0c;沒有講如何攻擊達到域名劫持的效果。 書中對SEO搜索引擎劫持的現象描述如下&#xff1a;直接輸入網站的域名可以進…

theos工具來編譯xcode的swiftUI項目為ipa文件

Theos 是一個開源的開發工具套件&#xff0c;主要用于為 iOS/macOS 平臺開發和編譯 越獄插件&#xff08;Tweaks&#xff09;、動態庫、命令行工具等。它由 Dustin Howett 創建&#xff0c;并被廣泛用于越獄社區的開發中。但這里我主要使用它的打包ipa功能&#xff0c;因為我的…

25.4.1學習總結【Java】

動態規劃題 2140. 解決智力問題https://leetcode.cn/problems/solving-questions-with-brainpower/ 給你一個下標從 0 開始的二維整數數組 questions &#xff0c;其中 questions[i] [pointsi, brainpoweri] 。 這個數組表示一場考試里的一系列題目&#xff0c;你需要 按順…

計算機網絡知識點匯總與復習——(二)物理層

Preface 計算機網絡是考研408基礎綜合中的一門課程&#xff0c;它的重要性不言而喻。然而&#xff0c;計算機網絡的知識體系龐大且復雜&#xff0c;各類概念、協議和技術相互關聯&#xff0c;讓人在學習時容易迷失方向。在進行復習時&#xff0c;面對龐雜的的知識點&#xff0c…

string的底層原理

一.構造函數 我們來看一下&#xff0c;string的底層就是一個字符型指針和一個size來表示string的大小&#xff0c;capacity來表示分配的內存大小。 我們來看我們注釋掉的第一個構造函數&#xff0c;我們是通過初始化列表來初始化size的大小&#xff0c;再通過size的大小來初始化…

Python FastAPI + Celery + RabbitMQ 分布式圖片水印處理系統

FastAPI 服務器Celery 任務隊列RabbitMQ 作為消息代理定時任務處理 首先創建項目結構&#xff1a; c:\Users\Administrator\Desktop\meitu\ ├── app/ │ ├── __init__.py │ ├── main.py │ ├── celery_app.py │ ├── tasks.py │ └── config.py…

【藍橋杯】每日練習 Day18

目錄 前言 動態求連續區間和 分析 代碼 數星星 分析 代碼 星空之夜 分析 代碼 前言 接下來是今天的題目&#xff08;本來是有四道題的但是有一道題是前面講過&#xff08;逆序數的&#xff0c;感興趣的小伙伴可以去看我歸并排序的那一篇&#xff09;的我就不再過多贅…

基于銀河麒麟桌面服務器操作系統的 DeepSeek本地化部署方法【詳細自用版】

一、3種方式使用DeepSeek 1.本地部署 服務器操作系統環境進行,具體流程如下(桌面環境步驟相同): 本例所使用銀河麒麟高級服務器操作系統版本信息: (1)安裝ollama 方式一:按照ollama官網的下載指南,執行如下命令: curl -fsSL https://ollama.com/install.sh | sh方…

Python入門(7):Python序列結構-字典

字典Dictionary 字典(dictionary)和列表類似&#xff0c;也是可變序列&#xff0c;不過與列表不同&#xff0c;它是無序的可變序列&#xff0c;保存的為容是以“鍵-值對”的形式存放的。 Python 中的字典相當于 Java 或者 C中的 Map 對象。在C#中,就是Dictionary<TKey,TVa…

Flutter項目之構建打包分析

目錄&#xff1a; 1、準備部分2、構建Android包2.1、配置修改部分2.2、編譯打包 3、構建ios包3.1、配置修改部分3.2、編譯打包 1、準備部分 2、構建Android包 2.1、配置修改部分 2.2、編譯打包 執行flutter build apk命令進行打包。 3、構建ios包 3.1、配置修改部分 3.2、編譯…

不用再付費~全網書源一鍵下載,實現閱讀自由!!!

現在市面上有許多免費你看書的軟件&#xff0c;但都軟件內太多廣告彈窗&#xff0c;這無疑是很煩&#xff0c;有事一不小心點進去就下載了軟件&#xff0c;簡直讓人頭大&#xff01; 如果你遇到這樣的難題那么就應該看下本文~ 這是一款能一鍵將在線連載小說整合下載成標準格式&…

GCC RISCV 后端 -- GIMPLE IR 表示的一些理解

C/C源代碼經過 GCC 解析&#xff08;Parse&#xff09;及轉換后&#xff0c;通過 GIMPLE IR 予以表示&#xff08;Representation&#xff09;。其中&#xff0c;一個C/C源文件&#xff0c;通過 宏處理后&#xff0c;形成一個 轉譯單元&#xff08;Translation Unit&#xff09…

JAVA設計模式之適配器模式《太白金星有點煩》

太白金星握著月光凝成的鼠標&#xff0c;第108次檢查南天門服務器的運行日志。這個剛從天樞院調來的三等仙官&#xff0c;此刻正盯著瑤池主機房里的青銅鼎發愁——鼎身上"天地同壽"的云紋間&#xff0c;漂浮著三界香火系統每分鐘吞吐的十萬條功德數據。看著居高不下的…

以太坊DApp開發腳手架:Scaffold-ETH 2 詳細介紹與搭建教程

一、什么是Scaffold-ETH 2 Scaffold-ETH 2是一個開源的最新工具包&#xff0c;類似于腳手架。用于在以太坊區塊鏈上構建去中心化應用程序 &#xff08;DApp&#xff09;。它旨在使開發人員更容易創建和部署智能合約&#xff0c;并構建與這些合約交互的用戶界面。 Scaffold-ETH…

畢業設計:實現一個基于Python、Flask和OpenCV的人臉打卡Web系統(六)

畢業設計:實現一個基于Python、Flask和OpenCV的人臉打卡Web系統(六) Flask Flask是一個使用 Python 編寫的輕量級 Web 應用框架。其 WSGI 工具箱采用 Werkzeug ,模板引擎則使用 Jinja2 。Flask使用 BSD 授權。 Flask也被稱為 “microframework” ,因為它使用簡單的核心,…

第十一章 VGA顯示圖片(還不會)

FPGA至簡設計實例 前言 一、項目背景 1. IP核概述 IP 核(Intellectual Property core)指的是知識產權核或知識產權模塊,其是具有特定電路功能的硬件描述語言程序,在EDA技術開發中具有十分重要的地位。美國著名的Dataquest咨詢公司將 半導體產業的IP定義為“用于ASIC或FPGA…

浙江大學公開課|第二季|從大模型、智能體到復雜AI應用系統的構建——以產業大腦為例

大家好&#xff0c;我是吾鳴。 前沿回顧 吾鳴之前給大家分享過浙江大學DeepSeek系列公開課第一季&#xff0c;第一季一共八講&#xff0c;內容介紹豐富&#xff0c;內容之廣&#xff0c;看完粉絲朋友直呼浙大良心。這八講公開課名稱分別是&#xff1a; 第一期&#xff08;上&…

Spring AOP中為所有類型通知傳遞參數的完整示例,包含詳細注釋和參數傳遞方式

以下是Spring AOP中為所有類型通知傳遞參數的完整示例&#xff0c;包含詳細注釋和參數傳遞方式&#xff1a; // 1. 目標類&#xff08;被增強的類&#xff09; package com.example;public class TargetService {public void doTask(String param) {System.out.println("…