uniapp获得手机通话记录、短信等权限

1.获得通话记录权限

        //获得通话权限

		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.permisionObj[4].state = true;
			} else {
				console.log('请先授权!');
				this.permisionObj[4].state = false;
			}
		});

获取通话记录

import { parseTime } from '@/utils/format.js';
import permision from '@/js_sdk/wa-permission/permission.js';
import { gotoAppPermissionSetting } from '@/js_sdk/wa-permission/permission.js';

        async getCalllog() {
			//检查授权
			var result = await permision.requestAndroidPermission(['android.permission.READ_CALL_LOG', 'android.permission.WRITE_CALL_LOG', 'android.permission.CALL_PHONE']);
			var strStatus;
			if (result == 1) {
				strStatus = '已获得授权';
			} else {
				uni.showToast({
					title: '读通话记录权限未开启',
					icon: 'none'
				});
				setTimeout(() => {
					uni.hideToast();
				}, 5000);
			}

			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);

			uni.showLoading({
				title: '匹配通话记录中..'
			});
			var count = 0; // 记录多少条 用于处理循环跳出
			while (plus.android.invoke(cs, 'moveToNext')) {
				count++;
				console.log(count);
				let talist = {
					// 联系人姓名
					xm: plus.android.invoke(cs, 'getString', plus.android.invoke(cs, 'getColumnIndex', CallLog.Calls.CACHED_NAME)),
					telphone: plus.android.invoke(cs, 'getString', plus.android.invoke(cs, 'getColumnIndex', CallLog.Calls.NUMBER)),
					// 通话时长
					duration: plus.android.invoke(cs, 'getString', plus.android.invoke(cs, 'getColumnIndex', CallLog.Calls.DURATION)),
					date: plus.android.invoke(cs, 'getString', plus.android.invoke(cs, 'getColumnIndex', CallLog.Calls.DATE)),
					type: plus.android.invoke(cs, 'getString', plus.android.invoke(cs, 'getColumnIndex', CallLog.Calls.TYPE))
				};
				talist.date = this.parseTime(talist.date);
				switch (talist.type) {
					// 判断通话类型
					case '1':
						talist.type = ' 呼入 ';
						break;
					case '2':
						talist.type = ' 呼出 ';
						break;
					case '3':
						talist.type = ' 未接 ';
						break;
					default:
						talist.type = ' 挂断 ';
						break;
				}

				if (count > 100) {
					break;
				}
				this.telphoneLog.push(talist);
			}
			uni.hideLoading();
		},

