HarmonyOS7 权限申请全流程:从声明到动态授权

发布时间:2026/7/13 12:52:22
HarmonyOS7 权限申请全流程:从声明到动态授权 文章目录前言第一步在 module.json5 声明代码实现第二步判断当前是否已授权核心代码第三步动态申请弹窗完整示例完整流程串起来常见权限对照常见误区小白必踩完整可运行示例动态权限申请代码解析写在最后前言HarmonyOS 对用户隐私管得很严这其实是好事。但对你开发来说意味着要用摄像头、定位、通讯录光在代码里调 API 不够得走一套声明 动态申请的流程。我见过太多新手卡在为啥调相机没反应——答案几乎都是没申请权限。这篇文章把权限全流程讲透从配置文件到运行时弹窗一步不漏。第一步在 module.json5 声明任何权限先在配置里报备你要用。以定位为例代码实现requestPermissions: [ { name: ohos.permission.LOCATION, reason: $string:location_reason, usedScene: { abilities: [EntryAbility], when: inuse } } ]name权限常量必须拼对。reason给用户看的理由写在string.json里说清楚为什么需要。when: inuse仅使用时申请比always对用户更友好上架也更容易过。不声明就调用系统直接拒绝连弹窗都没有。声明是前提。第二步判断当前是否已授权运行时先查一下已授权就直接干没授权再弹窗。用abilityAccessCtrl核心代码import{abilityAccessCtrl}fromkit.AbilityKitasyncfunctioncheckPermission(perm:string):Promiseboolean{constcontextgetContext()constatManagerabilityAccessCtrl.createAtManager()conststatusawaitatManager.checkAccessToken(context.applicationInfo.accessTokenId,perm)returnstatusabilityAccessCtrl.GrantStatus.PERMISSION_GRANTED}checkAccessToken返回已授权或未授权。先查再申请避免每次都弹窗烦用户。第三步动态申请弹窗没授权就调requestPermissionsFromUser弹系统授权框完整示例asyncfunctionrequestPermission(perm:string):Promiseboolean{constatManagerabilityAccessCtrl.createAtManager()constresultawaitatManager.requestPermissionsFromUser(getContext(),[perm]// 可以一次申请多个)// result.authResults[0] 0 表示用户同意returnresult.authResults[0]0}传入权限数组可批量申请。authResults[0] 0代表用户点了允许。非 0 就是拒绝了。完整流程串起来asyncfunctiondoWithLocation(){constpermohos.permission.LOCATIONif(awaitcheckPermission(perm)){startLocate()// 已授权直接干活return}if(awaitrequestPermission(perm)){startLocate()// 刚授权干活}else{promptAction.showToast({message:定位权限被拒绝功能不可用})}}先查、后申请、再判断结果——这就是标准的声明→检查→申请→使用四步。少一步都会出问题。常见权限对照权限常量典型用途定位ohos.permission.LOCATION地图、附近的人相机ohos.permission.CAMERA拍照、扫码麦克风ohos.permission.MICROPHONE录音、语音相册读取ohos.permission.READ_MEDIA选图网络ohos.permission.INTERNET所有联网常见误区小白必踩误区说明不声明就调用 API没在配置里报备权限系统直接拒绝连弹窗都没有。声明是前提。一上来就弹窗应该先checkAccessToken再看是否申请别每次都弹烦用户。拒绝不提示用户拒了权限要友好说明功能不可用而不是默默失灵让用户猜。下面这段代码可以直接复制到 DevEco Studio 里运行。建议你边读边敲改一改文末「动手改一改」里的参数亲眼看看效果。完整可运行示例动态权限申请声明 运行时弹窗授权拿「相机」权限做例子。代码解析// 运行时动态申请权限import{abilityAccessCtrl}fromkit.AbilityKitEntryComponentstruct PermDemo{Stategranted:booleanfalsebuild(){Column({space:16}){Text(this.granted?已授权:未授权).fontSize(20)Button(申请相机权限).onClick(async(){constatManagerabilityAccessCtrl.createAtManager()constresultawaitatManager.requestPermissionsFromUser(getContext(),[ohos.permission.CAMERA])this.grantedresult.authResults[0]0// 0允许})}.padding(20)}}你会看到什么点按钮弹出系统授权框点「允许」后文字变「已授权」点「拒绝」则保持未授权。记住权限必须先在module.json5的requestPermissions声明否则这里直接失败。动手改一改把[ohos.permission.CAMERA]改成多个权限数组一次申请多个。在module.json5删掉 CAMERA 声明再跑观察报错理解「声明是前提」。用verifyAccessToken先做「已授权就不弹窗」的短路判断优化体验。写在最后权限流程记住四步配文件声明 → 运行时检查 → 弹窗申请 → 按结果处理。永远先check再request别一上来就弹窗拒绝后要给用户友好提示而不是默默失灵。把这套封装成一个PermissionUtil.doWith(perm, action)工具全项目复用——你以后写任何需要权限的功能一行调用就完事。