更新记录
1.0.0(2026-10-23)
初始版本
- 电话/短信/通话录音/通讯录全套能力,统一为 zy-call UTS 插件
- 权限:申请权限、检查/跳转所有文件访问权限
- 通话录音:检测是否开启自动录音、跳转自动录音设置页、获取全部录音文件、按条件搜索录音文件、自定义录音目录
- 通话监听:注册/取消监听、挂断、接听、当前通话状态、是否已注册;挂断后自动返回录音文件路径与时长
- 通话记录:获取全部记录、按条件查询、指定卡槽拨打电话
- 短信:注册/取消监听、静默发送(支持指定 subId)、获取短信列表
- 设备信息:是否双卡、获取手机号码、默认通话卡槽、机型适配判断
- 文件操作:移动、复制、删除文件或目录、获取音频时长
- 通讯录:获取通讯录、添***人
- 前台服务:通知权限检查与跳转、开启/关闭前台通知服务
- 配置:setConfig 设置挂断后搜索录音文件的延迟时间
平台兼容性
uni-app(4.72)
| Vue2 | Vue2插件版本 | Vue3 | Vue3插件版本 | Chrome | Safari | app-vue | app-vue插件版本 | app-nvue | app-nvue插件版本 | Android | Android插件版本 | iOS | 鸿蒙 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| √ | 1.0.0 | √ | 1.0.0 | × | × | √ | 1.0.0 | √ | 1.0.0 | 5.0 | 1.0.0 | × | × |
| 微信小程序 | 支付宝小程序 | 抖音小程序 | 百度小程序 | 快手小程序 | 京东小程序 | 鸿蒙元服务 | QQ小程序 | 飞书小程序 | 小红书小程序 | 快应用-华为 | 快应用-联盟 |
|---|---|---|---|---|---|---|---|---|---|---|---|
| × | × | × | × | - | × | × | × | × | - | × | × |
uni-app x(4.72)
| Chrome | Safari | Android | Android插件版本 | iOS | 鸿蒙 | 微信小程序 |
|---|---|---|---|---|---|---|
| × | × | 5.0 | 1.0.0 | × | × | × |
其他
| 多语言 | 暗黑模式 | 宽屏模式 | 蒸汽模式 |
|---|---|---|---|
| × | × | × | √ |
插件介绍
安卓电话通话短信监听 UTS 插件(zy-call),支持获取所有录音文件、来电监听、去电监听、挂断电话后返回通话录音文件、短信监听与静默发送、通话记录、通讯录、获取手机号码、前台通知保活等功能。
平台支持:仅 Android(uni-app app-vue / app-nvue、uni-app x app-android),iOS 无对应系统能力。
接口风格:所有方法统一为 options 单对象入参,回调通过对象属性承载:
methodName({
// 业务参数……
success ?: (res : XxxResult) => void // 成功回调
fail ?: (err : ZyCallFail) => void // 失败回调(UniError 规范)
complete ?: (res : any) => void // 完成回调(成功/失败都会触发)
onEvent ?: (res : XxxEvent) => void // 仅监听注册类方法,持续回调
})
失败回调 err 为 UniError 对象:err.errSubject = 'zy-call'、err.errCode(见下方错误码表)、err.errMsg(具体原因,如缺少的权限名)。
权限说明
插件所需权限
| 权限 | 用途 | 申请方式 |
|---|---|---|
| READ_PHONE_STATE | 通话监听、双卡判断、手机号 | 运行时申请 |
| READ_PHONE_NUMBERS | 获取本机号码 | 运行时申请 |
| ANSWER_PHONE_CALLS | 接听/挂断电话(API 26+) | 运行时申请 |
| CALL_PHONE | 直接呼出电话 | 运行时申请 |
| READ_CALL_LOG | 读取通话记录 | 运行时申请 |
| RECORD_AUDIO | 通话监听前置校验 | 运行时申请 |
| RECEIVE_SMS / SEND_SMS / READ_SMS | 短信监听、静默发送、短信列表 | 运行时申请 |
| READ_CONTACTS / WRITE_CONTACTS | 通讯录查询、添加 | 运行时申请 |
| POST_NOTIFICATIONS | 前台通知(API 33+) | 运行时申请 |
| READ/WRITE_EXTERNAL_STORAGE | 读取公共目录录音文件(API < 30) | 运行时申请 |
| MANAGE_EXTERNAL_STORAGE | 「所有文件访问权限」(API 30+) | 特殊权限,跳转设置页 |
requestPermission 缺省会按系统版本动态裁剪后申请上表全部运行时权限;MANAGE_EXTERNAL_STORAGE 为特殊权限,需用 toAllFilesPermissionPage 跳转设置页授予。
权限被永久拒绝怎么办
Android 运行时权限规则:权限一旦被用户永久拒绝(勾选过“不再询问”,或部分 OEM ROM 首次拒绝即视为永久拒绝,或累计拒绝达到上限),requestPermissions 不再弹系统框、直接静默拒绝。此时 requestPermission / checkPermissionState 会把这些权限放入返回值的 permanentlyDenied 列表中,需调用 toAppSettingsPage 跳转应用详情设置页引导用户手动开启,返回页面后调用 checkPermissionState 刷新状态。
import { requestPermission, checkPermissionState, toAppSettingsPage } from '@/uni_modules/zy-call'
export default {
onShow() {
// 页面显示时刷新(从系统设置页返回也会触发)
checkPermissionState({
success: (res) => {
if (!res.allGranted && res.permanentlyDenied.length > 0) {
toAppSettingsPage({}) // 引导用户去设置页手动开启
}
}
})
},
methods: {
applyPermission() {
requestPermission({
success: (res) => {
console.log('授予情况', res.list, '全部授予', res.allGranted)
if (res.permanentlyDenied.length > 0) {
uni.showToast({ title: '部分权限被永久拒绝,请去设置页开启', icon: 'none' })
}
},
fail: (err) => console.error('申请失败', err.errCode, err.errMsg)
})
}
}
}
使用注意事项
- 涉及大量危险权限(电话、短信、通讯录、存储),建议真机测试;模拟器无 SIM 卡时拨号/短信/手机号相关能力不可用。
- 建议配合保活方案使用:本插件内置前台通知服务
startForeground(Android 8+ 后台启动受限时会自动回退为普通服务),退到后台仍可监听来电/短信;同时建议把应用加入系统省电白名单。 - 各厂商对通话录音目录的路径不统一,插件已内置 15 个厂商的常见目录探测;目录不在预期位置时用
setCustomAudioRecorderDir指定。 - 所有方法均为异步;阻塞型操作(文件枚举、短信/通讯录查询)在子线程执行,回调切回主线程。
快速开始
- 在 HBuilderX 中把插件导入项目(uni_modules 方式),或直接从插件市场选择「zy-call」导入。
- 页面中引入:
import { registerCallListener } from '@/uni_modules/zy-call'
// 或
import * as zyCall from '@/uni_modules/zy-call'
- 最小可用示例(注册通话监听,挂断后拿录音文件):
import { requestPermission, registerCallListener } from '@/uni_modules/zy-call'
export default {
onLoad() {
requestPermission({}) // 先申请权限
registerCallListener({
onEvent: (e) => {
if (e.status === 3) {
console.log('挂断,录音文件:', e.audioPath, '时长:', e.duration)
} else {
console.log('通话事件:', e.status, e.phoneNumber)
}
},
success: (res) => console.log('注册成功'),
fail: (err) => console.error('注册失败', err.errCode, err.errMsg)
})
},
onUnload() {
unregisterCallListener({}) // 页面卸载时取消,避免回调泄漏
}
}
错误码表
| errCode | 含义 | 常见触发方法 |
|---|---|---|
| 9031001 | 参数错误 | 各方法入参校验失败 |
| 9031002 | 未注册通话监听 | endCall / answerRingingCall / setConfig(delayTime) |
| 9031003 | 未注册短信监听 | unregisterSmsListener 重复取消 |
| 9031004 | 缺少运行时权限 | 所有需要危险权限的方法(errMsg 含缺失权限名) |
| 9031005 | 当前安卓版本不支持 | getPhoneNumber(API < 22)、answerRingingCall(API < 26)、getDefaultCallSimCard(API < 24) |
| 9031006 | 文件或目录不存在 | moveFile / copyFile / deleteFile / getAudioDuration |
| 9031007 | 操作失败 | 复制/移动/删除失败、短信发送异常等 |
| 9031008 | 短信发送失败 | sendSmsHide(resultCode=1) |
| 9031009 | 无服务 | sendSmsHide(resultCode=4) |
| 9031010 | PDU 为空 | sendSmsHide(resultCode=3) |
| 9031011 | 无线电台关闭 | sendSmsHide(resultCode=2) |
| 9031012 | 短信未送达 | sendSmsHide(resultCode=0) |
| 9031013 | 添加通讯录失败 | addContact |
| 9031014 | 获取上下文失败 | 内部异常(应用上下文为空) |
API 详解
一、权限
requestPermission(options)
申请权限(批量运行时权限)。对未授予的权限发起系统授权弹窗;已被永久拒绝的权限不再弹框,通过 permanentlyDenied 返回。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| permissions | string[] | 否 | 要申请的权限名列表,缺省为插件所需的全部运行时权限(按 SDK 版本动态裁剪) |
| success | (res: ZyCallPermissionResult) => void | 否 | |
| fail / complete | 否 |
success 返回:
| 字段 | 类型 | 说明 |
|---|---|---|
| list | { name: string, granted: boolean }[] | 各权限授予情况(弹窗前状态) |
| allGranted | boolean | 是否全部授予 |
| permanentlyDenied | string[] | 被永久拒绝、不再弹框的权限名列表 |
注意:UTS 插件无法可靠接收
onRequestPermissionsResult,success 返回的是弹窗前状态。用户授权后请重新调用requestPermission或checkPermissionState确认。
checkPermissionState(options)
只查询权限状态,不发起授权弹窗。参数同 requestPermission(permissions 可缺省),返回结构完全一致。适合页面 onShow 时刷新(如从设置页返回后)。
checkAllFilesPermission(options)
检查是否有「所有文件」访问权限(Android 11+ 读取公共目录录音文件需要)。
success 返回:{ status: boolean }
toAllFilesPermissionPage(options)
跳转到「所有文件」访问权限页面。无参数。
toAppSettingsPage(options)
跳转应用详情设置页,引导用户手动开启被永久拒绝的运行时权限。无参数。
二、通话录音
checkCallAutoRecorder(options)
检测当前机型是否开启了「通话自动录音」(系统设置项,各厂商 key 不同,已内置 15 个厂商的探测逻辑)。
success 返回:{ isOpen: boolean }
关闭自动录音时,挂断事件可能拿不到录音文件(status 为 4/5)。
toCallAutoRecorderPage(options)
按机型跳转到对应的「通话自动录音」设置页(华为/小米/OPPO/vivo/三星走各自设置组件,其余机型跳拨号界面)。无参数。
getAllRecorderFiles(options)
获取当前机型通话录音目录下的全部文件(按最后修改时间倒序,不递归子目录)。
success 返回:{ files: ZyCallRecorderFile[] }
| ZyCallRecorderFile 字段 | 类型 | 说明 |
|---|---|---|
| path | string | 文件绝对路径 |
| time | number | 时间戳(毫秒) |
| lastModifiedTime | number | 最后修改时间戳(毫秒) |
| timeDate | string | yyyy-MM-dd HH:mm:ss |
| lastModifiedTimeDate | string | yyyy-MM-dd HH:mm:ss |
getRecorderFiles(options)
按条件搜索录音文件。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| startTime | number | 否 | 起始时间(毫秒时间戳),缺省 0 |
| endTime | number | 否 | 结束时间(毫秒时间戳),缺省当前时间 |
| keywords | string | 否 | 文件名关键字,缺省不限 |
success 返回:{ files: ZyCallRecorderFile[] }(结构同上)
setCustomAudioRecorderDir(options)
自定义录音文件目录。设置后 getAllRecorderFiles / getRecorderFiles / 挂断取录音均从该目录查找。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| dir | string | 是 | 录音目录绝对路径 |
三、通话监听
registerCallListener(options)
注册通话监听。注册结果走 success/fail(一次性);通话事件走 onEvent(持续回调)。
| 参数 | 类型 | 说明 |
|---|---|---|
| onEvent | (res: ZyCallEvent) => void | 通话事件持续回调 |
| success / fail / complete | 注册结果 |
ZyCallEvent 字段:
| 字段 | 类型 | 说明 |
|---|---|---|
| isIncoming | boolean | 是否来电(false 为去电) |
| status | number | 事件状态码,见下表 |
| phoneNumber | string | 本次通话号码 |
| uuid | string | 本次通话标识(同一次通话各事件一致) |
| audioPath | string | null | status=3 时有效:录音文件绝对路径 |
| duration | number | null | status=3 时有效:录音时长(毫秒) |
| time | number | null | status=3 时有效:录音文件时间戳 |
| lastModifiedTime | number | null | status=3 时有效:录音文件最后修改时间戳 |
| timeDate | string | null | status=3 时有效:时间格式化字符串 |
| lastModifiedTimeDate | string | null | status=3 时有效:最后修改时间格式化字符串 |
| recorderDirPath | string | null | 挂断事件附加:当前机型的录音目录路径 |
status 取值:
| status | 含义 |
|---|---|
| 1 | 来电响铃 |
| 2 | 去电拨出 / 通话中(含接听来电) |
| 3 | 挂断,已找到通话录音文件(audioPath/duration 等字段有效) |
| 4 | 挂断,未找到录音文件(已开启自动录音,录音可能延迟落盘) |
| 5 | 挂断,未找到录音文件(未接通 / 未开启自动录音) |
| 6 | 来电响铃时已有去电通话中 |
挂断事件内部延迟
delayTime(默认 2000ms,可用 setConfig 调整)后再搜索录音文件,等待厂商录音落盘。
unregisterCallListener(options)
取消通话监听。无参数。
endCall(options)
挂断当前通话(需先注册通话监听)。API 28+ 用 TelecomManager,以下用反射 getITelephony。无参数。
answerRingingCall(options)
接听来电(需先注册通话监听,Android 8.0+)。无参数。
getCallState(options)
获取当前通话状态。success 返回:{ state: number }(0 空闲 / 1 响铃 / 2 通话中)
isRegisterCallListener(options)
判断是否已注册电话监听。success 返回:{ isRegisterListener: boolean }
四、通话记录
getAllCalls(options)
获取全部通话记录(按时间倒序)。无参数。
success 返回:{ list: ZyCallCallRecord[] }
| ZyCallCallRecord 字段 | 类型 | 说明 |
|---|---|---|
| name | string | 联系人姓名,未存储联系人为空串 |
| number | string | 电话号码 |
| dateTime | number | 通话时间戳(毫秒) |
| date | string | yyyy-MM-dd HH:mm:ss |
| duration | number | 通话时长(秒) |
| type | number | 1 来电已接 / 2 去电 / 3 未接来电 / 5 拒接 |
| slotId | number | 卡槽订阅 ID(subscription_id) |
getCalls(options)
按条件查询通话记录(各条件均可选,组合为 AND)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 否 | 联系人姓名,精确匹配 |
| number | string | 否 | 电话号码,精确匹配 |
| startTime | number | 否 | 起始时间(毫秒时间戳),Android 7.0+ 生效 |
| endTime | number | 否 | 结束时间(毫秒时间戳),Android 7.0+ 生效 |
success 返回:{ list: ZyCallCallRecord[] }
callPhone(options)
拨打电话。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| number | string | 是 | 电话号码 |
| slot | number | 否 | 卡槽:1 / 2,缺省 1 |
| isTelephone | boolean | 否 | true 仅打开拨号界面(ACTION_DIAL),false 直接呼出,缺省 false |
| isSystemSelectPhone | boolean | 否 | true 交由系统弹窗选择卡槽,缺省 false |
五、短信
registerSmsListener(options)
注册短信监听。注册结果走 success/fail;收到短信走 onEvent(持续回调)。
| 参数 | 类型 | 说明 |
|---|---|---|
| onEvent | (res: ZyCallSmsEvent) => void | { number: 发件号码, content: 短信内容 } |
| success / fail / complete | 注册结果 |
unregisterSmsListener(options)
取消短信监听。无参数。
sendSmsHide(options)
静默发送短信(无界面,自动处理长短信分段,发送/送达状态通过 success/fail 回调)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| phoneNumber | string | 是 | 接收号码 |
| message | string | 是 | 短信内容 |
| subId | number | 否 | 订阅 ID(可用 getPhoneNumber / getDefaultCallSimCard 获取),缺省默认卡 |
success 表示已提交发送;送达结果会再次以 success 回调或 fail(9031012 未送达)返回。
getSmsList(options)
获取短信列表(按时间倒序)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| phoneNumber | string | 否 | 对端号码,精确匹配 |
| content | string | 否 | 内容关键字,模糊匹配 |
success 返回:{ list: ZyCallSms[] }
| ZyCallSms 字段 | 类型 | 说明 |
|---|---|---|
| phoneNumber | string | 对端号码 |
| person | number | 联系人 ID(未匹配为 0) |
| content | string | 短信内容 |
| time | number | 时间戳(毫秒) |
| type | number | 1 收件箱 / 2 发件箱 |
| read | number | 0 未读 / 1 已读 |
六、设备信息
isMultiSim(options)
是否是双卡。success 返回:{ isMultiSim: boolean }
getPhoneNumber(options)
获取各卡槽手机号码(需要 READ_PHONE_STATE + READ_PHONE_NUMBERS;部分机型/运营商返回空号)。
success 返回:{ numbers: ZyCallSimInfo[] }
| ZyCallSimInfo 字段 | 类型 | 说明 |
|---|---|---|
| number | string | 本机号码(可能为空串) |
| subId | number | 订阅 ID(静默发短信使用) |
| displayName | string | 显示名称(通常是运营商名) |
| carrierName | string | 运营商名称 |
| slotId | number | 卡槽下标:0 / 1 |
| mcc | string | 移动国家码 |
| mnc | string | 移动网络码 |
getDefaultCallSimCard(options)
获取通话/短信的默认卡槽信息(Android 7.0+)。success 返回:{ defaultSim: ZyCallSimInfo }(字段同上)
isAdaptPhone(options)
判断当前机型是否在支持的厂商列表中。success 返回:{ status: boolean, settings: string[] }(settings 为系统设置中与录音/通话相关的 key:value 列表,辅助排查)
七、文件操作
moveFile(options)
移动文件(先复制后删除源文件)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fromFilename | string | 是 | 源文件路径 |
| toFilename | string | 是 | 目标文件路径(父目录不存在时自动创建) |
copyFile(options)
复制文件。参数同 moveFile。
deleteFile(options)
删除文件或目录(目录递归删除)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| filePath | string | 是 | 文件或目录路径 |
getAudioDuration(options)
获取音频时长。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| path | string | 是 | 音频文件路径或 http(s) 地址 |
success 返回:{ duration: number }(毫秒)
八、通讯录
getContacts(options)
获取手机通讯录(按姓名排序)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| phoneNumber | string | 否 | 电话号码,精确匹配 |
| name | string | 否 | 姓名,模糊匹配 |
success 返回:{ list: ZyCallContact[] },元素为 { name: string, phoneNumber: string }
addContact(options)
添加通讯录。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 联系人姓名 |
| phoneNumber | string | 是 | 联系人电话 |
九、前台服务
isForegroundPermission(options)
是否有前台通知权限(Android 13+ 还需 POST_NOTIFICATIONS 运行时权限)。success 返回:{ status: boolean }
toForegroundPage(options)
跳转到通知权限页面。无参数。
startForeground(options)
开启前台通知服务(保活,建议监听来电/短信期间保持开启)。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| title | string | 否 | 通知标题,缺省为应用名 |
| content | string | 否 | 通知内容,缺省为「应用名正在运行」 |
| icon | string | 否 | 通知图标 mipmap 资源名(不含扩展名),缺省为应用图标 |
stopForeground(options)
关闭前台通知服务。无参数。
十、其他配置
setConfig(options)
配置自定义数据。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| delayTime | number | 否 | 挂断后延迟多少毫秒搜索录音文件,缺省 2000ms;部分机型录音落盘慢时可调大(需先注册通话监听) |
完整场景示例
来电监听 + 挂断自动取录音:
import {
requestPermission,
registerCallListener,
unregisterCallListener,
startForeground,
setConfig
} from '@/uni_modules/zy-call'
export default {
onLoad() {
startForeground({ title: '通话监听中', content: '正在监听来电与短信' }) // 保活
setConfig({ delayTime: 3000 }) // 挂断后等 3 秒再找录音文件
this.applyPermissionAndListen()
},
methods: {
applyPermissionAndListen() {
requestPermission({
success: (res) => {
if (!res.allGranted) {
uni.showToast({ title: '请先授予全部权限', icon: 'none' })
return
}
this.startListen()
},
fail: (err) => console.error('权限申请失败', err.errCode, err.errMsg)
})
},
startListen() {
registerCallListener({
onEvent: (e) => {
if (e.status === 1) {
console.log('来电响铃', e.phoneNumber)
} else if (e.status === 2) {
console.log('通话中', e.phoneNumber)
} else if (e.status === 3) {
console.log('挂断,录音文件', e.audioPath, '时长', e.duration)
// 拿到 e.audioPath 后可播放、上传或移动到自己的目录
} else {
console.log('挂断,未拿到录音,status =', e.status, '目录', e.recorderDirPath)
}
},
success: (res) => console.log('监听注册成功'),
fail: (err) => console.error('监听注册失败', err.errCode, err.errMsg)
})
}
},
onUnload() {
unregisterCallListener({})
}
}
各厂商录音目录说明
插件按 Build.MANUFACTURER 自动探测以下目录(子目录不递归,按顺序取第一个存在的):
| 厂商 | 录音目录(相对外部存储根目录) |
|---|---|
| 华为 / 荣耀 / ptac / wiko / unicomvsens / liantong | Sounds/CallRecord/record、Sounds/CallRecord、Sounds/CallReCord/record、Sounds/CallReCord、Sounds、record、Record |
| 小米 | MIUI/sound_recorder/call_rec |
| 魅族 | com.android.soundrecorder/files、Recorder/call、Recorder |
| OPPO / 一加 / realme | Music/Recordings/Call Recordings/ThirdRecord、Music/Recordings/Call Recordings、Music/Recordings/Call/Recordings、Oppo/media/audio/calls、Recordings/Call Recordings、Recordings、Record/PhoneRecord、PhoneRecord |
| vivo | Recordings/Record/Call、Record/Call、Call、录音/通话录音、录音、PhoneRecord |
| 联想 | Audios/VoiceCall、Sound_recorder/PhoneRecord、Sound_recorder/Phone_record、Audio/Recorder/PhoneRecorder、Audio/Recorder/Phone_recorder |
| 中兴 | voice、CallRecord |
| 摩托罗拉 / moto | Music/Sound recorder/Phone recorder、Music/Sound_recorder/Phone_recorder、Music/Sound recorder/Phone_recorder、Music/Sound_recorder/Phone recorder、Music/Recorder/records |
| 三星 | Recordings/Call、Call |
| 天翼 | Sounds/CallRecord |
| 努比亚 | CallRecord |
| jrd | Sounds |
| coolpad | Music |
| 其他(5g/lebest) | Android/media/com.android.dialer/voicecall、Music/voicecall |
不在上述目录时,用 setCustomAudioRecorderDir 指定实际目录。isAdaptPhone 可判断当前机型是否在支持列表。
常见问题
Q1:点了申请权限,有些权限不弹框?
这些权限已被永久拒绝(勾选过“不再询问”或 OEM ROM 策略)。用 toAppSettingsPage 跳转设置页手动开启,返回后 checkPermissionState 刷新。
Q2:挂断后 status 是 4/5,拿不到录音文件?
依次检查:① checkCallAutoRecorder 确认系统「通话自动录音」已开启;② 录音目录是否在预期位置(不在则 setCustomAudioRecorderDir);③ 部分机型落盘慢,setConfig({ delayTime: 5000 }) 调大延迟;④ 未接通(响铃即挂)本身不会产生录音(status 5)。
Q3:双卡手机怎么指定卡拨号/发短信?
拨号用 callPhone({ number, slot: 2 })(slot 1/2);静默发短信的 subId 通过 getPhoneNumber 或 getDefaultCallSimCard 获取。
Q4:getPhoneNumber 返回空号? 本机号码依赖运营商写入 SIM 卡(EF_MSISDN),部分 SIM 卡未写入时任何方式都取不到,与插件无关。
Q5:退到后台收不到来电/短信广播?
开启 startForeground 前台通知保活,并把应用加入系统省电白名单(各厂商设置路径不同)。
Q6:Android 8+ 提示无法启动前台服务?
插件已做兼容:startForegroundService 在后台启动受限时自动回退为 startService;仍失败时通过 fail 回调返回错误,请确保从前台页面调用。
权限声明(Manifest 合并)
插件 utssdk/app-android/AndroidManifest.xml 声明以下权限,会与宿主应用合并:
| 权限 | 用途 | 类型 |
|---|---|---|
| android.permission.ANSWER_PHONE_CALLS | 接听/挂断电话(API 26+) | 危险(运行时申请) |
| android.permission.READ_PHONE_STATE | 通话监听、双卡判断、手机号 | 危险(运行时申请) |
| android.permission.READ_PHONE_NUMBERS | 获取本机号码 | 危险(运行时申请) |
| android.permission.CALL_PHONE | 直接呼出电话 | 危险(运行时申请) |
| android.permission.READ_CALL_LOG | 读取通话记录 | 危险(运行时申请) |
| android.permission.WRITE_CALL_LOG | 写入通话记录 | 危险(运行时申请) |
| android.permission.RECORD_AUDIO | 通话监听前置校验 | 危险(运行时申请) |
| android.permission.MODIFY_AUDIO_SETTINGS | 通话时音频模式切换 | 普通(安装授予) |
| android.permission.WRITE_EXTERNAL_STORAGE | 读取公共目录录音文件(API < 29) | 危险(运行时申请) |
| android.permission.READ_EXTERNAL_STORAGE | 读取公共目录录音文件(API < 33) | 危险(运行时申请) |
| android.permission.MANAGE_EXTERNAL_STORAGE | 「所有文件访问权限」(API 30+) | 特殊(跳转设置页) |
| android.permission.RECEIVE_SMS | 接收短信广播 | 危险(运行时申请) |
| android.permission.SEND_SMS | 静默发送短信 | 危险(运行时申请) |
| android.permission.READ_SMS | 读取短信列表 | 危险(运行时申请) |
| android.permission.READ_CONTACTS | 查询通讯录 | 危险(运行时申请) |
| android.permission.WRITE_CONTACTS | 添加通讯录 | 危险(运行时申请) |
| android.permission.POST_NOTIFICATIONS | 前台通知(API 33+) | 危险(运行时申请) |
| android.permission.FOREGROUND_SERVICE | 前台服务保活 | 普通(安装授予) |

收藏人数:
购买源码授权版(
试用
使用 HBuilder 导入示例项目
赞赏(0)
下载 54
赞赏 0
下载 12709037
赞赏 1957
赞赏
京公网安备:11010802035340号