📚 鸿蒙进阶专栏 · 第 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 定位问题。


进阶系列持续更新中,点赞 + 收藏 + 关注不迷路。
遇到问题评论区贴报错信息 + 关键代码,看到都会回。也欢迎留言点播你想看的进阶主题。

Logo

作为“人工智能6S店”的官方数字引擎,为AI开发者与企业提供一个覆盖软硬件全栈、一站式门户。

更多推荐