安卓权限判断及ios权限判断,解决华为应用商店告知用户权限使用弹窗

216 阅读6分钟

安卓权限判断

/**
 * 本模块封装了Android、iOS的应用权限判断、打开应用权限设置界面、以及位置系统服务是否开启
 */

var isIos
// #ifdef APP-PLUS
isIos = (plus.os.name == "iOS")
// #endif

// 判断推送权限是否开启
function judgeIosPermissionPush() {
    var result = false;
    var UIApplication = plus.ios.import("UIApplication");
    var app = UIApplication.sharedApplication();
    var enabledTypes = 0;
    if (app.currentUserNotificationSettings) {
        var 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;
}

// 判断定位权限是否开启
function judgeIosPermissionLocation() {
    var result = false;
    var cllocationManger = plus.ios.import("CLLocationManager");
    var status = cllocationManger.authorizationStatus();
    result = (status != 2)
    console.log("定位权限开启:" + result);
    // 以下代码判断了手机设备的定位是否关闭,推荐另行使用方法 checkSystemEnableLocation
    /* var enable = cllocationManger.locationServicesEnabled();
    var status = cllocationManger.authorizationStatus();
    console.log("enable:" + enable);
    console.log("status:" + status);
    if (enable && status != 2) {
        result = true;
        console.log("手机定位服务已开启且已授予定位权限");
    } else {
        console.log("手机系统的定位没有打开或未给予定位权限");
    } */
    plus.ios.deleteObject(cllocationManger);
    return result;
}

// 判断麦克风权限是否开启
function judgeIosPermissionRecord() {
    var result = false;
    var avaudiosession = plus.ios.import("AVAudioSession");
    var avaudio = avaudiosession.sharedInstance();
    var 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;
}

// 判断相机权限是否开启
function judgeIosPermissionCamera() {
    var result = false;
    var AVCaptureDevice = plus.ios.import("AVCaptureDevice");
    var authStatus = AVCaptureDevice.authorizationStatusForMediaType('vide');
    console.log("authStatus:" + authStatus);
    if (authStatus == 3) {
        result = true;
        console.log("相机权限已经开启");
    } else {
        console.log("相机权限没有开启");
    }
    plus.ios.deleteObject(AVCaptureDevice);
    return result;
}

// 判断相册权限是否开启
function judgeIosPermissionPhotoLibrary() {
    var result = false;
    var PHPhotoLibrary = plus.ios.import("PHPhotoLibrary");
    var authStatus = PHPhotoLibrary.authorizationStatus();
    console.log("authStatus:" + authStatus);
    if (authStatus == 3) {
        result = true;
        console.log("相册权限已经开启");
    } else {
        console.log("相册权限没有开启");
    }
    plus.ios.deleteObject(PHPhotoLibrary);
    return result;
}

// 判断通讯录权限是否开启
function judgeIosPermissionContact() {
    var result = false;
    var CNContactStore = plus.ios.import("CNContactStore");
    var cnAuthStatus = CNContactStore.authorizationStatusForEntityType(0);
    if (cnAuthStatus == 3) {
        result = true;
        console.log("通讯录权限已经开启");
    } else {
        console.log("通讯录权限没有开启");
    }
    plus.ios.deleteObject(CNContactStore);
    return result;
}

// 判断日历权限是否开启
function judgeIosPermissionCalendar() {
    var result = false;
    var EKEventStore = plus.ios.import("EKEventStore");
    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(0);
    if (ekAuthStatus == 3) {
        result = true;
        console.log("日历权限已经开启");
    } else {
        console.log("日历权限没有开启");
    }
    plus.ios.deleteObject(EKEventStore);
    return result;
}

// 判断备忘录权限是否开启
function judgeIosPermissionMemo() {
    var result = false;
    var EKEventStore = plus.ios.import("EKEventStore");
    var ekAuthStatus = EKEventStore.authorizationStatusForEntityType(1);
    if (ekAuthStatus == 3) {
        result = true;
        console.log("备忘录权限已经开启");
    } else {
        console.log("备忘录权限没有开启");
    }
    plus.ios.deleteObject(EKEventStore);
    return result;
}

// Android权限查询
function requestAndroidPermission(key,permissionID,callback) {
    return new Promise((resolve, reject) => {
        plus.android.requestPermissions(
            [permissionID], // 理论上支持多个权限同时查询,但实际上本函数封装只处理了一个权限的情况。有需要的可自行扩展封装
            function(resultObj) {
                var result = null;
                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
                }
				uni.setStorageSync(key,result)
                callback && callback(result)
                resolve(result);
                // 若所需权限被拒绝,则打开APP设置界面,可以在APP设置界面打开相应权限
                // if (result != 1) {
                // gotoAppPermissionSetting()
                // }
            },
            function(error) {
                console.log('申请权限错误:' + error.code + " = " + error.message);
                callback && callback()
                resolve({
                    code: error.code,
                    message: error.message
                });
            }
        );
    });
}

