Browse Source

追加华为权限

wangxy 2 months ago
parent
commit
3a2b9b9520
2 changed files with 200 additions and 0 deletions
  1. 11 0
      pages/my/yingyongshezhi.vue
  2. 189 0
      store/permissionStore.js

+ 11 - 0
pages/my/yingyongshezhi.vue

@@ -94,6 +94,10 @@
 	import {
 	import {
 		onShow
 		onShow
 	} from '@dcloudio/uni-app';
 	} from '@dcloudio/uni-app';
+	
+	import { usePermission } from "@/store/permissionStore.js"
+	const permissionStore = usePermission()
+	
 	const agreeType = ref(null);
 	const agreeType = ref(null);
 	const agreeContentDialogRef = ref(null);
 	const agreeContentDialogRef = ref(null);
 
 
@@ -144,6 +148,13 @@
 	const chooseImage = async () => {
 	const chooseImage = async () => {
 		try {
 		try {
 		//	await checkAlbumPermission()
 		//	await checkAlbumPermission()
+			/* #ifdef APP */
+			const systemInfo = uni.getSystemInfoSync();
+			if (systemInfo.platform != 'ios') {
+				if (!await permissionStore.requstPermission('READ_EXTERNAL_STORAGE')) return
+			}
+			/* #endif */
+		
 			uni.chooseImage({
 			uni.chooseImage({
 				count: 1,
 				count: 1,
 				sizeType: ['compressed'],
 				sizeType: ['compressed'],

+ 189 - 0
store/permissionStore.js

@@ -0,0 +1,189 @@
+import {
+	defineStore
+} from 'pinia';
+
+export const usePermission = defineStore('permission', {
+	state: () => {
+		return {
+			dialogView: null,
+			permissionListener: null,
+			list: [{
+				name: "READ_EXTERNAL_STORAGE",
+				title: "读照片及文件权限:",
+				content: "用于更换、上传您的头像、图片功能,不授权该权限会影响app的正常使用",
+			}]
+		};
+	},
+	actions: {
+		//监听权限申请
+		async requstPermission(permissionID) {
+			return new Promise((resolve, reject) => {
+				try {
+					// if (!uni.getSystemInfoSync().platform == 'android') return resolve(true)
+					/**
+					 * @description plus.navigator.checkPermission 检查应用是否获取指定权限
+					 * 有些权限检测不到 就继续下面的代码,比如相册权限就可以直接检测,就很方便,授权情况下不需要再走下面代码了
+					 * checkPermission 返回参数
+					 * @params undetermined 未确定
+					 * @params authorized 授权
+					 */
+					let checkPermission = plus.navigator.checkPermission(
+						"android.permission." + permissionID
+					);
+					if (checkPermission == "authorized") return resolve(true);
+					//判断是否自己在list里面配置了这个权限
+					let index = this.list.findIndex((item) => item.name == permissionID);
+					if (index == -1) throw new Error("这个权限没有配置");
+					//唤起原生权限说明弹框
+					this.requstPermissionDialog(index);
+					//授权检测回调
+					plus.android.requestPermissions(
+						[
+							"android.permission." + permissionID, //单个权限
+						],
+						(resultObj) => {
+							this.permissionListener.stop();
+							console.log(resultObj, "resultObj");
+							// 权限申请结果
+							/**
+							 * @description resultObj.deniedAlways 永久拒绝授权
+							 * 多个权限返回结果可能是{"granted":["android.permission.CAMERA"],"deniedPresent":[],"deniedAlways":["android.permission.READ_EXTERNAL_STORAGE"]}
+							 * 这个情况就是我同时授权相册和相机,但是只允许了相机,没有授权相册
+							 * 这个时候 可以通过deniedAlways 查看哪个权限被永久拒绝了,然后自行在设置弹框内容
+							 * 所以可以自己判断细分一下,我下面的代码是先判断了是否有永久拒绝的权限,然后直接弹框提示用户去设置
+							 */
+							if (resultObj.deniedAlways && resultObj.deniedAlways.length > 0) {
+								uni.showModal({
+									title: "提示",
+									content: "操作权限已被拒绝,请手动前往设置",
+									confirmText: "立即设置",
+									success: (res) => {
+										if (res.confirm) {
+											this.gotoAppPermissionSetting();
+										} else {
+											resolve(false);
+										}
+									},
+								});
+								console.log("永久拒绝授权");
+							} else if (
+								resultObj.deniedPresent &&
+								resultObj.deniedPresent.length > 0
+							) {
+								resolve(false);
+								console.log("拒绝授权");
+							} else if (resultObj.granted && resultObj.granted.length > 0) {
+								resolve(true);
+								console.log("授权成功");
+							}
+						},
+						(error) => {
+							reject(false);
+							console.log("申请权限错误:", error);
+						}
+					);
+				} catch (err) {
+					reject(false);
+					console.log(err);
+				}
+			});
+		},
+		//监听弹框
+		requstPermissionDialog(index) {
+			try {
+				if (!this.permissionListener)
+					this.permissionListener = uni.createRequestPermissionListener();
+				const dialogData = this.list[index];
+				this.permissionListener.onConfirm((res) => {
+					this.dialogStyle(dialogData, true);
+				});
+				this.permissionListener.onComplete(async (res) => {
+					this.dialogStyle({}, false);
+				});
+			} catch (err) {
+				console.log("监听弹框错误", err);
+			}
+		},
+		//弹框样式
+		dialogStyle({
+			title = "",
+			content = ""
+		}, status) {
+			try {
+				if (!status) return this.dialogView.close();
+				const systemInfo = uni.getSystemInfoSync();
+				const statusBarHeight = systemInfo.statusBarHeight;
+				const navigationBarHeight = systemInfo.platform === "android" ? 48 : 44;
+				const totalHeight = statusBarHeight + navigationBarHeight;
+				this.dialogView = new plus.nativeObj.View("per-modal", {
+					top: "0px",
+					left: "0px",
+					width: "100%",
+					backgroundColor: "#444",
+					//opacity: .5;
+				});
+				this.dialogView.drawRect({
+					color: "#fff",
+					radius: "5px",
+				}, {
+					top: totalHeight + "px",
+					left: "5%",
+					width: "90%",
+					height: "100px",
+				});
+				this.dialogView.drawText(
+					title, {
+						top: totalHeight + 5 + "px",
+						left: "8%",
+						height: "30px",
+					}, {
+						align: "left",
+						color: "#000",
+					}
+				);
+				this.dialogView.drawText(
+					content, {
+						top: totalHeight + 35 + "px",
+						height: "60px",
+						left: "8%",
+						width: "84%",
+					}, {
+						whiteSpace: "normal",
+						size: "14px",
+						align: "left",
+						color: "#656563",
+					}
+				);
+				this.dialogView.show();
+			} catch (e) {
+				console.log(e, "权限说明弹框样式错误");
+			}
+		},
+		//跳转到app权限设置页面
+		gotoAppPermissionSetting() {
+			if (!uni.getSystemInfoSync().platform == "android") {
+				// ios
+				/* var UIApplication = plus.ios.import("UIApplication");
+						        var application2 = UIApplication.sharedApplication();
+						        var NSURL2 = plus.ios.import("NSURL");
+						        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);
+			}
+		},
+	},
+});