更新记录
1.0.0(2026-05-13)
悬浮窗
| 方法 |
参数 |
说明 |
showFloatingPanel(phoneNumber, displayNumber?) |
string, string? |
显示悬浮面板 |
hideFloatingPanel() |
- |
隐藏悬浮面板 |
通话拦截
| 方法 |
参数 |
说明 |
enableCallIntercept() |
- |
启用通话拦截 |
disableCallIntercept() |
- |
禁用通话拦截 |
平台兼容性
uni-app(5.06)
| Vue2 |
Vue3 |
Chrome |
Safari |
app-vue |
app-nvue |
Android |
iOS |
鸿蒙 |
| - |
- |
- |
- |
- |
- |
√ |
- |
- |
| 微信小程序 |
支付宝小程序 |
抖音小程序 |
百度小程序 |
快手小程序 |
京东小程序 |
鸿蒙元服务 |
QQ小程序 |
飞书小程序 |
小红书小程序 |
快应用-华为 |
快应用-联盟 |
| - |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
- |
uni-app x(5.06)
| Chrome |
Safari |
Android |
iOS |
鸿蒙 |
微信小程序 |
| - |
- |
√ |
- |
- |
- |
CallMonitor UTS 插件
通话监控与控制插件,支持来电去电监听、通话控制、悬浮窗、通话拦截等功能。
功能特性
| 功能 |
说明 |
| 📞 通话状态监听 |
实时监听来电、去电、通话状态变化(idle/ringing/offhook) |
| 📱 通话控制 |
拨号、挂断、接听 |
| 🔒 权限管理 |
完整的通话权限检查与申请 |
| 🪟 悬浮窗 |
显示悬浮通话面板 |
| 🚫 通话拦截 |
支持来电拦截功能 |
| 🎙️ 音频控制 |
静音、免提等音频控制(预留) |
目录结构
uni_modules/
└── call-monitor/ # 插件根目录
├── package.json # 插件配置
├── readme.md # 本文档
├── utssdk/ # UTS 插件目录
│ ├── interface.uts # 统一接口声明
│ ├── app-android/ # Android 平台
│ │ ├── build.gradle # Gradle 配置
│ │ ├── AndroidManifest.xml # Android 清单
│ │ ├── index.uts # UTS 主入口
│ │ ├── libs/ # 原生库目录
│ │ ├── src/main/
│ │ │ ├── java/io/dcloud/callmonitor/
│ │ │ │ ├── CallActivity.java # 自定义通话界面
│ │ │ │ ├── CustomCallConnection.java # 自定义连接
│ │ │ │ ├── CallConnectionHolder.java # 连接持有者
│ │ │ │ ├── MyCallService.java # ConnectionService
│ │ │ │ ├── CustomInCallService.java # InCallService
│ │ │ │ ├── CustomConnectionService.java
│ │ │ │ ├── CustomDialerActivity.java # 拨号界面
│ │ │ │ ├── FloatingCallActivity.java # 悬浮面板
│ │ │ │ ├── FloatingPanelReceiver.java # 广播接收器
│ │ │ │ └── PhoneAccountRegister.java # 账户注册
│ │ │ └── res/
│ │ │ ├── layout/activity_call.xml # 通话界面布局
│ │ │ └── drawable/*.xml # 按钮背景
│ └── app-ios/ # iOS 平台(待实现)
└── app-android-harmony/ # 鸿蒙平台(待实现)
安装使用
1. 安装插件
将 call-monitor 插件文件夹复制到项目的 uni_modules 目录:
your-project/
├── uni_modules/
│ └── call-monitor/ # 复制此文件夹
├── pages/
├── static/
└── ...
2. 引入插件
// 方式一:直接导入
import CallMonitor from '@/uni_modules/call-monitor';
// 方式二:按需导入
import {
init,
startListening,
hangUp,
answer
} from '@/uni_modules/call-monitor';
3. 基本使用示例
// pages/call/call.vue
export default {
data() {
return {
callState: 'idle',
currentNumber: ''
}
},
onLoad() {
// 初始化
CallMonitor.init((res) => {
console.log('初始化:', res);
if (res.success) {
this.startMonitor();
}
});
},
methods: {
// 开始监听
startMonitor() {
// 设置事件回调
CallMonitor.setEventCallback((event) => {
console.log('通话事件:', event.event, event.data);
this.handleCallEvent(event);
});
// 开始监听
CallMonitor.startListening();
},
// 处理通话事件
handleCallEvent(event) {
switch (event.event) {
case 'ringing':
this.callState = 'ringing';
this.currentNumber = event.data;
break;
case 'offhook':
this.callState = 'offhook';
break;
case 'idle':
this.callState = 'idle';
break;
}
},
// 拨号
makeCall() {
CallMonitor.directDial('***', (res) => {
console.log('拨号结果:', res);
});
},
// 挂断
hangUp() {
CallMonitor.hangUp((res) => {
console.log('挂断结果:', res);
});
},
// 接听
answerCall() {
CallMonitor.answer((res) => {
console.log('接听结果:', res);
});
},
// 检查权限
checkPermissions() {
CallMonitor.checkPermission((res) => {
if (!res.granted) {
// 请求权限
CallMonitor.requestPermission();
}
});
}
},
onUnload() {
// 停止监听
CallMonitor.stopListening();
}
}
API 文档
初始化
| 方法 |
参数 |
说明 |
init(callback) |
(result: InitResult) => void |
初始化模块 |
通话状态监听
| 方法 |
参数 |
说明 |
setEventCallback(callback) |
(event: CallEvent) => void |
设置事件回调 |
startListening() |
- |
开始监听通话状态 |
stopListening() |
- |
停止监听通话状态 |
getCallState(callback) |
(result: CallStateResult) => void |
获取当前通话状态 |
权限管理
| 方法 |
参数 |
说明 |
checkPermission(callback) |
(result: PermissionResult) => void |
检查通话权限 |
requestPermission(callback) |
(result: ActionResult) => void |
请求通话权限 |
checkOverlayPermission(callback) |
(result: OverlayPermissionResult) => void |
检查悬浮窗权限 |
requestOverlayPermission(callback) |
(result: ActionResult) => void |
请求悬浮窗权限 |
通话控制
| 方法 |
参数 |
说明 |
dialPhone(number) |
string |
使用系统拨号界面拨号 |
directDial(number, callback) |
string, (result: ActionResult) => void |
直接拨号 |
hangUp(callback) |
(result: ActionResult) => void |
挂断电话 |
answer(callback) |
(result: ActionResult) => void |
接听电话 |
悬浮窗
| 方法 |
参数 |
说明 |
showFloatingPanel(phoneNumber, displayNumber?) |
string, string? |
显示悬浮面板 |
hideFloatingPanel() |
- |
隐藏悬浮面板 |
通话拦截
| 方法 |
参数 |
说明 |
enableCallIntercept() |
- |
启用通话拦截 |
disableCallIntercept() |
- |
禁用通话拦截 |
事件列表
| 事件名 |
说明 |
数据 |
idle |
通话空闲 |
电话号码 |
ringing |
来电响铃 |
电话号码 |
offhook |
通话中 |
电话号码 |
outgoing |
去电 |
电话号码 |
incoming |
来电 |
电话号码 |
call_started |
通话开始 |
电话号码 |
call_answered |
通话已接听 |
- |
call_ended |
通话结束 |
- |
listening_started |
监听开始 |
- |
listening_stopped |
监听停止 |
- |
Android 权限说明
本插件需要以下权限(已在 AndroidManifest.xml 中声明):
<!-- 核心通话权限 -->
<uses-permission android:name="android.permission.CALL_PHONE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.ANSWER_PHONE_CALLS" />
<uses-permission android:name="android.permission.READ_CALL_LOG" />
<uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" />
<uses-permission android:name="android.permission.MANAGE_OWN_CALLS" />
<!-- 系统服务绑定权限 -->
<uses-permission android:name="android.permission.BIND_INCALL_SERVICE" />
<uses-permission android:name="android.permission.BIND_TELECOM_CONNECTION_SERVICE" />
<!-- 悬浮窗权限 -->
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
<!-- 音频相关 -->
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
<!-- 其他 -->
<uses-permission android:name="android.permission.WAKE_LOCK" />
<uses-permission android:name="android.permission.DISABLE_KEYGUARD" />
<uses-permission android:name="android.permission.READ_CONTACTS" />
注意:Android 6.0+ 需要动态申请权限,请调用 requestPermission() 方法。
注意事项
- 动态权限:Android 6.0+ 需要动态申请权限,调用
requestPermission() 会弹出系统权限申请框
- 悬浮窗权限:悬浮窗功能需要在系统设置中手动开启悬浮窗权限
- 默认电话应用:通话拦截功能需要将应用设置为系统默认电话应用
- 硬件要求:部分功能需要设备支持电话功能(CDMA/GSM)
编译打包
1. 确保 HBuilderX 版本
- 最低版本:HBuilderX 3.6.9+
- 推荐版本:HBuilderX 4.0+
2. 配置 build.gradle
如需添加额外依赖,请在 utssdk/app-android/build.gradle 中添加:
dependencies {
implementation 'com.example:library:1.0.0'
}
3. 打包 aar(高级)
如需将原生代码打包为独立的 aar 文件:
cd utssdk/app-android
./gradlew assembleRelease
生成的 aar 文件位于 build/outputs/aar/ 目录。
版本历史
1.0.0 (2024-xx-xx)
- ✨ 初始版本
- ✅ 支持通话状态监听
- ✅ 支持通话控制(拨号、挂断、接听)
- ✅ 支持权限管理
- ✅ 支持悬浮窗
- ✅ 支持通话拦截
- ✅ 保留自定义通话界面
技术支持
如有问题,请提交 Issue 或联系开发者。
许可协议
MIT License