uniapp通讯录等敏感权限检查、申请。获取通话记录等内容

本篇文章是我对我搜集到的相关方面的一些整合希望可以帮助到大家。

plus.android.requestPermissions(
				[Permission],    //所需申请权限名称,可以是数组
				function(resultObj) {
                    var result;
					for (var i = 0; i < resultObj.granted.length; i++) {
						var grantedPermission = resultObj.granted[i];
						console.log('已获取的权限:' + grantedPermission);
						result = 1
          
					}
					for (var i = 0; i < resultObj.deniedPresent.length; i++) {
						var deniedPresentPermission = resultObj.deniedPresent[i];
						console.log('拒绝本次申请的权限:' + deniedPresentPermission);
						result = 0
					}
					for (var i = 0; i < resultObj.deniedAlways.length; i++) {
                        var deniedAlwaysPermission= resultObj.deniedAlways[i];
						console.log('永久拒绝申请的权限:' + deniedAlwaysPermission);
						result = -1
					}
					if(result!=1){
                        //本次权限申请失败
					}
					
				},
				function(error) {
					console.log('申请权限错误:' + error.code + " = " + error.message);
					resolve({
						code: error.code,
						message: error.message
					});
				}
			);

uniapp 在使用plus.android.requestPermissions时会判断是否已经申请过该权限并且弹出原生弹窗使app用户授权,如果用户已经同意过授权将直接执行回调函数 最终上述代码执行结果为result =1

如果本次拒绝将会判断已经拒绝的次数安卓只能弹两次原生弹窗 如果是第一次的话会在稍后再次弹窗,并不触发回调函数。在第二次弹窗后触发回调函数,如果还是拒绝上述代码执行结果为result =-1

经过我多次的测试发现当前最新版的HBuilderX(3.6.4)版本 plus.android.requestPermissions传数组参数时将出现一些bug使该方法不能执行

具体为获取'android.permission.READ_CALL_LOG','android.permission.WRITE_CALL_LOG'权限

并且在自定义基座调试也不能正确判断'android.permission.READ_CALL_LOG','android.permission.WRITE_CALL_LOG'权限

(已经在设置开启相关权限还是不能判断已开启)

在确认已经开启相关权限后可以通过以下代码来获取通话记录内容

async needPermission () { // 需要的授权
			        // #ifdef APP-PLUS
			        if (plus.os.name != 'Android') {
			            return;
			        }
			        return await new Promise((resolve, reject) => {
						let list = [
							'android.permission.READ_CALL_LOG',
			                ]
							for (let i = 0; i < list.length; i++) {
								plus.android.requestPermissions(
								    [list[i]],
								    function(e) {
								        if (e.deniedAlways.length > 0) {
								            resolve(false);
								            return;
								        }
								        if (e.deniedPresent.length > 0) {
								            resolve(false);
								            return;
								        }
								    },
								    function(e) {
								        resolve(false);
								    }
								);
							}
							resolve(true);
							return;
			        });
			        // #endif
			    },
						async readCallLogs(){ // 通话记录
						// #ifdef APP-PLUS
						
						uni.setStorageSync('CallLog','开始获取');
						return await new Promise((resolve, reject) => {
			            if (plus.os.name != 'Android') {
			                // resolve("is not Android");
			                return;
			            }
			            try {
			                // 获取通话记录的主体代码 顺序不能够乱
			                var CallLog = plus.android.importClass('android.provider.CallLog');
			                var Activity = plus.android.runtimeMainActivity();
			                var ContentResolver = plus.android.importClass('android.content.ContentResolver');
			                var resolver = Activity.getContentResolver();
			                plus.android.importClass(resolver);
			                var String = plus.android.importClass('java.lang.String');
			                var cs = resolver.query(CallLog.Calls.CONTENT_URI, null, null, null, CallLog.Calls
			                    .DEFAULT_SORT_ORDER);
			                plus.android.importClass(cs);
			                var content = [];
			                var count = 0; // 记录多少条
			                if (cs.moveToFirst()){
			                    while (cs.moveToNext()) {
			                        count++;
			                        // 号码
			                        var number = cs.getString(cs.getColumnIndex(CallLog.Calls.NUMBER));
			                        // 呼叫类型
			                        var type;
			                        switch (parseInt(cs.getString(cs.getColumnIndex(CallLog.Calls.TYPE)))) {
			                            // 判断通话类型
			                            case CallLog.Calls.INCOMING_TYPE:
			                                type = ' 呼入 ';
			                                break;
			                            case CallLog.Calls.OUTGOING_TYPE:
			                                type = ' 呼出 ';
			                                break;
			                            case CallLog.Calls.MISSED_TYPE:
			                                type = ' 未接 ';
			                                break;
			                            default:
			                                type = ' 挂断 ';
			                                break;
			                        }
			                        // 获取时间
			                        var date = new Date(parseInt(cs.getString(cs.getColumnIndexOrThrow(CallLog.Calls
			                            .DATE))));
			                        // 联系人
			                        var Name_Col = cs.getColumnIndexOrThrow(CallLog.Calls.CACHED_NAME);
			                        var name = cs.getString(Name_Col);
			                        // 通话时间,单位:s
			                        var Duration_Col = cs.getColumnIndexOrThrow(CallLog.Calls.DURATION);
			                        var duration = cs.getString(Duration_Col);
			                        // 存入数组
			                        content.push({
			                            name: name, // 联系人的姓名
			                            mobile: number, // 联系人电话
			                            //callTime: formatDate (date), // 呼入或呼出时间
			                            callTime: date, // 呼入或呼出时间
			                            talkTime: duration, // 通话时长
			                            type: type
			                        });
			                        // 查询 200 条 就跳出
			                        if (count > 50) {
			                            break;
			                        }
			                    }
			                }
			                resolve(content);
			            } catch (e) {
			                reject(e);
			            }
			        });
			        // #endif
			    },

确保权限申请已经通过之后在执行获取通讯录操作

this.needPermission().then(res=>{
				if(res){
					that.readCallLogs().then(ret=>{
						uni.setStorageSync('loga',ret)
					}).catch(err=>{
						uni.setStorageSync('loga',err)
					})
				}
			})

否则出现TypeError: Cannot read property 'TYPE' of null报错一般是权限并未获取到的原因,可以检查uniapp manifest.json 配置文件是否勾选相应权限

也可能是代码在顺序原因 未获取到权限直接获取就会报错

通话记录的判断因为HBuilderX(3.6.4)的bug原因我推荐使用

安卓原生权限插件组,主动申请系统敏感权限 - DCloud 插件市场

该插件可以准确的判断是否已经拥有某项权限

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值