android 获取通话记录不准确(为上次记录)

问题:

使用

new ContentObserver(new Handler()) {
                @Override
                public void onChange(boolean selfChange, Uri uri) {
                //TODO 获取通话记录
                if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
                return;
            }

            ContentResolver cr = context.getContentResolver();



            final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI,
                        new String[]{CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DURATION, CallLog.Calls.DATE},
                        CallLog.Calls.NUMBER + "=? and " + CallLog.Calls.TYPE + "= ?",
                        new String[]{callTel, CallLog.Calls.OUTGOING_TYPE + ""}, CallLog.Calls.DEFAULT_SORT_ORDER);

                }
   }

获取通话记录的时候
线上有少量反馈通话记录获取时长对不上

分析:

由于没获取通话记录的播出时间。
仅由反馈的系统通话界面截图
发现获取到的为上次通话记录时长

故推系统执行中
写入通话记录数据库和通知通话数据库修改为并发进行。
故障机型在手机资源使用严重的情况下。
异步写入通话记录数据库被延迟执行

所以导致在onChange()回调中将上次记录的通话记录当作最新的通话记录

解决:

拨打电话前记录其实时间beginTime
onChange()中启动线程循环比较获取正确通话记录

int getsTime = 0;

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            if (ActivityCompat.checkSelfPermission(context, Manifest.permission.READ_CALL_LOG) != PackageManager.PERMISSION_GRANTED) {
                return;
            }

            ContentResolver cr = context.getContentResolver();

            //备选结束时间
            long endTime = System.currentTimeMillis();

            while (tryGetTime) {
                final Cursor cursor = cr.query(CallLog.Calls.CONTENT_URI,
                        new String[]{CallLog.Calls.NUMBER, CallLog.Calls.TYPE, CallLog.Calls.DURATION, CallLog.Calls.DATE},
                        CallLog.Calls.NUMBER + "=? and " + CallLog.Calls.TYPE + "= ?",
                        new String[]{"查询电话", CallLog.Calls.OUTGOING_TYPE + ""}, CallLog.Calls.DEFAULT_SORT_ORDER);

                if (cursor == null || cursor.getCount() == 0) {
                    threadWait(endTime);
                    return;
                }

                cursor.moveToFirst();

                int durationIndex = cursor.getColumnIndex(CallLog.Calls.DURATION);
                long durationTime = cursor.getLong(durationIndex) * 1000;
                long dateLong = cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE)); //获取通话日期

                if (beginTime <= dateLong) {
                    //当为准确时间时候

                    //取消死循环节点
                    tryGetTime = false;
					//TODO 回调正确通话
                    callEvenBack.callDuration(durationTime);
                } else {
                    //否则 死循环等待500毫秒
                    threadWait(endTime);
                }

                cursor.close();
            }


        }
    };


    /**
     * 睡眠500毫秒在继续查询
     *
     * @param endTime
     */
    private void threadWait(long endTime) {
        try {
            getsTime++;
            //查询次数上限
            if (getsTime > 10) {
                //取消死循环节点
                tryGetTime = false;
                //TODO 回调预计通话时间endTime - beginTime
       
                callTel = "";
            } else {
                Thread.sleep(500);
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

5秒内每隔500毫秒获取查询一次最新的通话记录是否符合
不符合返回预计通话时间endTime - beginTime
正常你也不至于 5秒数据库都写不进一条记录把

1.18 ------------------------
特么周末用户反馈还是会偶尔出现时间不准确(返回了自己记录的预计通话时间endTime - beginTime 这种会比系统记录的时间多了响铃和挂断嘟嘟嘟的时间)
华为mate10。
我是没办法了 5秒系统通话数据库都更新不了我还能怎么办
1.29----------------------------
vivo和oppo是真辣鸡啊 低版本有的系统会出现 系统没发送拨打出电话Intent.ACTION_NEW_OUTGOING_CALL的广播 翻了个oppo r9 5.1系统的 还有js注入失效的问题

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值