本篇文章是我对我搜集到的相关方面的一些整合希望可以帮助到大家。
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 插件市场
该插件可以准确的判断是否已经拥有某项权限