permission.js中部分代码(参考插件App权限判断和提示 - DCloud 插件市场

// Android权限查询
function requestAndroidPermission(permissionID) {
	return new Promise((resolve, reject) => {
		plus.android.requestPermissions(
			[permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
			function(resultObj) {
				var result = 0;
				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
				}
				resolve(result);
				// 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
				// if (result != 1) {
				// 	gotoAppPermissionSetting()
				// }
			},
			function(error) {
				console.log('申请权限错误:' + error.code + " = " + error.message);
				resolve({
					code: error.code,
					message: error.message
				});
			}
		);
	});
}
// 跳转到**应用**的权限页面
function gotoAppPermissionSetting() {
	if (isIos) {
		var UIApplication = plus.ios.import("UIApplication");
		var application2 = UIApplication.sharedApplication();
		var NSURL2 = plus.ios.import("NSURL");
		// var setting2 = NSURL2.URLWithString("prefs:root=LOCATION_SERVICES");		
		var setting2 = NSURL2.URLWithString("app-settings:");
		application2.openURL(setting2);

		plus.ios.deleteObject(setting2);
		plus.ios.deleteObject(NSURL2);
		plus.ios.deleteObject(application2);
	} else {
		// console.log(plus.device.vendor);
		var Intent = plus.android.importClass("android.content.Intent");
		var Settings = plus.android.importClass("android.provider.Settings");
		var Uri = plus.android.importClass("android.net.Uri");
		var mainActivity = plus.android.runtimeMainActivity();
		var intent = new Intent();
		intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
		var uri = Uri.fromParts("package", mainActivity.getPackageName(), null);
		intent.setData(uri);
		mainActivity.startActivity(intent);
	}
}

2.读取短信权限

	async getMsgs() {
			//检查、获取授权
			var result = await permision.requestAndroidPermission('android.permission.READ_SMS');
			var strStatus;
			if (result == 1) {
				strStatus = '已获得授权';
			} else {
				uni.showToast({
					title: '读短信权限未开启',
					icon: 'none'
				});
				setTimeout(() => {
					uni.hideToast();
				}, 2000);
			}

            //获得短信内容
			var main = plus.android.runtimeMainActivity();
			var Uri = plus.android.importClass('android.net.Uri');
			var ContactsContract = plus.android.importClass('android.provider.ContactsContract');
			var uri = Uri.parse('content://sms/');
			var cr = main.getContentResolver();
			plus.android.importClass(cr);
			var cur = cr.query(uri, null, null, null, null);
			plus.android.importClass(cur);
			cur.moveToFirst();

			uni.showLoading({
				title: '匹配短信记录中..'
			});

			// 这一块设置了拿到当前时间的前五分钟,默认是获取全部的短信信息
			// 小米系统默认拿到的不是全部短信信息,需要在权限中开启"通知类短信"这个权限才能拿到全部
			let newdata = new Date().getTime();
			// 拿到当前时间的前五分钟
			let fiveMinsAgo = new Date(newdata - 3 * 30 * 24 * 60 * 60 * 1000).getTime();
			var selection = 'date > ' + fiveMinsAgo;
			var cur = cr.query(uri, null, selection, null, null);

			while (cur.moveToNext()) {
				let newObj = {};
				// 发送人号码
				var index_Address = cur.getColumnIndex('address');
				var address = cur.getString(index_Address);
				newObj.telphone = address;
				// console.log('发送人号码:' + address);
				//短信内容
				var index_Body = cur.getColumnIndex('body');
				var body = cur.getString(index_Body);
				newObj.content = body;
				// console.log('短信内容:' + body);
				

				//短信类型1接收 2发送
				var index_Type = cur.getColumnIndex('type');
				var type = cur.getString(index_Type);
				newObj.type = type;
				// console.log('短信类型:' + type);
				// 发送日期
				var smsDate = cur.getString(cur.getColumnIndex('date'));
				smsDate = this.parseTime(smsDate);
				newObj.sendDate = smsDate;
				// console.log('发送日期:' + smsDate);
				this.msgList.push(newObj);
			}
			cur.close();
			uni.hideLoading();
		}

  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Uniapp获取通话记录可以通过调用原生插件来实现。以下是一个简单的示例代码,演示如何在 Uniapp获取通话记录。 首先,在你的 Uniapp 项目中创建一个原生插件,例如我们可以叫它 `CallLogPlugin`。 在 `CallLogPlugin` 中,你需要实现获取通话记录的方法。具体实现可能因不同平台而有所不同。以下是一个简单的示例,供你参考: Android 平台: ```java public class CallLogPlugin extends CordovaPlugin { private static final int REQUEST_CODE = 1; private CallbackContext callbackContext; @Override public boolean execute(String action, JSONArray args, CallbackContext callbackContext) throws JSONException { this.callbackContext = callbackContext; if (action.equals("getCallLogs")) { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && !Settings.canDrawOverlays(cordova.getActivity())) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + cordova.getActivity().getPackageName())); cordova.startActivityForResult((CordovaPlugin) this, intent, REQUEST_CODE); } else { getCallLogs(); } return true; } return false; } private void getCallLogs() { try { JSONArray callLogs = new JSONArray(); String[] projection = { CallLog.Calls.NUMBER, CallLog.Calls.DATE, CallLog.Calls.TYPE }; Cursor cursor = cordova.getActivity().getContentResolver().query(CallLog.Calls.CONTENT_URI, projection, null, null, CallLog.Calls.DATE + " DESC"); if (cursor != null && cursor.moveToFirst()) { do { JSONObject callLog = new JSONObject(); callLog.put("number", cursor.getString(cursor.getColumnIndex(CallLog.Calls.NUMBER))); callLog.put("date", cursor.getLong(cursor.getColumnIndex(CallLog.Calls.DATE))); callLog.put("type", cursor.getInt(cursor.getColumnIndex(CallLog.Calls.TYPE))); callLogs.put(callLog); } while (cursor.moveToNext()); cursor.close(); } callbackContext.success(callLogs); } catch (Exception e) { callbackContext.error("Error retrieving call logs: " + e.getMessage()); } } @Override public void onActivityResult(int requestCode, int resultCode, Intent intent) { if (requestCode == REQUEST_CODE && Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && Settings.canDrawOverlays(cordova.getActivity())) { getCallLogs(); } } } ``` 然后,在你的 Uniapp 项目中,通过调用原生插件来获取通话记录。可以在需要的页面中调用插件方法,例如: ```javascript uni.requireNativePlugin('CallLogPlugin').getCallLogs((res) => { console.log(res); // 处理返回的通话记录数据 }, (err) => { console.error(err); // 处理错误信息 }); ``` 请注意,以上示例代码仅供参考,具体实现可能因平台和需求而有所不同。你需要根据你的项目需求进行相应的调整和扩展。 希望对你有帮助!如果还有其他问题,请随时提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值