// 使用一个方法,根据参数判断权限
function judgeIosPermission(permissionID) {
    if (permissionID == "location") {
        return judgeIosPermissionLocation()
    } else if (permissionID == "camera") {
        return judgeIosPermissionCamera()
    } else if (permissionID == "photoLibrary") {
        return judgeIosPermissionPhotoLibrary()
    } else if (permissionID == "record") {
        return judgeIosPermissionRecord()
    } else if (permissionID == "push") {
        return judgeIosPermissionPush()
    } else if (permissionID == "contact") {
        return judgeIosPermissionContact()
    } else if (permissionID == "calendar") {
        return judgeIosPermissionCalendar()
    } else if (permissionID == "memo") {
        return judgeIosPermissionMemo()
    }
    return false;
}

// 跳转到**应用**的权限页面
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);
    }
}

// 检查系统的设备服务是否开启
// var checkSystemEnableLocation = async function () {
function checkSystemEnableLocation() {
    if (isIos) {
        var result = false;
        var cllocationManger = plus.ios.import("CLLocationManager");
        var result = cllocationManger.locationServicesEnabled();
        console.log("系统定位开启:" + result);
        plus.ios.deleteObject(cllocationManger);
        return result;
    } else {
        var context = plus.android.importClass("android.content.Context");
        var locationManager = plus.android.importClass("android.location.LocationManager");
        var main = plus.android.runtimeMainActivity();
        var mainSvr = main.getSystemService(context.LOCATION_SERVICE);
        var result = mainSvr.isProviderEnabled(locationManager.GPS_PROVIDER);
        console.log("系统定位开启:" + result);
        return result
    }
}


module.exports = {
    judgeIosPermission: judgeIosPermission,
    requestAndroidPermission: requestAndroidPermission,
    checkSystemEnableLocation: checkSystemEnableLocation,
    gotoAppPermissionSetting: gotoAppPermissionSetting
}


ios权限判断及使用

// ios权限列表
const iosPermissions = {
	CAMERA: iosCamera, // 摄像头
	LOCATION: iosLocation, // 位置
	STORAGE: iosAlbum, // 相册
	RECORD_AUDIO: iosRecord, // 麦克风
	CALL_PHONE: iosContact, // 通讯录
}

function iosPermissionCheck(permissionID,callback) {
	return new Promise((resolve, reject) => {
		let res = iosPermissions[permissionID]();
		uni.setStorageSync(permissionID,res)
		callback && callback()
		resolve(res);
	});
}

// 摄像头权限
function iosCamera() {
	let result = 0,
		avCaptureDevice = plus.ios.importClass("AVCaptureDevice"),
		authStatus = avCaptureDevice.authorizationStatusForMediaType("vide");
	if (authStatus === 3) {
		result = 1;
	} else {
		result = 0;
	}
	plus.ios.deleteObject(avCaptureDevice);
	return result;
}

