更新记录

1.0.0(2026-08-08)

  • 新版发布

平台兼容性

uni-app(4.87)

Vue2 Vue3 Chrome Safari app-vue app-nvue Android iOS 鸿蒙
× × 5.0 × ×
微信小程序 支付宝小程序 抖音小程序 百度小程序 快手小程序 京东小程序 鸿蒙元服务 QQ小程序 飞书小程序 小红书小程序 快应用-华为 快应用-联盟
× × × × × × × × × × × ×

uni-app x(4.87)

Chrome Safari Android iOS 鸿蒙 微信小程序
- - 5.0 - - -

yt-callphone

面向 uni-app-x / uni-app 的 Android 通话能力 UTS 插件。

特别提醒

  • 购买本插件前,请先试用,请先试用,请先试用,确认满足需求之后再行购买。虚拟物品一旦购买之后无法退款。
  • 如有使用上的疑问、bug,可以进交流群联系作者;
  • 请在合法范围内使用,若使用本插件做非法开发,本方概不负责;
  • 插件需先引入再打自定义基座后运行测试
  • 可导入示例项目试用,uniapp-x示例项目在uniapp示例项目的static文件夹下
  • 试用时建议使用提供的示例项目打包测试,没问题再在自己项目试用,有问题方便定位。

只支持 Android 真机。 修改插件 AndroidManifest / 依赖后,必须重新制作自定义调试基座(或云打包正式包)再运行,标准基座不会带上本插件原生能力。


目录

  1. 插件能做什么
  2. 两种「通话录音」先分清
  3. 使用系统通话录音:必读
  4. 需要开哪些权限
  5. 5 分钟上手
  6. 怎么获取通话录音
  7. 完整调用示例
  8. API 一览
  9. 常见问题

1. 插件能做什么

能力 说明
初始化 注入 Application
拨号 / 挂断 普通拨号、指定 SIM 拨号、挂断/拒接当前通话
通话页 UI 配置来电/去电文案、颜色、是否明文显示号码等
电话监听 监听响铃、接通、挂断、通话计时等
默认拨号器 可引导把本 App 设为默认通话应用(接听、自定义通话界面)
系统通话记录 读/删系统 CallLog(不是录音文件)
厂商系统自动录音 扫描手机系统生成的通话录音文件;挂断后可自动回调路径
App 麦克风录音 用 MIC 录一段音(不等于系统通话录音,见下文限制)

2. 两种「通话录音」先分清(重要)

不要把下面两种混在一起,请先记住:

方案 A:厂商「系统通话自动录音」(推荐,能录到双方)

  • 录音是 系统电话 App 生成的,文件在手机录音目录 / MediaStore 里。
  • 本插件负责:打开系统录音设置、申请读文件权限、扫描文件、挂断后回调路径
  • 能录到 本机 + 对方 的通话内容(取决于厂商实现,一般比 MIC 靠谱)。

方案 B:App「麦克风 MIC 录音」(startRecord / stopRecord)

  • 录音是 本 App 用麦克风 录的,不是系统通话录音。
  • 高版本 Android(尤其 Android 10+)对通话音频有隔离:MIC 往往只能录到本机环境音/本端说话,经常录不到对方声音
  • 若业务要「完整通话录音」,请优先用 方案 A,不要依赖 MIC。

3. 使用系统通话录音:必读

3.1 不要把集成了本插件的 App 设为默认拨号器

若业务依赖 系统通话录音文件

  • 不要调用 setToTheDefaultCallApplication(),也不要在系统设置里把本 App 设成「默认电话 / 默认拨号器」。
  • 请保持 系统自带电话 为默认拨号器。

原因:本 App 成为默认通话应用后,通话由本 App 的 InCallService 接管,厂商系统自动录音通常不会落盘——系统录音目录里也没有这次通话的文件,插件自然扫不到。

你的目标 默认拨号器应设为
要系统通话录音文件 系统电话(本 App 不要当默认)
要自定义接听/通话 UI 可把本 App 设为默认(但系统录音一般不可用)

可用 isDefaultCallApplication() 自查:若返回 true 又要系统录音,请先改回系统电话为默认。

3.2 系统侧还要打开「通话自动录音」

不同品牌路径不一样,可先调插件:

openAutoCallRecordSettings()

若跳不过去,请到手机设置里手动打开,例如:

  • 电话 / 通话设置 → 自动录音 / 通话录音 → 全部通话 / 陌生人 等
  • 部分品牌在「录音机」「智能助手」相关菜单

