HarmonyOS鸿蒙Next中申请ohos.permission.READ IMAGEVIDEO和 ohos.permission.WRITEIMAGEVIDEO
HarmonyOS鸿蒙Next中申请ohos.permission.READ IMAGEVIDEO和 ohos.permission.WRITEIMAGEVIDEO 【问题描述】:我们有个一功能,是让用户关注我们微信公众号(用户需要保存图片),便于用户接受订单消息;需要一个读取权限,但是因不符合场景需求申请权限不被通过,它已经给了替代方案,我想问除了这种还有其他的方案吗?(申请的是ohos.permission.READ IMAGEVIDEO和ohos.permission.WRITEIMAGEVIDEO)
【问题现象】:

【版本信息】:不涉及
【复现代码】:不涉及
【尝试解决方案】:不涉及
更多关于HarmonyOS鸿蒙Next中申请ohos.permission.READ IMAGEVIDEO和 ohos.permission.WRITEIMAGEVIDEO的实战教程也可以访问 https://www.itying.com/category-93-b0.html
更多关于HarmonyOS鸿蒙Next中申请ohos.permission.READ IMAGEVIDEO和 ohos.permission.WRITEIMAGEVIDEO的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
不需要申请权限,使用showAssetsCreationDialog,拉起保存确认弹窗,用户同意保存后,返回已创建并授予保存权限的uri列表,应用可使用该uri写入图片/视频。弹框需要显示应用名称,因此调用此接口时请确保module.json5文件中的abilities标签中配置了label和icon项。
phAccessHelper的创建请参考photoAccessHelper.getPhotoAccessHelper的示例使用。
import { dataSharePredicates } from '@kit.ArkData';
async function example(phAccessHelper: photoAccessHelper.PhotoAccessHelper) {
console.info('ShowAssetsCreationDialogDemo.');
try {
// 获取需要保存到媒体库的位于应用沙箱的图片/视频uri。
let srcFileUris: Array<string> = [
'file://fileUriDemo1' // 实际场景请使用真实的uri。
];
let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
{
title: 'test2', // 可选。
fileNameExtension: 'jpg',
photoType: photoAccessHelper.PhotoType.IMAGE,
subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选。
}
];
let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
console.info('showAssetsCreationDialog success, data is ' + desFileUris);
} catch (err) {
console.error('showAssetsCreationDialog failed, errCode is ' + err.code + ', errMsg is ' + err.message);
}
}
在HarmonyOS Next中,申请ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO权限,需要在应用的module.json5配置文件中声明。具体步骤如下:
- 在
module.json5文件的module字段内,添加requestPermissions数组。 - 在该数组中,为每个权限声明一个对象,包含
name(权限名称)和reason(使用原因)等字段。 - 对于敏感权限,还需要在应用首次使用时,通过
abilityAccessCtrl模块的API动态向用户请求授权。
示例配置片段:
"requestPermissions": [
{
"name": "ohos.permission.READ_IMAGEVIDEO",
"reason": "需要读取媒体文件"
},
{
"name": "ohos.permission.WRITE_IMAGEVIDEO",
"reason": "需要保存图片或视频"
}
]
在HarmonyOS Next中,ohos.permission.READ_IMAGEVIDEO和ohos.permission.WRITE_IMAGEVIDEO属于敏感权限,其申请和使用受到严格管控。审核不通过的核心原因是您的应用场景(引导用户保存图片以关注公众号)被系统判定为不符合该权限的“最小必要”使用原则。
系统推荐的替代方案是使用媒体库管理(@ohos.file.photoAccessHelper)或文件选择器(@ohos.file.picker)。这是目前官方主推且最合规的方案。通过photoAccessHelper,应用可以在用户授权后,以安全、可控的方式访问用户主动选择的特定媒体文件,而不是获取整个媒体库的读写权限。
除了系统建议的方案,您还可以考虑以下技术路径:
-
使用
Web组件或内嵌网页:如果您的“关注公众号”流程主要通过网页完成,可以考虑在应用内通过Web组件加载包含二维码的官方网页。用户可以直接在页面内长按识别或操作,避免应用直接处理图片文件。这完全规避了本地文件权限问题。 -
优化功能逻辑,使用户
主动触发图片保存:- 将二维码图片内置在应用资源中,而不是从用户相册读取。
- 提供明确的“保存到相册”按钮。当用户点击时,通过
媒体库管理(photoAccessHelper)的createAsset接口,将应用内置的图片文件写入到用户相册的指定位置。这个“写入”动作是用户明确发起的、针对单一文件的操作,符合权限最小化原则。关键代码示例如下:
import photoAccessHelper from '@ohos.file.photoAccessHelper'; import fs from '@ohos.file.fs'; // 1. 获取媒体库管理实例 let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context); // 2. 创建图片创建选项(指定文件名、类型等) let createOption = { title: '公众号二维码.jpg' // 用户相册中显示的文件名 }; // 3. 将应用内的资源文件(如rawfile下的二维码)写入到相册 // 假设二维码图片位于应用的 rawfile 目录下 let sourceFile = fs.openSync('$rawfile(qrcode.jpg)', fs.OpenMode.READ_ONLY); phAccessHelper.createAsset(photoAccessHelper.PhotoType.IMAGE, 'jpg', createOption).then((assetUri) => { let destFile = fs.openSync(assetUri, fs.OpenMode.WRITE_ONLY); // 执行文件复制操作... console.info('File saved to gallery successfully.'); }).catch((err) => { console.error('Failed to save file to gallery. Error: ' + err); });这个方案的核心是应用只写入自己生成的图片,而不读取用户已有的图片,从而无需申请
READ_IMAGEVIDEO权限,仅需在module.json5中声明WRITE_IMAGEVIDEO权限,并且其使用场景(用户主动保存应用生成的图片)更容易通过审核。
总结与建议:
请优先采用系统推荐的媒体库管理方案或上述第2点**“应用内置图片+用户主动保存”** 的方案。这两种方式都严格遵循了HarmonyOS Next的隐私保护规范,能够清晰地向用户和审核方说明权限使用的必要性和最小化范围,是解决此类需求的正规路径。重新提交权限申请时,务必在申请理由中详细、准确地描述这个技术实现逻辑。