// 位置权限
function iosLocation() {
	let result = 0,
		cLLocationManager = plus.ios.importClass("CLLocationManager"),
		authStatus = cLLocationManager.authorizationStatus(),
		enable = cLLocationManager.locationServicesEnabled();
	if (enable && authStatus != 2) {
		result = 1;
	} else {
		result = 0;
	}
	plus.ios.deleteObject(cLLocationManager);
	return result;
}

// 日历权限

function iosCalendar() {
	let result = 0,
		eKEventStore = plus.ios.importClass("EKEventStore"),
		authStatus = eKEventStore.authorizationStatusForEntityType(0);
	if (authStatus === 3) {
		result = 1;
	} else {
		result = 0;
	}
	plus.ios.deleteObject(eKEventStore);
	return result;
}

// 相册权限
function iosAlbum() {
	let result = 0,
		photoLibrary = plus.ios.importClass("PhotoLibrary"),
		authStatus = photoLibrary.authorizationStatus();
	if (authStatus === 3) {
		result = 1;
	} else {
		result = 0;
	}
	plus.ios.deleteObject(photoLibrary);
	return result;
}

// 麦克风权限

function iosRecord() {
	let result = 0,
		aVAudioSession = plus.ios.importClass("AVAudioSession"),
		aVAudio = aVAudioSession.sharedInstance(),
		authStatus = aVAudio.recordPermission();
	if ([1684369017, 1970168948].includes(authStatus)) {
		result = 0;
	} else {
		result = 1;
	}
	plus.ios.deleteObject(aVAudioSession);
	return result;
}

// 通讯录权限
function iosContact() {
	let result = 0,
		contactStore = plus.ios.importClass("CNContactStore"),
		authStatus = contactStore.authorizationStatusForEntityType(0);
	if (authStatus === 3) {
		result = 1;
	} else {
		result = 0;
	}
	plus.ios.deleteObject(contactStore);
	return result;
}

export default iosPermissionCheck

关于这篇文章,主要是解决鸿蒙上线时需要告知用户使用权限的问题,下面是弹窗及目的的全代码

<template>
	<view>
		<uni-popup ref="tips" type="top">
			<view class="bg">
				<view class="lh50">
					{{actionPermission.title}}使用说明:
				</view>
				<view class="lh50">
					{{actionPermission.tips}}
				</view>
			</view>
		</uni-popup>


		<uni-popup ref="authorizeTips" type="dialog">
			<uni-popup-dialog cancelText="取消" confirmText="确定" title="提示" @confirm="handelAllow()" @close="tipsClose()">
				<view class=""> 您已禁止{{actionPermission.title}},如需要使用请设置!</view>
			</uni-popup-dialog>
		</uni-popup>


	</view>
</template>

<script>
	import {
		tipsConfig
	} from './index.js'
	import permision from './permission.js'
	import iosPermision from './iosPermission.js'
	export default {
		data() {
			return {
				show: false,
				key: 'CAMERA',
				// isSetting: false,
			}
		},
		computed: {
			actionPermission() {
				return tipsConfig[this.key]
			}
		},
		methods: {
			async showView(key = 'CAMERA', callback) {

				// #ifdef APP-PLUS
				// 获取系统信息
				const systemInfo = uni.getSystemInfoSync();
				// 判断是否为ios
				const isIos = systemInfo?.platform === 'ios';
				if (isIos) {
					// 如果是第一次则直接调用
					const result = await this.getIosPermission(this.actionPermission?.key)
					if (result == 1) {
						
					} else {
						uni.removeStorageSync(key)
						this.$refs.authorizeTips.open()
					}
					console.log(result);
					return callback && callback()
				}
				this.key = key
				// 如果返回1 则是允许权限 直接调用回调就行 如果是0则询问 -1则永久拒绝
				const permission = uni.getStorageSync('permission') || {}
				const keyStatus = permission[this.actionPermission?.key] || null
				if (keyStatus == 1) {
					return callback && callback()
				}
				const result = await this.requestAndroidPermission(key)
				permission[this.actionPermission?.key] = result
				if (result == 1) {
					callback && callback()
				} 
				//#endif
				// #ifndef APP-PLUS
				callback && callback()
				//#endif
			},
			tipsClose() {
				this.$refs.authorizeTips.close()
				this.$refs.tips.close()
			},
			/**
			 * 禁止
			 */
			handelProhibited(status) {
				this.close()
			},
			/**
			 * 允许
			 */
			handelAllow() {
				this.show = false
				permision.gotoAppPermissionSetting()
			},
			async getIosPermission(key){
				let result = uni.getStorageSync(key)
				if (result == -1) {
					uni.removeStorageSync(key)
					this.$refs.authorizeTips.open()
					return
				}  else if (result != 1){
					this.$refs.tips.open()
				}
				console.log(key);
				return await iosPermision(key,() => {
					this.$refs.tips.close()
				})
			},
			async requestAndroidPermission(key) {
				let result = uni.getStorageSync(key)
				if (result == -1) {
					uni.removeStorageSync(key)
					this.$refs.authorizeTips.open()
					return
				}  else if (result != 1){
					this.$refs.tips.open()
				}
				return await permision.requestAndroidPermission(key, () => {
					this.$refs.tips.close()
				})
			},
		}
	}
