最近工作中遇到一个需求,需要获取用户的通讯录和通话记录。本来想着这个功能很简单直接在manifest.json 获取通话记录权限和通讯录权限然后直接调用uniapp的方法去访问就行了。结果发现manifest.json根本没有获取通话记录的选项uniapp也没有获取通话记录的方法。还是得自己写一下(习惯了复制粘贴,脑子真的是完全不想动了)。
首先说一下获取安卓手机权限的方法,通过plus.android.requestPermissions 去获取所需要的权限。
// 点击确定获取权限
const getPermissions = () => {
plus.android.requestPermissions(['android.permission.READ_CONTACTS'],
(e) => {
if (e.deniedAlways.length > 0) {
// 弹出提示框解释为何需要权限,引导用户打开设置页面开启
uni.showModal({
title: '提示',
content: '请打开手机联系人通讯录功能(点击确定后在权限中授权联系人通讯录功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else if (e.deniedPresent.length > 0) { //权限被临时拒绝
uni.showModal({
title: '提示',
content: '请打开手机相机功能(点击确定后在权限中授权相机功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else {
plus.android.requestPermissions(['android.permission.READ_CALL_LOG'], (e) => {
if (e.deniedAlways.length > 0) { //权限被永久拒绝
uni.showModal({
title: '提示',
content: '请打开读取通话记录功能(点击确定后在权限中授权读取通话记录功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass(
"android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings
.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity
.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else if (e.deniedPresent.length > 0) { //权限被临时拒绝
uni.showModal({
title: '提示',
content: '请打开读取通话记录功能(点击确定后在权限中授权读取通话记录功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass(
"android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings
.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity
.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else {
}
})
}
})
}
获取完毕权限之后就该查找手机通话记录了。
const readCallLogs = async () => {
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, // 联系人的姓名
phone: number, // 联系人电话
//callTime: formatDate (date), // 呼入或呼出时间
callTime: date, // 呼入或呼出时间
talkTime: duration, // 通话时长
type: type
});
// 查询 200 条 就跳出
if (count > 50) {
break;
}
}
}
// console.log('获取到的东西',content)
resolve(content);
} catch (e) {
reject(e);
}
});
}
这两个方法就是获取安卓手机的方法了,推荐写在app.vue页面里,因为获取通话记录的话写在当前的时候会慢,所以我直接写在app.vue上了,一进去app就去获取通话记录然后保存到本地,在需要用到的页面再去从本地取出
export default {
onLaunch: function() {
console.log('App Launch');
getPermissions();
},
onShow: async function() {
console.log('App Show');
await readCallLogs().then(res => {
uni.setStorageSync('callLogsList',res)
// console.log('获取到的通话记录', res)
}).catch(error => {
console.log('获取报错', error)
});
},
onHide: function() {
console.log('App Hide')
}
}
// 点击确定获取权限
const getPermissions = () => {
plus.android.requestPermissions(['android.permission.READ_CONTACTS'],
(e) => {
if (e.deniedAlways.length > 0) {
// 弹出提示框解释为何需要权限,引导用户打开设置页面开启
uni.showModal({
title: '提示',
content: '请打开手机联系人通讯录功能(点击确定后在权限中授权联系人通讯录功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else if (e.deniedPresent.length > 0) { //权限被临时拒绝
uni.showModal({
title: '提示',
content: '请打开手机相机功能(点击确定后在权限中授权相机功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass("android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else {
plus.android.requestPermissions(['android.permission.READ_CALL_LOG'], (e) => {
if (e.deniedAlways.length > 0) { //权限被永久拒绝
uni.showModal({
title: '提示',
content: '请打开读取通话记录功能(点击确定后在权限中授权读取通话记录功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass(
"android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings
.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity
.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else if (e.deniedPresent.length > 0) { //权限被临时拒绝
uni.showModal({
title: '提示',
content: '请打开读取通话记录功能(点击确定后在权限中授权读取通话记录功能)',
// showCancel: false, // 不显示取消按钮
success(res) {
if (res.confirm) {
let Intent = plus.android.importClass(
"android.content.Intent");
let Settings = plus.android.importClass(
"android.provider.Settings");
let Uri = plus.android.importClass("android.net.Uri");
let mainActivity = plus.android.runtimeMainActivity();
let intent = new Intent();
intent.setAction(Settings
.ACTION_APPLICATION_DETAILS_SETTINGS);
let uri = Uri.fromParts("package", mainActivity
.getPackageName(),
null);
intent.setData(uri);
mainActivity.startActivity(intent);
}
}
});
} else {
}
})
}
})
}
const readCallLogs = async () => {
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, // 联系人的姓名
phone: number, // 联系人电话
//callTime: formatDate (date), // 呼入或呼出时间
callTime: date, // 呼入或呼出时间
talkTime: duration, // 通话时长
type: type
});
// 查询 200 条 就跳出
if (count > 50) {
break;
}
}
}
// console.log('获取到的东西',content)
resolve(content);
} catch (e) {
reject(e);
}
});
}