
鸿蒙应用开发实战【96】— HarmonyOS权限申请实战本文是「号码助手全栈开发系列」第 96 篇持续更新中…开源社区https://openharmonycrossplatform.csdn.net前言HarmonyOS 的权限系统分为 normal正常和 user_grant用户授权两级。号码助手需申请网络权限和数据同步相关权限。本篇基于项目实际配置详解权限声明、敏感权限动态申请和最佳实践。本篇涵盖module.json5 权限配置、normal 与 user_grant 权限区别、INTERNET / GET_NETWORK_INFO 声明、敏感权限动态弹窗、ohos.abilityAccessCtrl权限校验、权限最佳实践清单。一、权限分类HarmonyOS 权限分为两个等级等级特点典型权限申请方式用户可见normal安装时自动授予INTERNET、GET_NETWORK_INFOmodule.json5声明即可❌ 无感知user_grant运行时弹窗用户确认READ_CONTACTS、LOCATION、CAMERA、MICROPHONE声明 动态调用requestPermissionsFromUser✅ 弹窗提示二、号码助手权限配置文件entry/src/main/module.json5{ module: { name: entry, type: entry, requestPermissions: [ { name: ohos.permission.INTERNET, reason: $string:internet_permission_reason, usedScene: { abilities: [EntryAbility], when: always } }, { name: ohos.permission.GET_NETWORK_INFO, reason: $string:network_info_permission_reason, usedScene: { abilities: [EntryAbility], when: always } } ] } }字段说明字段值含义nameohos.permission.XXX权限名称系统定义reason$string:xxx申请原因显示在系统设置中usedScene.abilities[EntryAbility]在哪个 Ability 使用该权限usedScene.whenalways/inusealways后台可用, inuse仅前台三、敏感权限动态申请3.1 导入模块import{abilityAccessCtrl,common}fromkit.AbilityKitimport{hilog}fromkit.PerformanceAnalysisKit3.2 请求权限asyncfunctionrequestPermission(context:common.UIAbilityContext):Promisevoid{constpermissions:string[][ohos.permission.READ_CONTACTS,ohos.permission.LOCATION]try{constatManagerabilityAccessCtrl.createAtManager()constgrantResultsawaitatManager.requestPermissionsFromUser(context,permissions)for(leti0;igrantResults.length;i){if(grantResults[i]0){hilog.info(0x0000,Permission,%{public}s 已授权,permissions[i])}else{hilog.warn(0x0000,Permission,%{public}s 被拒绝,permissions[i])}}}catch(e){hilog.error(0x0000,Permission,请求权限失败: %{public}s,JSON.stringify(e))}}3.3 校验权限是否已授予import{abilityAccessCtrl,Permissions}fromkit.AbilityKitfunctioncheckPermission(permission:Permissions):boolean{constatManagerabilityAccessCtrl.createAtManager()consttokenIdatManager.getCallingTokenId()constresultatManager.verifyAccessTokenSync(tokenId,permission)returnresultabilityAccessCtrl.GrantStatus.PERMISSION_GRANTED}// 使用if(checkPermission(ohos.permission.READ_CONTACTS)){// 已有权限直接操作}else{// 去申请权限}四、usedScene 配置说明when 值含义适用场景always前后台均可使用网络请求、数据同步inuse仅前台使用相机、定位、麦克风abilities数组指定在哪个 Ability 中使用usedScene: { abilities: [EntryAbility], when: always }五、权限声明流程总结1. 确定需要的权限 ├── 查阅 HarmonyOS 权限列表文档 ├── 区分 normal 还是 user_grant └── 确认是否必须能不申请就不申请 2. 配置 module.json5 ├── requestPermissions 数组中声明 ├── 填写 reason用户可见的原因 └── 配置 usedSceneabilities when 3. 动态请求仅 user_grant ├── 调用 abilityAccessCtrl.requestPermissionsFromUser ├── 处理 grantResults 数组 └── 在设置中或首次启动时请求 4. 使用权限前校验 ├── verifyAccessTokenSync 检查状态 └── 被拒绝时友好提示非直接 crash六、常见权限问题排查问题原因解决网络请求失败未声明INTERNET权限检查 module.json5 requestPermissions定位失败未申请或用户拒绝动态弹窗 状态校验回调无反应调用了敏感权限 API 但未申请在真机上测试模拟器可能默认拒绝审核被拒reason 不清晰使用$string引用多语言描述小结内容要点normal 权限module.json5 声明即可INSTALL 时自动授予user_grant 权限声明 运行时requestPermissionsFromUser()权限校验abilityAccessCtrl.verifyAccessTokenSync()最佳实践最小权限原则、reason 清晰、拒绝后友好提示号码助手使用 INTERNET GET_NETWORK_INFO均为 normal如果这篇文章对你有帮助欢迎点赞、收藏⭐、关注你的支持是我持续创作的动力相关资源开源鸿蒙跨平台社区https://openharmonycrossplatform.csdn.netHarmonyOS 权限开发指南https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-overviewHarmonyOS 官方文档https://developer.huawei.com/consumer/cn/doc/HarmonyOS hilog文档https://developer.huawei.com/consumer/cn/doc/harmonyos-references/hilogHarmonyOS testinghttps://developer.huawei.com/consumer/cn/doc/harmonyos-guides/unit-testHarmonyOS 安全与权限https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-overview