# uni.createRequestPermissionListener()

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

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

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

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

  • 当权限申请的确认框在手机端弹出时,会触发onConfirm
  • 当权限申请的确认框被用户关闭后,会触发onComplete

# 返回值

类型
RequestPermissionListener

# RequestPermissionListener 的方法

# onRequest(callback)

监听申请系统权限

# 参数
名称 类型 必填 默认值 描述
callback (permissions: Array<string>) => void - 申请系统权限回调,permissions为触发权限申请的所有权限

# onConfirm(callback)

监听弹出系统权限授权框

# 参数
名称 类型 必填 默认值 描述
callback (permissions: Array<string>) => void - 弹出系统权限授权框回调,permissions为触发弹出权限授权框的所有权限

# onComplete(callback)

监听权限申请完成

# 参数
名称 类型 必填 默认值 描述
callback (permissions: Array<string>) => void - 权限申请完成回调,permissions为申请完成的所有权限

# stop()

取消所有监听

# Tips

# 示例

hello uni-app x

<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>

# createRequestPermissionListener 兼容性

Android iOS web
4.0 - -

# 参见

相关 Bug

# 通用类型

# GeneralCallbackResult

名称 类型 必备 默认值 描述
errMsg string - 错误信息