当前位置: 首页 > news >正文

鸿蒙应用开发实战【96】— HarmonyOS权限申请实战

鸿蒙应用开发实战【96】— HarmonyOS权限申请实战

本文是「号码助手全栈开发系列」第 96 篇,持续更新中…
开源社区:https://openharmonycrossplatform.csdn.net


前言

HarmonyOS 的权限系统分为 normal(正常)和 user_grant(用户授权)两级。号码助手需申请网络权限和数据同步相关权限。本篇基于项目实际配置详解权限声明、敏感权限动态申请和最佳实践。

本篇涵盖:module.json5 权限配置、normal 与 user_grant 权限区别、INTERNET / GET_NETWORK_INFO 声明、敏感权限动态弹窗、@ohos.abilityAccessCtrl权限校验、权限最佳实践清单。


一、权限分类

HarmonyOS 权限分为两个等级:

等级特点典型权限申请方式用户可见
normal安装时自动授予INTERNETGET_NETWORK_INFOmodule.json5声明即可❌ 无感知
user_grant运行时弹窗用户确认READ_CONTACTSLOCATIONCAMERAMICROPHONE声明 + 动态调用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.when"always"/"inuse"always=后台可用, inuse=仅前台

三、敏感权限动态申请

3.1 导入模块

import{abilityAccessCtrl,common}from'@kit.AbilityKit'import{hilog}from'@kit.PerformanceAnalysisKit'

3.2 请求权限

asyncfunctionrequestPermission(context:common.UIAbilityContext):Promise<void>{constpermissions:string[]=['ohos.permission.READ_CONTACTS','ohos.permission.LOCATION']try{constatManager=abilityAccessCtrl.createAtManager()constgrantResults=awaitatManager.requestPermissionsFromUser(context,permissions)for(leti=0;i<grantResults.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}from'@kit.AbilityKit'functioncheckPermission(permission:Permissions):boolean{constatManager=abilityAccessCtrl.createAtManager()consttokenId=atManager.getCallingTokenId()constresult=atManager.verifyAccessTokenSync(tokenId,permission)returnresult===abilityAccessCtrl.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(用户可见的原因) └── 配置 usedScene(abilities + 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.net
  • HarmonyOS 权限开发指南:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-overview
  • HarmonyOS 官方文档:https://developer.huawei.com/consumer/cn/doc/
  • HarmonyOS hilog文档:https://developer.huawei.com/consumer/cn/doc/harmonyos-references/hilog
  • HarmonyOS testing:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/unit-test
  • HarmonyOS 安全与权限:https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/permissions-overview
http://www.jsqmd.com/news/1205737/

相关文章:

  • WMPageController项目贡献指南:如何参与开源社区与提交PR
  • 为什么 DPDK VirtIO 只能跑到 40Gbps?—— 一次 KVM 虚拟交换机性能瓶颈定位全过程(上)
  • OpenClaw本地私有AI助手部署指南:从安全架构到多平台实践
  • AI工具调用强制实现:从提示工程到模型微调的四种技术路径
  • 沈阳搬家公司哪家好?第三方实测测评|沈阳搬家避坑与企业横向对比 - 资讯在线
  • chaosArsenal-OS开发者指南:如何扩展自定义故障注入模块
  • 豆瓣电影信息API零基础接入:从请求到返回全解析
  • 经营许可证丢了怎么登报挂失?经营许可证登报声明怎么写?标准范文参考! - 叮咚办真方便
  • 2026遂宁漏水检测维修优选:正规防水补漏团队 TOP5推荐-卫生间/厨房/屋顶/阳台/外墙/飘窗/等渗漏水免砸砖维修 - 筑宅安
  • C++自定义字符串类设计:从内存管理到QT框架集成实践
  • SolidWorks数控加工中心设计实战:从三维建模到运动仿真全流程解析
  • 2026年沈阳塑胶跑道厂家挑选攻略:森塞尔等企业实测整理 - 资讯在线
  • 如何配置Shipper实现安全的蓝绿部署:7步避免生产环境灾难
  • 如何用dabl实现自动化数据预处理?从混乱数据到建模就绪的完整指南
  • 终极Discord机器人开发框架:Sapphire框架49入门指南
  • 鸿蒙应用开发实战【97】— 应用发布AGC上架全流程
  • Dify工作流入门:可视化AI应用开发指南
  • Java使用Bouncy Castle实现自签名证书生成与TLS认证实战
  • Ubuntu系统USB设备管理与启动盘制作指南
  • 欧米茄青岛维保服务中心|官网权威公示最新服务渠道(2026年7月最新) - 欧米茄中国服务中心
  • 大语言模型在《我的世界》中的智能Agent实践
  • 实测8款AI写小说工具|选对写小说软件告别创作内耗【7月最新测评】
  • 阿里云秒悟Meoo:自然语言驱动的AI应用开发平台实战解析
  • 怀柔公司淘汰电脑回收机构怎么选?企业批量办公设备处置攻略 - 全域观察站
  • Windows下Python 3.7.9与Playwright 1.9.0环境搭建全攻略
  • ifm_nettle核心组件解析:gcrypt、verto与硬件加速模块协同工作机制
  • 鸿蒙应用开发实战【98】— 版本迭代数据库升级实战案例
  • 2026年沈阳防静电地板厂家挑选攻略 森塞尔及行业信息汇总 - 资讯在线
  • GPT-5.6 Sol硬件诊断实战:MacBook电源问题调试与安全防护
  • Hy-Embodied-VLM-1.0未来展望:具身智能的发展趋势与技术挑战