【鸿蒙开发进阶】第18篇:权限管理:相机、定位、通知的正确申请
·
📚 鸿蒙进阶专栏 · 第 18 篇 / 共 20 篇(进阶篇 11-20)
上一篇:动效入门 | 下一篇:性能与调试:Profiler、HiLog 与卡顿排查
目录
权限管理:相机、定位、通知的正确申请
权限处理不好,轻则功能报错,重则上架被拒。这篇讲鸿蒙权限模型、申请流程与被拒后的兜底。

一、权限分两类
| 类型 | 例子 | 申请方式 |
|---|---|---|
| system_grant(授权类) | 网络 INTERNET、振动 | module.json5 声明即生效 |
| user_grant(用户类) | 相机、麦克风、定位、相册 | 声明 + 运行时动态申请 |
二、完整示例:申请相机
// 第 1 步:module.json5 声明
{
"module": {
"requestPermissions": [
{
"name": "ohos.permission.CAMERA",
"reason": "$string:camera_reason", // 必填!上架审核会查
"usedScene": { "abilities": ["EntryAbility"], "when": "inuse" }
}
]
}
}
// 第 2 步:运行时申请
import { abilityAccessCtrl, Permissions } from '@kit.AbilityKit'
import { common } from '@kit.AbilityKit'
async function requestCamera(context: common.UIAbilityContext): Promise<boolean> {
const atManager = abilityAccessCtrl.createAtManager()
const result = await atManager.requestPermissionsFromUser(
context, ['ohos.permission.CAMERA' as Permissions])
return result.authResults[0] === 0 // 0 = 同意
}
⚠️ reason 必填且要说人话:「用于拍摄照片」可以,「需要权限」会被拒审。usedScene 的 when 也必填。
三、被拒之后的兜底
用户点了「拒绝且不再询问」,系统不会再弹窗。正确姿势是检测后引导去设置页:
import { abilityAccessCtrl } from '@kit.AbilityKit'
import { bundleManager } from '@kit.AbilityKit'
async function openSetting(context: common.UIAbilityContext): Promise<void> {
const bundleId = (await bundleManager.getBundleInfoForSelf(
bundleManager.BundleFlag.GET_BUNDLE_INFO_DEFAULT)).name
const atManager = abilityAccessCtrl.createAtManager()
await atManager.requestPermissionSetting() // 跳转应用设置页
}
📌 UI 交互建议:申请前先用一个自定义弹窗解释「为什么要这个权限」,再弹系统授权框,通过率明显更高。
四、上架合规三查
1. 最小必要:只用到的权限才声明,审核会比对
2. 理由真实:reason 与实际用途一致
3. 隐私弹窗:首次启动须有隐私政策同意框(AGC 审核硬性要求)
五、下一篇预告
功能全有了,App 却偶尔卡?下一篇:性能调试,学会用 Profiler 和 HiLog 定位问题。
进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。
更多推荐



所有评论(0)