没开系统自动录音 = 永远没有录音文件可扫。


4. 需要开哪些权限

4.0 重要:开电话监听前,请先请求全部权限

务必先调用 requestAllPermission(),用户点完允许后,再调用 openCallListener()

不要一进页面就先点「打开电话监听」。否则常见问题:

  1. 跳到悬浮窗设置页(当前实现里若未开悬浮窗会顺带引导);
  2. 从设置页返回时,部分机型 / 自定义基座会进程重启,看起来像 App 重启;
  3. 电话状态相关权限未齐时,监听不稳定,甚至再次点击异常。

推荐顺序:

import { requestAllPermission, openCallListener } from '@/uni_modules/yt-callphone'

// ① 先申请全部权限,弹窗全部点「允许」
requestAllPermission()

// ② 用户授权完成后再打开监听(可放在按钮里,勿与①同一瞬间连点)
openCallListener((info) => {
  console.log(info.callState, info.number, info.filePath)
})

Demo 页也请先点「请求全部权限」,再点「打开电话监听」。

4.1 功能 → 权限对照表(小白看这张表)

你要用的功能 API(示例) 需要的权限 / 设置 怎么开
初始化 init() 无额外运行时弹窗 App.onLaunch 调用即可
电话监听(响铃/接通/挂断) openCallListener 必先 requestAllPermission();核心:READ_PHONE_STATE;Android 12+ 建议还有 READ_PRECISE_PHONE_STATE;要记录变化再加 READ_CALL_LOG requestAllPermission() openCallListener()
拨打电话 makingCalls / makingCallsWithSim CALL_PHONE;指定 SIM 还需 READ_PHONE_STATE requestAllPermission()
挂断 / 拒接 hangUpCall Android 9+:ANSWER_PHONE_CALLS(非默认拨号器时) requestAllPermission()
读系统通话记录 getCallRecords READ_CALL_LOG requestAllPermission()
删系统通话记录 deleteCallRecords READ_CALL_LOG + WRITE_CALL_LOG requestAllPermission()
App 麦克风录音 startRecord / stopRecord RECORD_AUDIO requestAllPermission()
设为默认通话应用 / 自定义通话浮层 setToTheDefaultCallApplication 系统「默认电话」角色;展示浮层还需悬浮窗 SYSTEM_ALERT_WINDOW 系统授权页 + 悬浮窗设置
扫厂商系统通话录音 getAllOemRecordFiles / diagnoseOemRecordScan / 挂断后 oemRecordReady Android 11+ 所有文件访问READ_MEDIA_AUDIO;且系统已开「通话自动录音」 见下表 4.2;不要把本 App 设为默认拨号器

一键申请(弹窗类危险权限):

requestAllPermission()

说明:Manifest 里已声明权限,但仍需用户在弹窗里点「允许」。悬浮窗、所有文件访问属于特殊权限,要跳系统设置页,不会全靠这一次弹窗搞定。

4.2 扫「系统通话录音文件」还要这些

权限 / 开关 作用 怎么开
所有文件访问 MANAGE_EXTERNAL_STORAGE Android 11+ 读厂商录音目录几乎必需 openAllFilesAccessSettings(),在系统页对本 App 允许
音频媒体 READ_MEDIA_AUDIO 读媒体库里的音频 requestAllPermission / 系统授权
系统「通话自动录音」开关 让系统真正生成录音文件 openAutoCallRecordSettings() 或手动设置
if (!hasAllFilesAccess()) {
  openAllFilesAccessSettings()
}

4.3 权限名速查

权限名 中文理解 主要给谁用
CALL_PHONE 拨打电话 拨号
ANSWER_PHONE_CALLS 接听/结束通话 hangUpCall(非默认拨号器)
READ_PHONE_STATE 读取电话状态 电话监听、双卡判断等
READ_PRECISE_PHONE_STATE 精确电话状态(Android 12+) 电话监听更完整
READ_CALL_LOG / WRITE_CALL_LOG 读/写通话记录 监听记录变化、读写 CallLog
RECORD_AUDIO 麦克风 App MIC 录音
SYSTEM_ALERT_WINDOW 悬浮窗 默认拨号器通话浮层(纯监听不是核心必需,但当前实现可能引导去开)
READ_MEDIA_AUDIO 读音频媒体 扫系统录音
MANAGE_EXTERNAL_STORAGE 所有文件访问 扫系统录音目录(Android 11+)

5. 5 分钟上手

5.1 制作自定义基座

