监听权限申请

app-android平台,可使用本API监听应用权限申请确认框的弹出和关闭。不管是哪处的业务代码在申请权限,当弹出和关闭权限申请确认框时均会触发本监听事件。

华为应用市场审核时要求:APP在调用终端权限时,应同步告知用户申请该权限的目的。此时即可使用本API,在app.uvue里全局监听

创建监听对象后,返回RequestPermissionListener,然后调起其的onConfirm和onComplete。

  • 当权限申请的确认框在手机端弹出时,会触发onConfirm,回调中会以数组方式提供权限名称列表。
  • 当权限申请的确认框被用户关闭后,会触发onComplete

uni.createRequestPermissionListener()

创建一个监听权限申请的 RequestPermissionListener 对象。

注意:HBuilderX 4.01 Vue2项目需要使用自定义基座测试监听权限申请的功能,标准基座暂不支持测试。

RequestPermissionListener 对象的方法列表

方法 参数 说明
onRequest callback 监听申请系统权限
onConfirm callback 监听弹出系统权限授权框
onComplete callback 监听权限申请完成
stop 取消所有监听

示例

<template>
<view>
<view class=”permission-alert” id=”permission-alert” :style=”{‘transform’:isPermissionAlertShow ? ‘translateY(0)’:’translateY(-250rpx)’}”>
<text style=”font-size: 20px;margin-bottom: 10px;margin-top: 5px; display: block;”>手机状态权限申请说明:</text>
<text style=”color: darkgray;”>uni-app正在申请手机状态权限,允许或拒绝均不会获取任何隐私信息。</text>
</view>
<button @click=”requestPermission”>点击申请日历权限</button>
</view>
</template>
<script>
export default {
data() {
return {
isPermissionAlertShow: false,
//permissionListener: null
}
},
onReady() {
this.watchPermission()
},
onUnload() {
if (this.permissionListener) {
this.permissionListener.stop()
}
},
methods: {
watchPermission() {
this.permissionListener = uni.createRequestPermissionListener();
this.permissionListener.onConfirm((e) => {
this.isPermissionAlertShow = true
});
this.permissionListener.onComplete((e) => {
this.isPermissionAlertShow = false
});
},
requestPermission() {
plus.android.requestPermissions([“android.permission.READ_CALENDAR”], (e) => {
}, (e) => {
})
}
}
}
</script>
<style>
.permission-alert {
width: 650rpx;
height: 200rpx;
margin: 20rpx 40rpx;
position: absolute;
top: 0px;
z-index: 3;
border-radius: 5px;
transition-property: transform;
transition-duration: 200ms;
background-color: white;
padding: 10rpx;
}
</style>

全局监听权限申请并弹窗提示用户权限申请原因

iOS的权限申请原因,是在 manifest 或 info.plist 里配置的。

Android没有在系统层面提供这套机制,但一些应用商店(如华为),又要求申请权限时弹框说明原因。

虽然 uni.createRequestPermissionListener 可以监听权限申请,但前端弹框的层级较低,无法正常显示权限申请原因。

所以DCloud提供了一个插件,可以在原生层面给出文字提示:

uni-registerRequestPermissionTips 插件

插件地址:

https://ext.dcloud.net.cn/plugin?name=uni-registerRequestPermissionTips

1、安装插件

2、添加

App.vue

import {
registerRequestPermissionTipsListener,
unregisterRequestPermissionTipsListener,
setRequestPermissionTips
} from “@/uni_modules/uni-registerRequestPermissionTips”

var PermissionTips = {
“android.permission.CAMERA”: “<h4 style=\”font-size:40px;\”>相机权限说明</h4><font color=#cccccc>您的应用需要访问摄像头以进行拍照、录屏、二维码扫码</font>”,

// 设备访问权限
“android.permission.READ_EXTERNAL_STORAGE”:”<h4 style=\”font-size:40px;\”>设备访问权限</h4><font color=#cccccc>您的应用需要读取设备上的照片、媒体内容和文件进行用于资料上传</font>”,
// 设备写入权限
“android.permission.WRITE_EXTERNAL_STORAGE “:”<h4 style=\”font-size:40px;\”>设备写入权限</h4><font color=#cccccc>您的应用需要在设备上的存储选中的照片、媒体内容和文件、或保存拍摄的图片、视频</font>”,
// 通讯录
“android.permission.GET_ACCOUNTS”: “<h4 style=\”font-size:40px;\”>通讯录权限</h4><font color=#cccccc>您的应用需要获取设备上已登录的账号信息用于身份验证</font>”,
“android.permission.READ_PHONE_STATE”: “<h4 style=\”font-size:40px;\”>正在读取网络状态权限</h4><font color=#cccccc>您的应用需要获取设备当前网络状态,用于联网检查</font>”,
// Android 13+ 新权限
“android.permission.READ_MEDIA_IMAGES”:”<h4 style=\”font-size:40px;\”>图片访问权限</h4><font color=#cccccc>您的应用需要读取照片用于资料上传</font>”,
“android.permission.READ_MEDIA_VIDEO”:”<h4 style=\”font-size:40px;\”>媒体访问权限</h4><font color=#cccccc>您的应用需要读取媒体内容、文件用于资料上传</font>”,
}

export default {

onLaunch: function (options) {

var brand = uni.getSystemInfoSync().deviceBrand
setRequestPermissionTips(PermissionTips)
registerRequestPermissionTipsListener({
onRequest: (e) => {
console.log(e)
},
onConfirm: (e) => {
console.log(e)
},
onComplete: (e) => {
// 华为手机在权限禁止之后,再次申请权限不会出现权限申请框。此时应该引导用户去系统设置开启此权限,不应该频繁申请。
// if (brand.toLowerCase() == “huawei”) {
console.log(‘registerRequestPermissionTipsListener’, e)
if (plus.os.name != “iOS”) {
var tips = {}
var hasDeniedPermission = false
for (var k in PermissionTips) {
if (e[k] != “denied”) {
tips[k] = PermissionTips[k]
} else {
hasDeniedPermission = true
}
}
setRequestPermissionTips(tips) // 更新弹框提醒,防止华为手机不出现权限申请框时权限提醒框闪烁的情况
if (hasDeniedPermission)
uni.showModal({
content: “权限已经被拒绝,请前往设置中开启”
})
}
}
})

}

}

3、权限说明模板

相机权限说明(android.permission.CAMERA)

便于您使用该功能上传图片,用于与客服沟通等场景中发送拍摄图片

便于您使用该功能上传您的照片/图片/视频及用于更换头像、发布产品/需求、下载、与客服沟通等场景中读取和写入相册和文件内容

Tips

 

作者 admin

百度广告效果展示