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