HBuilderX:运行 → 运行到手机或模拟器 → 制作自定义调试基座 → 用新基座安装到真机后再运行。

5.2 App 启动时初始化

App.uvue

import { init } from '@/uni_modules/yt-callphone'

onLaunch(() => {
  // #ifdef APP-ANDROID
  try {
    init()
  } catch (e) {
    console.error('yt-callphone init fail', e)
  }
  // #endif
})

5.3 页面里引用(注意权限顺序)

import * as CallPhone from '@/uni_modules/yt-callphone'

// ① 先请求全部权限(必做,尤其是电话监听前)
CallPhone.requestAllPermission()

// ② 授权完成后再拨号 / 监听 / 挂断
CallPhone.makingCalls('10086', '展示号')
CallPhone.openCallListener((info) => {
  console.log(info.callState)
})
CallPhone.hangUpCall()

也可具名导入:import { requestAllPermission, openCallListener, hangUpCall } from '@/uni_modules/yt-callphone'

工程内完整按钮 Demo:pages/index/index.uvue(请先点「请求全部权限」,再点「打开电话监听」)。


6. 怎么获取通话录音

下面只讲 方案 A:系统通话录音(推荐)。

步骤 1:确认默认拨号器

  • 系统电话 = 默认
  • 本 App ≠ 默认(isDefaultCallApplication() 应为 false

步骤 2:申请权限

requestAllPermission()
if (!hasAllFilesAccess()) {
  openAllFilesAccessSettings()  // 用户打开「允许管理所有文件」后返回 App
}

步骤 3:打开系统自动录音

openAutoCallRecordSettings()
// 在设置页打开「自动录音」后返回

步骤 4:打开监听(可选,用于挂断后自动拿到文件)

再次强调:必须先完成步骤 2 的 requestAllPermission(),再打开监听。

import { requestAllPermission, openCallListener, setAutoScanOemRecordOnHangUp } from '@/uni_modules/yt-callphone'

// 若步骤 2 已申请过可跳过;未申请务必先执行
requestAllPermission()

// 挂断后自动扫描(默认就是 true,可显式打开)
setAutoScanOemRecordOnHangUp(true)

openCallListener((info) => {
  if (info.callState == 'oemRecordReady') {
    // 扫到了系统录音
    console.log('录音路径', info.filePath)
    console.log('文件名', info.fileName)
  }
})

步骤 5:用系统电话打电话(或本插件 makingCalls 拨出)

打完一通电话并挂断,等几秒。

步骤 6:主动拉取文件列表(随时可查)

import { getAllOemRecordFiles, diagnoseOemRecordScan } from '@/uni_modules/yt-callphone'

const files = getAllOemRecordFiles(true)
if (files.length == 0) {
  // 扫不到时看诊断
  const d = diagnoseOemRecordScan(true)
  console.log(d.hint)              // 人话提示
  console.log(d.hasStorageAccess)  // 权限够不够
  console.log(d.existingDirs)      // 目录在不在
} else {
  console.log('最新录音', files[0].path, files[0].name)
}

若品牌目录特殊

setCustomRecordDirs([
  '/storage/emulated/0/Music/Recordings/Call Recordings' // 换成真机实际目录
])

7. 完整调用示例

import {
  init,
  setCallPageConfig,
  requestAllPermission,
  hasAllFilesAccess,
  openAllFilesAccessSettings,
  openAutoCallRecordSettings,
  openCallListener,
  removeCallListener,
  makingCalls,
  hangUpCall,
  makingCallsWithSim,
  isDefaultCallApplication,
  getCallRecords,
  getAllOemRecordFiles,
  diagnoseOemRecordScan,
  setAutoScanOemRecordOnHangUp,
  startRecord,
  stopRecord
} from '@/uni_modules/yt-callphone'

// ---------- 初始化 & 配置 ----------
init()
setCallPageConfig({
  callInlabel: '来电',
  callOutlabel: '去电中',
  isRealPhone: true,
  showTxtSize: 18
})

// ---------- 权限(开监听前必做)----------
requestAllPermission()
// 等用户点完权限弹窗后再继续下面逻辑(不要同一瞬间连点打开监听)
if (!hasAllFilesAccess()) {
  openAllFilesAccessSettings()
}
openAutoCallRecordSettings()

// ---------- 强烈建议:系统录音场景下不要当默认拨号器 ----------
if (isDefaultCallApplication()) {
  console.warn('当前是默认拨号器,系统通话录音可能无法落盘!请改回系统电话为默认。')
}

// ---------- 监听通话 + 挂断后拿系统录音(务必在 requestAllPermission 之后)----------
setAutoScanOemRecordOnHangUp(true)
openCallListener((info) => {
  console.log('状态', info.callState)
  if (info.callState == 'oemRecordReady' && info.filePath != null) {
    console.log('系统录音文件', info.filePath)
  }
})

// ---------- 拨号 ----------
makingCalls('10086', '客服热线')
// makingCallsWithSim('10086', null, 1) // 指定卡 1
// hangUpCall() // 挂断当前通话

// ---------- 系统通话记录(不是录音) ----------
const logs = getCallRecords({ limit: 20 })

// ---------- 主动查系统录音文件 ----------
const files = getAllOemRecordFiles(true)
const diag = diagnoseOemRecordScan(true)

// ---------- App MIC 录音(高版本可能录不到对方) ----------
// startRecord()
// stopRecord((name) => { console.log(name) })

// ---------- 不用时关闭监听 ----------
// removeCallListener()

8. API 一览

API 说明
init() 初始化,建议 onLaunch 调用
setCallPageConfig(config) 通话页 UI 配置
requestAllPermission() 申请通话相关权限
openCallListener(cb) 打开电话监听(请先 requestAllPermission()
removeCallListener() 关闭电话监听
listeningServiceIsRunning() 监听是否运行中
makingCalls(phone, secretPhone?) 拨号
hangUpCall() 挂断/拒接当前通话(需 ANSWER_PHONE_CALLS
makingCallsWithSim(phone, secretPhone, simId) 指定 SIM 拨号
setToTheDefaultCallApplication() 引导设为默认通话应用(与系统录音冲突
isDefaultCallApplication() 是否已是默认通话应用
isMultiSim() 是否双卡
getCallRecords(options?) 系统通话记录列表
deleteCallRecords() 删除全部通话记录(谨慎)
startRecord() / stopRecord(cb) App MIC 录音(高版本可能无对方声音)
isDeviceSupported() 机型是否在厂商目录适配表中
openAutoCallRecordSettings() 跳转系统自动录音设置
hasAllFilesAccess() 是否有所有文件访问权限
openAllFilesAccessSettings() 跳转所有文件访问授权
getAllOemRecordFiles(includeAllBrands?) 获取厂商系统录音文件列表
diagnoseOemRecordScan(includeAllBrands?) 录音扫描诊断
setAutoScanOemRecordOnHangUp(enable) 挂断后是否自动扫系统录音
setCustomRecordDirs(dirs) 自定义扫描目录

类型定义见:utssdk/interface.uts。 Android 实现见:utssdk/app-android/index.uts

错误码:

含义
9010001 当前平台不支持(非 Android)
9010002 拿不到 Activity / Application
9010003 未初始化(一般会自动 init)

9. 常见问题

Q:打开电话监听要什么权限?要先做什么? 先调用 requestAllPermission(),再调用 openCallListener()。监听核心是 READ_PHONE_STATE(Android 12+ 建议加 READ_PRECISE_PHONE_STATE),通话记录变化还要 READ_CALL_LOG。详见 第 4 节

Q:一点「打开电话监听」就跳到悬浮窗设置,回来 App 像重启了? 当前实现在未开悬浮窗时会引导去设置页;部分机型从该页返回会杀进程重建,属常见现象。正确用法:先请求全部权限并授权完成,再打开监听。纯监听场景悬浮窗不是核心必需,但以当前插件行为仍可能被引导去开。

Q:扫不到系统录音? 按顺序查:① 是不是本 App 成了默认拨号器 → ② 系统自动录音开了没 → ③ hasAllFilesAccess() → ④ diagnoseOemRecordScan()hint

Q:MIC 录音只有自己没有对方? 属于 Android 高版本限制,预期内。要双方声音请用系统通话自动录音(方案 A)。

Q:改了 AAR 或 Manifest 没生效? 重新打自定义基座 / 正式包,不要用旧基座。

Q:iOS / 鸿蒙? 当前不支持,调用会报 9010001。

Q:依赖有哪些? app-android/config.json 已声明:appcompat、mmkv、gson、glide 等,云打包会按配置拉取。


更多好用插件推荐


开发文档

隐私、权限声明

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

CALL_PHONE、ANSWER_PHONE_CALLS、READ_PHONE_STATE、READ_CALL_LOG、RECORD_AUDIO、SYSTEM_ALERT_WINDOW、存储/所有文件访问等通话相关权限

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

插件不采集数据上传服务器

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