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