本文將介紹如何在鴻蒙應用中使用ArkTS實現通話監聽和錄音功能,利用harmony-utils
工具庫簡化開發流程。
工具庫地址
一、功能概述
本實現包含以下核心功能:
-
通話狀態監聽:檢測來電、去電和通話中狀態
-
音頻流監控:通過麥克風使用情況判斷是否在通話
-
權限管理:動態申請麥克風和通話記錄權限
-
狀態管理: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 | 表示來電已經接聽。 |
六、實現原理
-
雙重檢測機制:
-
通過系統通話狀態API直接檢測
-
通過音頻流變化間接檢測
-
-
權限管理:
-
使用harmony-utils簡化權限申請流程
-
優雅處理權限拒絕情況
-
-
狀態管理:
-
設置15秒寬限期,避免誤判
-
使用標志位防止重復處理
-