当前位置: 首页 > 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.cnnetsun.cn/news/3449567.html

相关文章:

  • 基于pywinauto的微信桌面端自动化工具开发实战
  • chaosArsenal-OS开发者指南:如何扩展自定义故障注入模块
  • Ubuntu系统USB设备管理与启动盘制作指南
  • 解决Windows磁盘8MB空间无法删除的终极方案
  • Windows 10系统激活方法与常见错误解决方案
  • 基于51单片机的0~5V电压表设计:ADC0832应用与Proteus仿真
  • 大喷菇战术解析:零成本植物在《植物大战僵尸》中的实战价值
  • iKuai系统IPv6配置指南:实现内网设备公网直连与远程访问
  • Medusa仪表盘库完全解析:从基础概念到高级应用
  • legalize-es社区指南:参与讨论、报告问题和获取支持
  • JetBrains Air IDE:面向任务的AI编程操作系统
  • Bake与Emscripten集成:如何构建WebAssembly项目
  • Windows 11 WSL2 + Fedora Remix打造高效开发环境
  • 国产大模型驱动的本地Claude Code编程工作流搭建指南
  • Edge模板引擎:现代Node.js模板渲染的终极解决方案
  • 彻底解决Set-Cookie过期时间无效:从HTTP协议到时区陷阱的完整指南
  • Intel VMD技术导致Windows安装失败的解决方案
  • JetBrains Air:从IDE到AI工作空间的范式革命
  • CANN/asc-devkit ReduceSum临时空间大小接口
  • Chanlun-pro部署指南:从本地安装到云端部署的完整方案
  • Claude Code与DeepSeek集成:终端AI编程助手部署与应用指南
  • Claude提示词优化:提升AI代码生成效率300%
  • Windows系统盘空间清理与优化全攻略
  • FastGPT | 29 - Agent Sandbox 与远程开发环境
  • CANN/Ascend C SinCos临时空间大小接口
  • CANN/asc-devkit Sign临时空间接口
  • CANN/asc-devkit:Trunc接口临时缓冲区因子大小获取
  • cann/asc-devkit:SoftmaxGrad Tiling接口
  • CANN/asc-devkit SwiGLU激活函数API
  • CANN/asc-devkit设置AIV核ID接口