效果展
核心代码
uni.createRequestPermissionListener()
注意事项
- 我用的是vue3的uniapp + vuex,大家根据自己实际的情况去改;
- 本写法最低版本需要hbuilderx4.0以上,如果是hbuilderx创建的uniapp项目直接升级hbuildx即可,如果是cli创建的项目请移步看我的另一篇文章:cli创建项目编译器版本不同步
- 如扫码之类的,在拒绝授权之后再次点击重新发起授权需要自定义逻辑,如扫码的需要先通过
requestAndroidPermission("android.permission.CAMERA")
或judgeIosPermission("camera")
判断是否有权限再看要不要调用扫码(因为不提前判断的话会打开扫码界面,只不过中心文字是无扫码权限)- 该写法不兼容ios
- 官方集成了一部分,可选择用官方插件
完整代码
store.js
state: {
// permissionListener: null,
persimmionList: [
{
name: "ACCESS_FINE_LOCATION",
title: "手机位置权限申请说明:",
content: "APP正在申请手机地理位置权限,用于推荐距离更近的套餐,允许或拒绝均不会获取任何隐私信息。",
}, {
name: "CALL_PHONE",
title: "拨打电话权限申请说明:",
content: "APP正在申请拨打电话权限,用于联系商家、客服,允许或拒绝均不会获取任何隐私信息。",
}, {
name: "CAMERA",
title: "读取存储权限申请说明:",
content: "APP正在申请摄像头、读取相册权限用于扫一扫、更换头像、发布评论、上传图片,允许或拒绝均不会获取任何隐私信息。",
}, {
name: "NotificationManagerCompat",
title: "通知权限申请说明:",
content: "APP正在申请获取通知权限,用于向您推送订单状态、优惠券状态等通知,允许或拒绝均不会获取任何隐私信息。",
}, {
name: "WRITE_EXTERNAL_STORAGE",
title: "相册写入权限申请说明:",
content: "APP正在申请获取相册写入权限,用于保存图片至您的相册,允许或拒绝均不会获取任何隐私信息。",
}
],
dialogView: null
},
mutations: {
SET_DIALOG_VIEW(state, data) {
state.dialogView = data;
},
SET_PERMISSION_LISTENER(state, data) {
state.permissionListener = data;
},
},
actions: {
//监听授权
watchPermission({
commit, state, dispatch }){
commit('SET_PERMISSION_LISTENER', uni.createRequestPermissionListener())
state.permissionListener.onConfirm((e) => {
if(e[e.length - 1].toUpperCase().includes('CAMERA') || e[e.length - 1].toUpperCase().includes('READ_MINE') || e[e.length - 1].toUpperCase().includes('PHOTOLIBRARY')){
console.log('弹窗提示照片和视频、摄像头、相机授权'