"requestPermissions": [
{
"name": "ohos.permission.READ_MEDIA",
"reason": "$string:permission_media_reason",
"usedScene": {
"abilities": ["EntryAbility"],
"when": "inuse"
}
}
]
在 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、权限属于受限权限、或调用发生在授权完成之前。