
示例工程前端移动开发跨平台【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址https://gitcode.com/gh_mirrors/un/uni-app点击查看免费下载本篇指南围绕 uni-app x当前开源仓库gh_mirrors/un/uni-app中的uni.createRequestPermissionListener()API 展开讲解如何在 App 端全局监听系统权限申请确认框的弹出与关闭并结合 Android 平台源码实现、uni.requestSystemPermission配套调用以及华为应用市场合规要求给出可复制、可运行的完整示例。读完本文你将掌握权限监听对象RequestPermissionListener的创建、onRequest/onConfirm/onComplete/stop四个方法的使用要点、底层实现原理与全局合规弹窗的落地写法。API 概述与适用场景uni.createRequestPermissionListener()用于创建一个监听权限申请的对象。在 app-android 平台上无论业务代码在哪一处申请权限只要系统权限申请确认框弹出或关闭都会触发对应的监听事件。该能力最典型的应用场景是合规告知华为应用市场审核要求“APP 在调用终端权限时应同步告知用户申请该权限的目的”。此时即可使用本 API在app.uvue里做全局监听在系统确认框弹出的同时展示自定义的“申请权限目的说明”既满足审核要求也提升用户体验。监听对象创建后返回RequestPermissionListener随后可调起其onRequest、onConfirm和onComplete当权限申请的确认框在手机端弹出时触发onConfirm当权限申请的确认框被用户关闭后触发onComplete当业务代码发起系统权限申请时触发onRequest申请前的时机点。兼容性说明| Web | Android | iOS | HarmonyOS | | :- | :- | :- | :- | | x | 4.0 | x | x |该 API 仅支持app-android平台HBuilderX 4.0 及以上版本不支持 Web、iOS、HarmonyOS。从 接口类型声明 中的uniPlatform标注也可确认android 平台为uniVer: 4.0其余平台均为x不支持。返回值与 RequestPermissionListener 方法调用uni.createRequestPermissionListener()后返回一个 RequestPermissionListener 实例其接口定义如下export interface RequestPermissionListener { /** * 监听申请系统权限 * param callback 申请系统权限回调permissions为触发权限申请的所有权限 */ onRequest(callback: RequestPermissionListenerRequestCallback): void /** * 监听弹出系统权限授权框 * param callback 弹出系统权限授权框回调permissions为触发弹出权限授权框的所有权限 */ onConfirm(callback: RequestPermissionListenerConfirmCallback): void /** * 监听权限申请完成 * param callback 权限申请完成回调permissions为申请完成的所有权限 */ onComplete(callback: RequestPermissionListenerCompleteCallback): void /** * 取消所有监听 */ stop(): void } export type RequestPermissionListenerRequestCallback (permissions: Arraystring) void export type RequestPermissionListenerConfirmCallback (permissions: Arraystring) void export type RequestPermissionListenerCompleteCallback (permissions: Arraystring) voidonRequest(callback)监听申请系统权限| 参数 | 类型 | 必填 | 描述 | | :- | :- | :-: | :- | | callback | (permissions: Arraystring) void | 是 | 申请系统权限回调permissions为触发权限申请的所有权限 |当任意业务代码发起系统权限申请时触发回调参数为本次申请涉及的全部权限字符串如[android.permission.READ_CALENDAR]。onConfirm(callback)监听弹出系统权限授权框| 参数 | 类型 | 必填 | 描述 | | :- | :- | :-: | :- | | callback | (permissions: Arraystring) void | 是 | 弹出系统权限授权框回调permissions为触发弹出权限授权框的所有权限 |系统权限确认框在手机端弹出时触发。这是展示“申请权限目的”说明的最佳时机也是满足华为应用市场审核要求的关键钩子。onComplete(callback)监听权限申请完成| 参数 | 类型 | 必填 | 描述 | | :- | :- | :-: | :- | | callback | (permissions: Arraystring) void | 是 | 权限申请完成回调permissions为申请完成的所有权限 |权限申请确认框被用户关闭后触发可用于隐藏全局提示、清理定时器等收尾工作。stop()取消所有监听无参数。调用后取消当前监听对象注册的所有回调onRequest/onConfirm/onComplete通常在页面卸载或应用退出时调用避免泄漏。源码级实现原理仓库中的 uni-createRequestPermissionListener 插件实现 展示了该 API 在 Android 平台的底层实现。入口函数如下export const createRequestPermissionListener: CreateRequestPermissionListener function (): RequestPermissionListener { return new AndroidPermissionRequestManager() }AndroidPermissionRequestManager内部持有三个回调字段分别对应requestCallback、confirmCallback、completeCallback。以onConfirm为例onConfirm(callback: RequestPermissionListenerConfirmCallback) { if (this.confirmCallback null) { this.confirmCallback callback } else { UTSAndroid.offPermissionConfirm(this.confirmCallback!) this.confirmCallback callback } UTSAndroid.onPermissionConfirm(this.confirmCallback!) }可以看到该 API 本质上是封装了 UTSAndroid 底层的权限事件总线注册时调用UTSAndroid.onPermissionRequest/onPermissionConfirm/onPermissionComplete重复注册时先offPermissionConfirm等取消旧回调再注册新回调保证始终只保留最新监听stop()则依次offPermissionComplete、offPermissionConfirm、offPermissionRequest并把三个回调字段置为null彻底解除监听。从该实现可以推断同一监听对象上每个事件同时只会生效一个回调重复调用onConfirm等注册方法会用新回调覆盖旧回调而stop()是幂等的清理操作即使未注册任何回调也可安全调用。插件配置 config.json 中声明了minSdkVersion: 19即要求 Android 最低系统版本为 4.4API 19。完整示例监听日历权限申请仓库示例页面 create-request-permission-listener.uvue 与该文档示例同步演示了监听 发起申请 顶部提示条的完整闭环。核心逻辑如下节选script setup languts const isPermissionAlertShow ref(false) const timeoutId ref(-1) const permissionListener ref(null as RequestPermissionListener | null) onUnload(() { permissionListener.value?.stop() permissionListener.value null clearTimeout(timeoutId.value) }) const watchPermissionRRequest () { permissionListener.value uni.createRequestPermissionListener() permissionListener.value!.onConfirm((_) { // 注意onConfirm 触发时机与系统弹窗存在微小时间差示例中延迟 100ms 再展示提示条 timeoutId.value setTimeout(() { isPermissionAlertShow.value true }, 100) }) permissionListener.value!.onComplete((_) { clearTimeout(timeoutId.value) isPermissionAlertShow.value false }) } const requestPermission () { // #ifdef APP-ANDROID uni.requestSystemPermission({ permissions: [android.permission.READ_CALENDAR], success: (res) { console.log(res.grantedList) console.log(res.deniedList) }, fail: (err) { uni.showToast({ title: 权限被拒绝了, position: bottom }) console.log(err.errCode) } }) // #endif } onReady(() { watchPermissionRRequest() }) /script模板部分包含一个可滑入滑出的“权限申请说明”提示条和一个申请按钮template !-- #ifdef APP !VUE3-VAPOR -- scroll-view styleflex:1 !-- #endif -- page-head title权限申请监听/page-head view classpermission-alert idpermission-alert :style{transform:isPermissionAlertShow ? translateY(0):translateY(-110px)} text stylefont-size: 20px;margin-bottom: 10px;margin-top: 5px;访问日历权限申请说明/text text stylecolor: darkgray;uni-app x正在申请访问日历权限用于演示允许或拒绝均不会获取任何隐私信息。/text /view button typeprimary stylemargin: 10px; clickrequestPermission点击申请日历权限/button !-- #ifdef APP !VUE3-VAPOR -- /scroll-view !-- #endif -- /template需要说明的是示例页面中的弹框仅用于演示实际开发中监听权限申请的代码应放在app.uvue中弹框应全局处理可参考插件uni-prompt的 app-android 实现自行封装一个 uts 全局弹框。另外仓库示例在发起申请前还使用了UTSAndroid.checkSystemPermissionGranted做预检查若权限已授予则直接提示“权限已经同意了不需要再申请”避免重复弹窗if (UTSAndroid.checkSystemPermissionGranted(UTSAndroid.getUniActivity()!, [android.permission.READ_CALENDAR])) { uni.showToast({ title: 权限已经同意了不需要再申请, position: bottom }) return } UTSAndroid.requestSystemPermission(UTSAndroid.getUniActivity()!, [android.permission.READ_CALENDAR], ...)与 uni.requestSystemPermission 的配合使用本 API 监听的是通过uni.requestSystemPermission和UTSAndroid.requestSystemPermission申请的权限。相关配套 API uni.requestSystemPermission 的参数与回调如下| 名称 | 类型 | 必填 | 描述 | | :- | :- | :-: | :- | | options | RequestSystemPermissionOptions | 是 | 请求系统权限参数 |其中options支持permissions: Arraystring必填申请的系统权限列表如[android.permission.CAMERA]、[android.permission.ACCESS_FINE_LOCATION, android.permission.ACCESS_COARSE_LOCATION]success: (result) void成功回调结果包含grantedList: Arraystring已授权权限列表仅包含当前系统支持的权限deniedList: Arraystring已拒绝权限列表doNotAskAgainList: Arraystring不再询问权限列表fail: (result) void失败回调可通过errCode区分原因例如1560601表示“申请权限为空”1560604表示“不支持申请权限”complete: (result) void申请结束无论成败均会触发的回调。建议的权限字符串Android包括但不限于android.permission.CAMERA、android.permission.READ_CALENDAR、android.permission.ACCESS_FINE_LOCATION、android.permission.ACCESS_COARSE_LOCATION等完整列表可参考仓库文档 app-nativeresource-android 中的权限章节。全局合规监听的最佳实践app.uvue 落地针对华为应用市场“调用终端权限时同步告知申请目的”的审核要求推荐把监听放到app.uvue中全局注册并使用全局弹框组件展示说明script setup languts let permissionListener: RequestPermissionListener | null null onLaunch(() { permissionListener uni.createRequestPermissionListener() // 申请发起时可在此记录即将申请的权限 permissionListener.onRequest((permissions: Arraystring) { console.log(正在申请权限, permissions) }) // 确认框弹出时展示全局“权限用途说明” permissionListener.onConfirm((permissions: Arraystring) { // TODO 根据 permissions 内容匹配对应文案全局弹框提示 }) // 确认框关闭时收起全局弹框 permissionListener.onComplete((permissions: Arraystring) { // TODO 隐藏全局弹框 }) }) onUnload(() { permissionListener?.stop() permissionListener null }) /script全局弹框建议封装为独立的 uts 插件/组件类似仓库中uni-prompt插件的实现思路保证在任何页面发起权限申请时都能同步展示合规说明而无需在每个业务页面重复编写监听代码。Tips 与注意事项综合文档提示与源码实现使用时需注意以下几点已授权权限不触发 onConfirm如果权限已经申请并且允许之后onConfirm不会触发。因此已授权权限的二次申请不会重复弹窗展示层逻辑应兼容这种情况。onComplete 可能多次触发如果同时申请多个权限onComplete可能会触发多次例如系统对多个权限分别弹框确认UI 收尾逻辑需做幂等处理。永久拒绝后的特殊行为uni-app x 中如果请求一个已经被永久拒绝的权限可能会触发onConfirm此时提示文案应避免“已拒绝不再询问”的误判。监听范围有限权限监听仅支持通过调用uni.requestSystemPermission和UTSAndroid.requestSystemPermission申请的权限通过原生三方 SDK 内部直接发起的权限申请可能不会被监听到。及时清理页面卸载时务必调用stop()取消监听参见示例中的onUnload防止监听回调持有页面上下文造成泄漏。平台限制该 API 不支持 Web、iOS、HarmonyOS使用前建议用条件编译// #ifdef APP-ANDROID包裹相关代码并在非 Android 平台提供降级处理。onConfirm 时机精度从仓库示例代码中的注释“目前 onConfirm 监听实现的在时间上不够精确暂时需要延迟弹框”可以推断onConfirm与系统弹窗的实际展示存在微小时间差生产环境可通过setTimeout微调提示条展示时机。全局监听可参考现成插件全局监听权限申请可参考插件uni-registerRequestPermissionTips快速复用成熟方案。通用类型监听回调与多数 uni API 一样可统一处理GeneralCallbackResult| 名称 | 类型 | 必备 | 描述 | | :- | :- | :-: | :- | | errMsg | string | 是 | 错误信息 |参考阅读API 文档create-request-permission-listener.md配套申请 APIrequest-system-permission.md插件源码uni-createRequestPermissionListener 实现接口声明interface.uts可运行示例create-request-permission-listener.uvueAndroid 权限清单说明app-nativeresource-android提示该 API 不支持 Web请将 hello uni-app x 运行到 App 平台体验完整效果。赞分享示例工程前端移动开发跨平台【免费下载链接】uni-appA cross-platform framework using Vue.js项目地址https://gitcode.com/gh_mirrors/un/uni-app点击查看免费下载相关推荐uni-app x DOM API 实战UniResizeObserver 元素尺寸监听完全指南uni app x DOM API 实战UniResizeObserver 元素尺寸监听完全指南 UniResizeObserver 是 uni app x示例工程前端移动开发跨平台uni-app/uni-app x 组件相交监听实战uni-createIntersectionObserver UTS 插件源码解析与使用指南uni app/uni app x 组件相交监听实战uni createIntersectionObserver UTS 插件源码解析与使用指南 本篇技术指南示例工程前端移动开发跨平台uni-app权限管理终极指南动态权限申请与控制完整教程uni app权限管理终极指南动态权限申请与控制完整教程 uni app作为跨平台应用开发框架权限管理是其核心功能之一。在移动应用开发中合理的权限申请与控示例工程前端移动开发跨平台上一篇电话号码地理编码缓存libphonenumber离线查询性能优化下一篇Prepack性能测试报告基于真实项目的执行效率对比分析创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考