# uni.createRequestPermissionListener()

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

# createRequestPermissionListener 兼容性

Web Android iOS
x 4.0 x

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

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

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

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

# 返回值

类型
RequestPermissionListener

# RequestPermissionListener 的方法

# onRequest(callback : RequestPermissionListenerRequestCallback) : void

监听申请系统权限

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

# onConfirm(callback : RequestPermissionListenerConfirmCallback) : void

监听弹出系统权限授权框

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

# onComplete(callback : RequestPermissionListenerCompleteCallback) : void

监听权限申请完成

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

# stop() : void

取消所有监听

# stop 兼容性
Web Android iOS
- - -

# Tips

# 示例

hello uni-app x

该 API 不支持 Web,请运行 hello uni-app x 到 App 平台体验

扫码体验(手机浏览器跳转到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>

# 参见

# 通用类型

# GeneralCallbackResult

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