问题:
使用
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注入失效的问题