You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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插件:

  1. 安装插件:
cordova plugin add cordova-plugin-calllog
  1. 读取最新通话记录的代码:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 03:43:18