</script>

<style lang="scss" scoped>
	.tips-box {
		left: 0;
		top: 0;
		width: 100vw;
		height: 100vh;
	}

	.bg {
		position: absolute;
		top: 80rpx;
		left: 50%;
		transform: translateX(-50%);
		width: 80%;
		background-color: #fff;
		padding: 20rpx;
		border-radius: 12rpx;
	}

	/deep/ .u-popup__content {
		background-color: transparent;
	}

	.content {
		width: 80vw;
	}

	.color {
		color: #4994F6;
	}

	.action::before {
		content: '';
		width: 4rpx;
		height: 100%;
		position: absolute;
		left: 50%;
		top: 0;
		transform: translateX(-50%);
		background-color: #D9D9D9;
	}
</style>
index.js文件

export const tipsConfig = {
    LOCATION: {
        title: '位置权限',
        tips: '用于获取当前位置信息、考勤打卡等场景',
        describe: '获取位置信息',
        key: 'LOCATION',
        permission:'android.permission.ACCESS_FINE_LOCATION'
    },
    CAMERA: {
        title: '相机/拍摄权限',
        tips: '用于拍照、录制视频等场景',
        describe: '拍摄照片和录制视频',
        key: 'CAMERA',
        permission:'android.permission.CAMERA'
    },
    CAMERA_STORAGE: {
        title: '相机/拍摄/存储空间权限',
        tips: '用于拍照、上传照片等场景',
        describe: '拍摄照片、上传照片',
        key: 'STORAGE',
        permission:'android.permission.CAMERA'
    },
    CAMERA_VIDEO_STORAGE: {
        title: '相机/拍摄/存储空间权限',
        tips: '用于拍摄视频、上传视频等场景',
        describe: '拍摄视频、上传视频',
        key: 'STORAGE',
        permission:'android.permission.CAMERA'
    },
    STORAGE: {
        title: '存储空间/照片权限',
        tips: '用于上传文件、上传照片和视频等场景',
        describe: '上传文件和照片、视频',
        key: 'STORAGE',
        permission:'android.permission.READ_EXTERNAL_STORAGE'
    },
    RECORD_AUDIO: {
        title: '麦克风权限',
        tips: '用于发送语音等场景',
        describe: '录制音频',
        key: 'RECORD_AUDIO',
        permission:'android.permission.RECORD_AUDIO'
    },
    CALL_PHONE: {
        title: '拨打电话权限',
        tips: '用于拨打电话等场景',
        describe: '拨打电话',
        key: 'CALL_PHONE',
        permission:'android.permission.CALL_PHONE'
    }
}
export const clearPermissionStorageKey = (key,err,callback) => {
    if(err?.errMsg?.includes('No Permission')){
        const permission = uni.getStorageSync('permission') || {}
        if(permission[key] == 1){
            delete permission[key]
            uni.setStorageSync('permission',permission)
            callback && callback()
        }
    }
}