HarmonyOS鸿蒙Next中基于弹窗授权的方式获取媒体库的目标uri报错401,文档说接口不需要权限?

HarmonyOS鸿蒙Next中基于弹窗授权的方式获取媒体库的目标uri报错401,文档说接口不需要权限?

// let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(this.getUIContext().getHostContext() as common.UIAbilityContext);
// 确保通过getContext获取正确的上下文
const context = getContext(this);
let phAccessHelper = photoAccessHelper.getPhotoAccessHelper(context);

try {
  // 指定待保存到媒体库的位于应用沙箱的图片uri。
  const path = await getFileUrlCache(this.url,this.uuid);
  let srcFileUri = fileUri.getUriFromPath(path);
  let srcFileUris: Array<string> = [
    srcFileUri
  ];
  // 指定待保存照片的创建选项,包括文件后缀和照片类型,标题和照片子类型可选。
  let photoCreationConfigs: Array<photoAccessHelper.PhotoCreationConfig> = [
    {
      fileNameExtension: 'jpg',
      photoType: photoAccessHelper.PhotoType.IMAGE,
      subtype: photoAccessHelper.PhotoSubtype.DEFAULT, // 可选。
    }
  ];
  // 基于弹窗授权的方式获取媒体库的目标uri。
  let desFileUris: Array<string> = await phAccessHelper.showAssetsCreationDialog(srcFileUris, photoCreationConfigs);
  // 将来源于应用沙箱的照片内容写入媒体库的目标uri。
  let desFile: fileIo.File = await fileIo.open(desFileUris[0], fileIo.OpenMode.WRITE_ONLY);
  let srcFile: fileIo.File = await fileIo.open(srcFileUri, fileIo.OpenMode.READ_ONLY);
  await fileIo.copyFile(srcFile.fd, desFile.fd);
  fileIo.closeSync(srcFile);
  fileIo.closeSync(desFile);
  console.info('create asset by dialog successfully');
} catch (err) {
  console.error(`failed to create asset by dialog successfully errCode is: ${err.code}, ${err.message}`);
}

更多关于HarmonyOS鸿蒙Next中基于弹窗授权的方式获取媒体库的目标uri报错401,文档说接口不需要权限?的实战教程也可以访问 https://www.itying.com/category-93-b0.html

4 回复

更多关于HarmonyOS鸿蒙Next中基于弹窗授权的方式获取媒体库的目标uri报错401,文档说接口不需要权限?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


你这是打算把谁复制给谁?目标搞反了吧!

在HarmonyOS鸿蒙Next中,获取媒体库目标uri报错401可能涉及以下原因:

  1. 虽然文档说明接口不需要权限,但实际调用可能仍需声明ohos.permission.READ_MEDIA权限
  2. 弹窗授权流程未正确触发或用户拒绝了授权请求
  3. 应用配置中缺少必要的abilitiespermissions声明
  4. API版本不兼容,Next版本可能有权限校验变更

检查要点:

  • 确认manifest.json已声明所需权限
  • 验证弹窗授权回调是否正常处理
  • 检查使用的API是否与设备鸿蒙版本匹配

从代码和报错来看,401错误通常表示权限问题。虽然文档提到showAssetsCreationDialog接口不需要权限,但实际上可能仍需要检查以下方面:

  1. 确保在module.json5中声明了必要的权限:
"requestPermissions": [
  {
    "name": "ohos.permission.READ_MEDIA",
    "reason": "需要读取媒体文件"
  },
  {
    "name": "ohos.permission.WRITE_MEDIA",
    "reason": "需要写入媒体文件"
  }
]
  1. 检查上下文获取是否正确,建议使用UIAbilityContext
const context = getContext(this) as common.UIAbilityContext;
  1. 确保目标路径可访问,特别是当使用fileUri.getUriFromPath()时,确认path是有效的沙箱路径。

  2. 虽然showAssetsCreationDialog会触发系统弹窗授权,但某些情况下仍需要预先获取基本权限。

建议先添加权限声明并检查上下文获取方式,这通常能解决401错误。

回到顶部