鸿蒙开发中,如何获取$rawfile文件在本机中的uri地址 ?

鸿蒙开发中,如何获取$rawfile文件在本机中的uri地址 ?

阅读 1.6k
avatarAI BotBETA

在鸿蒙(HarmonyOS)开发中,如果你想要获取$rawfile资源文件(即存放在resources/rawfile目录下的文件)的URI地址,需要注意的是,鸿蒙系统的资源管理机制与Android有所不同,直接获取rawfile文件的URI地址可能不是直接支持的,因为鸿蒙系统更多是通过资源ID来访问这些文件。

然而,如果你需要在鸿蒙应用中处理这些文件(如读取、显示等),你可以通过资源ID来访问它们,而不需要显式地获取它们的URI。但如果你确实需要类似URI的引用,或需要将这些文件以某种方式暴露给系统或其他应用,你可能需要将这些文件复制到应用的私有存储空间或其他可访问的公共目录,并获取那里的文件URI。

以下是一个基本的步骤,说明如何在鸿蒙应用中处理rawfile资源,虽然它并不直接提供URI,但展示了如何访问这些资源:

  1. 获取资源ID:首先,确保你的rawfile资源已经在resources/rawfile目录下,并且在resources.build或类似文件中被正确声明。你可以通过ResourceTable类访问这些资源的ID。
  2. 读取资源:使用ResourceManager类或其他适当的API来读取这些资源。对于rawfile,这通常意味着你需要将它们作为字节流或其他形式读取到内存中。
  3. 处理资源:一旦资源被读取,你可以按照你的应用需求来处理它们。

如果你确实需要将rawfile资源以URI的形式提供给其他组件或应用,你可以考虑以下步骤:

  • 复制到可访问目录:将rawfile资源复制到应用的私有存储目录(如getCacheDir()getExternalFilesDir()返回的路径)或公共存储目录(如getExternalStoragePublicDirectory(),但请注意公共存储目录的访问限制和权限要求)。
  • 获取URI:使用MediaStore API(对于媒体文件)或FileProvider(对于非媒体文件,且需要跨应用共享时)来获取新复制文件的URI。

请注意,鸿蒙系统的具体API和最佳实践可能会随着版本的更新而变化,因此建议查阅最新的鸿蒙开发文档和指南以获取最准确的信息。

2 个回答

可以参考如下代码:

// 替代方案:代码操作要使用的文件 rawfile 送进沙箱路径。 然后再执行相关操作
async function resourceFile(resourcePath: string) {
  //1.读取文件
  let uint8Array: Uint8Array = getContext()
   .createModuleContext("library")
   .resourceManager
   .getRawFileContentSync(resourcePath);
  let fileName = resourcePath.substring(resourcePath.lastIndexOf('/') + 1);
  console.log("${tag} fileName:S{fileName}");
  //2.创建沙箱文件
  let filePath = getContext().createModuleContext("library").filesDir + '/' + fileName;
  if (fs.accessSync(filePath)) {
    fs.unlinkSync(filePath)
  }
  let file: fs.File = fs.openSync(filePath, fs.OpenMode.READ_WRITE | fs.OpenMode.CREATE);
  // 3.resource 下文件写入沙箱文件
  fs.writeSync(file.fd, uint8Array.buffer);
  // 4.关闭文件
  fs.closeSync(file);
  console.log("${tag} filePath:${filePath}");
  return filePath;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题