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)

【问题现象】: cke_13065.png

【版本信息】:不涉及

【复现代码】:不涉及

【尝试解决方案】:不涉及


更多关于HarmonyOS鸿蒙Next中申请ohos.permission.READ IMAGEVIDEO和 ohos.permission.WRITEIMAGEVIDEO的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

小伙伴你好,给出的方案已经是最佳建议了。现在保存权限都是使用的保存控件,读取权限都是使用 Picker控件 去获取到媒体资源。

更多关于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_IMAGEVIDEOohos.permission.WRITE_IMAGEVIDEO权限,需要在应用的module.json5配置文件中声明。具体步骤如下:

  1. module.json5文件的module字段内,添加requestPermissions数组。
  2. 在该数组中,为每个权限声明一个对象,包含name(权限名称)和reason(使用原因)等字段。
  3. 对于敏感权限,还需要在应用首次使用时,通过abilityAccessCtrl模块的API动态向用户请求授权。

示例配置片段:

"requestPermissions": [
  {
    "name": "ohos.permission.READ_IMAGEVIDEO",
    "reason": "需要读取媒体文件"
  },
  {
    "name": "ohos.permission.WRITE_IMAGEVIDEO",
    "reason": "需要保存图片或视频"
  }
]

在HarmonyOS Next中,ohos.permission.READ_IMAGEVIDEOohos.permission.WRITE_IMAGEVIDEO属于敏感权限,其申请和使用受到严格管控。审核不通过的核心原因是您的应用场景(引导用户保存图片以关注公众号)被系统判定为不符合该权限的“最小必要”使用原则。

系统推荐的替代方案是使用媒体库管理@ohos.file.photoAccessHelper)或文件选择器@ohos.file.picker)。这是目前官方主推且最合规的方案。通过photoAccessHelper,应用可以在用户授权后,以安全、可控的方式访问用户主动选择的特定媒体文件,而不是获取整个媒体库的读写权限。

除了系统建议的方案,您还可以考虑以下技术路径:

  1. 使用Web组件内嵌网页:如果您的“关注公众号”流程主要通过网页完成,可以考虑在应用内通过Web组件加载包含二维码的官方网页。用户可以直接在页面内长按识别或操作,避免应用直接处理图片文件。这完全规避了本地文件权限问题。

  2. 优化功能逻辑,使用户主动触发图片保存

    • 将二维码图片内置在应用资源中,而不是从用户相册读取。
    • 提供明确的“保存到相册”按钮。当用户点击时,通过媒体库管理(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的隐私保护规范,能够清晰地向用户和审核方说明权限使用的必要性和最小化范围,是解决此类需求的正规路径。重新提交权限申请时,务必在申请理由中详细、准确地描述这个技术实现逻辑。

回到顶部