更新记录

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() 方法。

注意事项

  1. 动态权限:Android 6.0+ 需要动态申请权限,调用 requestPermission() 会弹出系统权限申请框
  2. 悬浮窗权限:悬浮窗功能需要在系统设置中手动开启悬浮窗权限
  3. 默认电话应用:通话拦截功能需要将应用设置为系统默认电话应用
  4. 硬件要求:部分功能需要设备支持电话功能(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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

<!-- 核心通话权限 --> <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" />

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

暂无用户评论。