简体中文
创建一个监听权限申请的对象。
Web | Android | iOS |
---|---|---|
x | 4.0 | x |
app-android平台,可使用本API监听应用权限申请确认框的弹出和关闭。不管是哪处的业务代码在申请权限,当弹出和关闭权限申请确认框时均会触发本监听事件。
华为应用市场审核时要求:APP在调用终端权限时,应同步告知用户申请该权限的目的
。此时即可使用本API,在app.uvue里全局监听。
创建监听对象后,返回RequestPermissionListener,然后调起其的onConfirm和onComplete。
类型 |
---|
RequestPermissionListener |
监听申请系统权限
Web | Android | iOS |
---|---|---|
- | - | - |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
callback | (permissions: Array<string>) => void | 是 | - | - | 申请系统权限回调,permissions为触发权限申请的所有权限 |
监听弹出系统权限授权框
Web | Android | iOS |
---|---|---|
- | - | - |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
callback | (permissions: Array<string>) => void | 是 | - | - | 弹出系统权限授权框回调,permissions为触发弹出权限授权框的所有权限 |
监听权限申请完成
Web | Android | iOS |
---|---|---|
- | - | - |
名称 | 类型 | 必填 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
callback | (permissions: Array<string>) => void | 是 | - | - | 权限申请完成回调,permissions为申请完成的所有权限 |
取消所有监听
Web | Android | iOS |
---|---|---|
- | - | - |
onConfirm
不会触发。onComplete
可能会触发多次。onConfirm
。目前的临时方案是做延时处理,如下面示例代码。后续会修复此问题。该 API 不支持 Web,请运行 hello uni-app x 到 App 平台体验
<template>
<!-- #ifdef APP -->
<scroll-view style="flex:1">
<!-- #endif -->
<page-head title="权限申请监听"></page-head>
<view class="permission-alert" id="permission-alert"
:style="{'transform':isPermissionAlertShow ? 'translateY(0)':'translateY(-110px)'}">
<text style="font-size: 20px;margin-bottom: 10px;margin-top: 5px;">访问日历权限申请说明:</text>
<text style="color: darkgray;">uni-app x正在申请访问日历权限用于演示,允许或拒绝均不会获取任何隐私信息。</text>
</view>
<button type="primary" style="margin: 10px;" @click="requestPermission">点击申请日历权限</button>
<!-- #ifdef APP -->
</scroll-view>
<!-- #endif -->
</template>
<script>
export default {
data() {
return {
isPermissionAlertShow: false,
permissionAlert: null as UniElement | null,
timeoutId: -1,
permissionListener: null as RequestPermissionListener | null
}
},
onReady() {
this.watchPermissionRRequest()
},
onUnload() {
this.permissionListener?.stop()
this.permissionListener = null
clearTimeout(this.timeoutId)
},
methods: {
watchPermissionRRequest() {
this.permissionListener = uni.createRequestPermissionListener()
this.permissionListener!.onConfirm((_) => {
// TODO 目前onConfirm监听实现的在时间上不够精确,暂时需要延迟弹框,后续修复
// TODO 这里的弹框仅为演示,实际开发中监听权限申请的代码应该在app.uvue中,弹框应全局处理,可参考https://gitcode.net/dcloud/uni-api/-/tree/master/uni_modules/uni-prompt/utssdk/app-android 代码自行封装一个uts的全局弹框
this.timeoutId = setTimeout(() => {
this.isPermissionAlertShow = true
}, 100)
})
this.permissionListener!.onComplete((_) => {
clearTimeout(this.timeoutId)
this.isPermissionAlertShow = false
})
},
requestPermission() {
// #ifdef APP-ANDROID
if (UTSAndroid.checkSystemPermissionGranted(UTSAndroid.getUniActivity()!, ["android.permission.READ_CALENDAR"])) {
uni.showToast({
title: "权限已经同意了,不需要再申请",
position: "bottom"
})
return
}
UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, ["android.permission.READ_CALENDAR"], (_ : boolean, p : string[]) => {
console.log(p)
}, (_ : boolean, p : string[]) => {
uni.showToast({
title: "权限被拒绝了",
position: "bottom"
})
console.log(p)
})
// #endif
}
}
}
</script>
<style>
.permission-alert {
width: 90%;
height: 100px;
margin: 10px 5%;
position: absolute;
top: 0px;
z-index: 3;
border-radius: 5px;
transition-property: transform;
transition-duration: 200ms;
background-color: white;
padding: 10px;
}
</style>
名称 | 类型 | 必备 | 默认值 | 兼容性 | 描述 |
---|---|---|---|---|---|
errMsg | string | 是 | - | - | 错误信息 |