讨论广场 问答详情
已在配置文件添加权限,运行时依旧报错,请问动态授权代码该如何补充?
圈圈圆圆圈圈_ 2026-05-27 19:02:58
138 评论 分享
你问我答
"requestPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "$string:permission_media_reason",
    "usedScene": {
      "abilities": ["EntryAbility"],
      "when": "inuse"
    }
  }
]

 

138 评论 分享
写回答
全部评论(1)

在 HarmonyOS 中,`module.json5` 里配置 `requestPermissions` 只是声明应用需要该权限;如果权限属于用户授权类型,还必须在运行时调用授权接口,并处理授权结果。只声明不申请,运行时调用相关能力仍然会报权限错误。

可以按下面思路补充:

```ts
import { abilityAccessCtrl, common, Permissions } from '@kit.AbilityKit';

async function requestMediaPermission(context: common.UIAbilityContext): Promise<boolean> {
  const atManager = abilityAccessCtrl.createAtManager();
  const permissions: Permissions[] = ['ohos.permission.READ_MEDIA'];

  try {
    const result = await atManager.requestPermissionsFromUser(context, permissions);
    const granted = result.authResults.every((item: number) => item === 0);
    return granted;
  } catch (err) {
    console.error(`request permission failed: ${JSON.stringify(err)}`);
    return false;
  }
}
```

使用时注意几点:

1. `context` 要用当前 `UIAbilityContext`,页面里可通过 `getUIContext().getHostContext()` 获取后转型。
2. `module.json5` 中权限的 `reason` 要引用可用的字符串资源,`usedScene.abilities` 要包含当前 Ability。
3. 只有用户授权类权限才适合弹窗申请;系统授权、受限开放权限要按对应规则申请,不能只靠运行时弹窗解决。
4. 调用业务 API 前先确认授权结果。用户拒绝时要给出提示或降级,不要继续调用需要权限的接口。
5. 不同 API 版本下媒体权限可能有差异,建议结合目标 SDK 文档确认当前应申请的媒体权限名称。

如果依旧报错,再检查是否是权限名写错、当前 Ability 不在 usedScene、权限属于受限权限、或调用发生在授权完成之前。

2026-06-05 11:07:56