4***@qq.com
4***@qq.com
  • 发布:2021-01-26 19:24
  • 更新:2022-12-06 10:16
  • 阅读:2637

uni-app 获取不到通话记录权限以及通话记录

分类:HBuilderX

问题描述:这个问题发生在一个半途接手的uni-app项目,目前打包ios之后功能正常,但是打包Android安装包之后获取的通话记录权限,即使手动分配了,再检查这个权限的时候依旧是没有权限,在获取通话记录时,var cursor = resolver.query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls.DEFAULT_SORT_ORDER); cursor是null

1.问过度娘,得到的都是类似的处理,跟目前的代码基本一致,按照文章的分享试过了,依旧不行,不管是基座,还是正式打包

  1. 试图寻找旧版本,确实有一版apk是可以的,可以获取到,可惜找不到对应的代码。尝试用比较旧的代码重新打包,还是不行。
    目前怀疑是不是hbuilderX更新了,这快的功能就不行了。
2021-01-26 19:24 负责人:无 分享
已邀请:
2***@qq.com

2***@qq.com

你还是写原生插件吧

2***@qq.com

2***@qq.com

大兄弟,解决了吗?

fjy1012

fjy1012

获取通讯记录首先得获取通讯权限:

plus.android.requestPermissions([  
    'android.permission.READ_CALL_LOG',  
    'android.permission.WRITE_CALL_LOG',  
    'android.permission.CALL_PHONE'  
], res => {  
    if (res.granted.length > 0) {  
        console.log('"已授权");  
                // this.getCallRecord(success=>{  
                // ...  
                // });  
    } else {  
        console.log('"请先授权!");  
    }  
})

获取成功后再获取通讯记录列表:

            // 查本地数据  
            getCallRecord({  
                num = 100,  
                column = null, // 需要返回参数列的名称,null返回所有列  
                selection = null, // 筛选条件  
                selectionVal = null, // 筛选条件的动态值,配合selection使用,可替换selection中的'?'  
                sortOrder = 'DESC', // 按日期升序ASC/降序DESC  
                success = function() {}  
            } = {}) {  
                uni.showLoading({  
                    title: "获取通讯记录中...",  
                    mask: true  
                });  
                // 创建实例  
                var CallLog = plus.android.importClass("android.provider.CallLog");  
                var main = plus.android.runtimeMainActivity();  
                var obj = main.getContentResolver();  
                plus.android.importClass(obj);  
                //查询  
                var sql = '';  
                var keyword = '';  
                for (let item of Object.keys(selection)) {  
                    if (selection[item] != '') {  
                        switch (item) {  
                            case 'mobile':  
                                sql = sql == '' ? sql : sql + ' and ';  
                                sql = sql + CallLog.Calls.NUMBER + " like '%" + selection[item] + "%'";  
                                keyword = selection[item];  
                                break;  
                            case 'startTime':  
                                sql = sql == '' ? sql : sql + ' and ';  
                                sql = sql + CallLog.Calls.DATE + '>=' + selection[item];  
                                break;  
                            case 'endTime':  
                                sql = sql == '' ? sql : sql + ' and ';  
                                sql = sql + CallLog.Calls.DATE + '<=' + selection[item];  
                                break;  
                            case 'type':  
                                sql = sql == '' ? sql : sql + ' and ';  
                                sql = sql + CallLog.Calls.TYPE + '=' + selection[item];  
                                break;  
                        }  
                    }  
                }  
                sql = sql != '' ? sql : null;  

                var cursor = obj.query(CallLog.Calls.CONTENT_URI, column, sql, selectionVal, CallLog  
                    .Calls.DATE + ' ' + sortOrder);  
                plus.android.importClass(cursor);  
                var content = []; // 用来存储数据  
                var count = 0; // 记录多少条  

                if (cursor.moveToFirst()) {  
                    while (cursor.moveToNext()) {  
                        count++;  
                        //号码  
                        var number = cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER));  
                        //呼叫类型  
                        var type, phone_type = parseInt(cursor.getString(cursor.getColumnIndex(CallLog  
                            .Calls.TYPE)));  
                        switch (phone_type)  
                        // 判断通话类型  
                        {  
                            case CallLog.Calls.INCOMING_TYPE:  
                                type = "呼入";  
                                break;  
                            case CallLog.Calls.OUTGOING_TYPE:  
                                type = "呼出";  
                                break;  
                            case CallLog.Calls.MISSED_TYPE:  
                                type = "未接";  
                                break;  
                            case CallLog.Calls.REJECTED_TYPE:  
                                type = "拒接";  
                                break;  
                            default:  
                                type = "其他";  
                                break;  
                        }  
                        // 获取时间  
                        // var date = new Date(parseInt(cursor.getString(cursor.getColumnIndexOrThrow(CallLog.Calls.DATE))));  
                        var date = new Date(new Date(parseInt(cursor.getString(cursor  
                            .getColumnIndexOrThrow(CallLog.Calls.DATE)))))  
                        var formatDate = date.getFullYear() + '-' + (date.getMonth() + 1) + '-' + date  
                            .getDate() + ' ' + (date.getHours() > 9 ? date.getHours() : "0" + date  
                                .getHours()) + ':' + (date.getMinutes() > 9 ? date.getMinutes() : "0" +  
                                date.getMinutes()) + ':' + (date.getSeconds() > 9 ? date.getSeconds() :  
                                "0" + date.getSeconds());  

                        // 联系人  
                        // var Name_Col = cursor.getColumnIndexOrThrow(CallLog.Calls.CACHED_NAME);  
                        // var name = cursor.getString(Name_Col);  
                        // 号码归属地 返回:北京 联通  
                        var numberLocation = cursor.getString(cursor.getColumnIndex(CallLog.Calls  
                            .GEOCODED_LOCATION));  
                        //通话时间,单位:s  
                        var Duration_Col = cursor.getColumnIndexOrThrow(CallLog.Calls.DURATION);  
                        var duration = cursor.getString(Duration_Col);  
                        // 存入数组   
                        content.push({  
                            // name: name, // 联系人的姓名  
                            dial_phone: number, // 联系人电话  
                            address: numberLocation, // 号码的归属地  
                            create_time: formatDate, // 呼入或呼出时间  
                            duration: duration, // 通话时长  
                            phone_type: phone_type,  
                            type: type,  
                            keyword: keyword,  
                            checked: false  
                        });  
                        // 查询num条就跳出  
                        if (num > 0 && count >= num) {  
                            break;  
                        }  
                    }  
                }  
                uni.hideLoading();  
                if (success) return success(content);  
            },
  • zhangdaren

    大佬,感谢你的代码。这里附上我修改过的代码:

    调用是使用:

    this.getCallRecord({success:(res)=>{

    // ...

    }});

    这里需再包一层

    2021-10-04 12:23

  • zhangdaren

    console.log('"已授权");


        console.log('"请先授权!");    

    这两行也多了两个引号。copy的同学记得修改一下

    2021-10-04 12:28

  • 清河树人

    我这么写获取的通话记录总是少一条是为什么。大佬知道吗

    2021-10-26 17:52

  • zhangdaren

    大佬,我发现获取不到最新的通话记录哇,猜测只能获取十分钟前的记录。

    2021-10-29 16:19

fjy1012

fjy1012

大佬ios部分怎么获取通话记录的能贴下代码吗

阿酸牛奶

阿酸牛奶

ios端能获取到通话记录么

  • 1***@qq.com

    同问?能获取到希望贴代码

    2022-08-09 21:51

d***@qq.com

d***@qq.com

plus.android.requestPermissions(['android.permission.READ_CALL_LOG','android.permission.READ_PHONE_STATE'], function(e) {  
                console.log(e)  
            });

运行结果:

{  
    "granted": ["android.permission.READ_PHONE_STATE"],  
    "deniedPresent": [],  
    "deniedAlways": ["android.permission.READ_CALL_LOG"]  
}

这个“READ_CALL_LOG” 权限始终无法获取呢

落嘤神斧

落嘤神斧

真机调试的时候不管怎么请求都获取不到通话记录权限,但是打包后就可以了。真机调试还是不行

1***@qq.com

1***@qq.com - 没啥

cursor.moveToFirst() 这个方法怎么返回的是false呢,有大佬知道怎么解决一下么

要回复问题请先登录注册