uniapp 获取安卓手机通话记录

        最近工作中遇到一个需求,需要获取用户的通讯录和通话记录。本来想着这个功能很简单直接在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);
			}
		});
	}

  • 6
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值