如何在Cordova中获取通话时长?现有实现方案失败求解决
在Cordova中获取通话时长的实现方法
你当前的代码存在两个核心问题:
deviceready事件监听被嵌套在onSuccess回调内,此时deviceready通常已经触发完成,导致无法正常监听通话状态变化。startTime在发起通话请求成功后就记录,但这个时机只是完成了拨号请求,并非通话实际接通的时间,计算出的时长会包含拨号等待的无效时间,结果不准确。
正确实现方案
方案一:通过通话状态监听实时计算时长
调整代码结构,确保在deviceready触发后初始化状态监听,并在通话实际接通时记录开始时间:
// 全局变量存储通话开始时间 let callStartTime; // 优先监听deviceready,这是Cordova应用的核心初始化事件 document.addEventListener("deviceready", function () { // 初始化通话状态监听 window.plugins.callNumber.onCallStateChanged(function (state) { switch(state) { case "CONNECTED": // 通话真正接通时记录开始时间 callStartTime = new Date(); console.log('通话已接通'); break; case "DISCONNECTED": if (callStartTime) { const endTime = new Date(); const duration = endTime - callStartTime; console.log(`通话结束,时长:${duration}ms`); // 重置变量,避免影响下一次通话计算 callStartTime = null; } break; // 可选:处理其他状态 case "DIALING": console.log('正在拨号'); break; case "RINGING": console.log('电话响铃中'); break; } }); }, false); // 拨打电话的函数 function makeCall(number) { function onSuccess(result) { console.log("拨号请求发起成功:" + result); } function onError(result) { console.log("拨号失败:" + result); } window.plugins.CallNumber.callNumber(onSuccess, onError, number); }
方案二:读取系统通话记录获取精准时长
如果需要获取系统官方记录的通话时长(完全排除拨号等待时间),可以使用cordova-plugin-calllog插件:
- 安装插件:
cordova plugin add cordova-plugin-calllog
- 读取最新通话记录的代码:
document.addEventListener("deviceready", function () { // 在通话结束、用户回到应用时调用此函数 function getLatestCallDuration() { window.plugins.callLog.getCallLog( function (callLogs) { // 取最新的一条通话记录 const latestCall = callLogs[0]; if (latestCall) { // duration字段为系统记录的通话时长(单位:秒) console.log(`最新通话时长:${latestCall.duration}秒`); } }, function (error) { console.log("读取通话记录失败:" + error); }, 1 // 指定获取1条最新记录 ); } }, false);
权限说明
- Android平台:需要在
AndroidManifest.xml中添加以下权限:<uses-permission android:name="android.permission.READ_CALL_LOG" /> <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS" /> <uses-permission android:name="android.permission.READ_PHONE_STATE" /> - iOS平台:系统对通话记录访问有严格限制,无法直接读取系统通话时长,只能通过状态监听的方式估算,同时需要在
info.plist中配置相关权限描述。
内容的提问来源于stack exchange,提问作者Taffarel Xavier
相关产品推荐
相关产品推荐

