/** * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启 * @description 安卓相关权限,需要先在manifest.json中勾选 * @param {String} scopeValue - 权限种类 * */ // 只写了当前项目用到的权限,其他用到的自己加下 const PERMISSION_MAP = { 'userLocation': { tip: '地理位置', androidPermissionID: ['android.permission.ACCESS_FINE_LOCATION'], }, 'writePhotosAlbum': { tip: '保存到相册', androidPermissionID: ['android.permission.WRITE_EXTERNAL_STORAGE'], }, 'camera': { tip: '摄像头', androidPermissionID: ['android.permission.CAMERA'], } } // 判断平台 let isIos = (plus.os.name == "iOS") export default class AppAuth { constructor(scopeValue) { this.scopeValue = scopeValue } //权限检测 async checkAuth() { const that = this let result = false switch (this.scopeValue) { case 'userLocation': //定位权限 result = isIos ? that.iosLocationAuth : await that.androidAuth() break; case 'writePhotosAlbum': //相册权限 result = isIos ? that.iosPhotoAuth : await that.androidAuth() break; case 'camera': //摄像头权限 result = isIos ? that.iosCameraAuth : await that.androidAuth() break; default: result = false break; } return Promise.resolve(result) } // Android权限查询 androidAuth() { const that = this; let permissionID = PERMISSION_MAP[this.scopeValue].androidPermissionID; return new Promise((resolve, reject) => { plus.android.requestPermissions( [...permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装 function(resultObj) { let 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) { that.gotoAppSetting() } }, function(error) { console.log('申请权限错误:' + error.code + " = " + error.message); resolve({ code: error.code, message: error.message }); } ); }); } // 跳转到**应用**的权限页面 gotoAppSetting() { uni.showModal({ title: '设置权限', content: `当前功能需要${PERMISSION_MAP[this.scopeValue].tip}权限,是否去设置?`, confirmText: '设置', success: res => { if (res.confirm) { if (isIos) { let UIApplication = plus.ios.import("UIApplication"); let application2 = UIApplication.sharedApplication(); let NSURL2 = plus.ios.import("NSURL"); let setting2 = NSURL2.URLWithString("app-settings:"); application2.openURL(setting2); plus.ios.deleteObject(setting2); plus.ios.deleteObject(NSURL2); plus.ios.deleteObject(application2); } else { 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); } } }, fail: err => { console.log(`%cuni.showModal失败:`, 'color:green;background:yellow'); } }) } // 定位是否开启 iosLocationAuth() { let result = 0; let cllocationManger = plus.ios.import("CLLocationManager"); let enable = cllocationManger.locationServicesEnabled(); let status = cllocationManger.authorizationStatus(); if (!enable) { result = 2; } else if (status === 0) { result = null; } else if (status === 3 || status === 4) { result = 1; } else { result = 0; } plus.ios.deleteObject(cllocationManger); return result; } // 判断推送权限是否开启 iosPushAuth() { let result = false; let UIApplication = plus.ios.import("UIApplication"); let app = UIApplication.sharedApplication(); let enabledTypes = 0; if (app.currentUserNotificationSettings) { let settings = app.currentUserNotificationSettings(); enabledTypes = settings.plusGetAttribute("types"); console.log("enabledTypes1:" + enabledTypes); if (enabledTypes == 0) { console.log("推送权限没有开启"); } else { result = true; console.log("已经开启推送功能!") } plus.ios.deleteObject(settings); } else { enabledTypes = app.enabledRemoteNotificationTypes(); if (enabledTypes == 0) { console.log("推送权限没有开启!"); } else { result = true; console.log("已经开启推送功能!") } console.log("enabledTypes2:" + enabledTypes); } plus.ios.deleteObject(app); plus.ios.deleteObject(UIApplication); return result; } // 判断麦克风权限是否开启 iosRecordAuth() { let result = false; let avaudiosession = plus.ios.import("AVAudioSession"); let avaudio = avaudiosession.sharedInstance(); let permissionStatus = avaudio.recordPermission(); console.log("permissionStatus:" + permissionStatus); if (permissionStatus == 1684369017 || permissionStatus == 1970168948) { console.log("麦克风权限没有开启"); } else { result = true; console.log("麦克风权限已经开启"); } plus.ios.deleteObject(avaudiosession); return result; } // 判断相机权限是否开启 iosCameraAuth() { let result = false; let AVCaptureDevice = plus.ios.import("AVCaptureDevice"); let authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide'); console.log("authStatus:" + authStatus); if (authStatus == 3) { result = true; console.log("相机权限已经开启"); } else { console.log("相机权限没有开启"); } plus.ios.deleteObject(AVCaptureDevice); return result; } // 判断相册权限是否开启 iosPhotoAuth() { let result = false; let PHPhotoLibrary = plus.ios.import("PHPhotoLibrary"); let authStatus = PHPhotoLibrary.authorizationStatus(); console.log("authStatus:" + authStatus); if (authStatus == 3) { result = true; console.log("相册权限已经开启"); } else { console.log("相册权限没有开启"); } plus.ios.deleteObject(PHPhotoLibrary); return result; } // 判断通讯录权限是否开启 iosContactAuth() { let result = false; let CNContactStore = plus.ios.import("CNContactStore"); let cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0); if (cnAuthStatus == 3) { result = true; console.log("通讯录权限已经开启"); } else { console.log("通讯录权限没有开启"); } plus.ios.deleteObject(CNContactStore); return result; } // 判断日历权限是否开启 iosCalendarAuth() { let result = false; let EKEventStore = plus.ios.import("EKEventStore"); let ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0); if (ekAuthStatus == 3) { result = true; console.log("日历权限已经开启"); } else { console.log("日历权限没有开启"); } plus.ios.deleteObject(EKEventStore); return result; } // 判断备忘录权限是否开启 iosMemoAuth() { let result = false; let EKEventStore = plus.ios.import("EKEventStore"); let ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1); if (ekAuthStatus == 3) { result = true; console.log("备忘录权限已经开启"); } else { console.log("备忘录权限没有开启"); } plus.ios.deleteObject(EKEventStore); return result; } }