HarmonyOS鸿蒙Next中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor

HarmonyOS鸿蒙Next中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor 众所周知,在鸿蒙中的资源分为media和rawfile。两者的区别对标android工程一致,后者是其他类型文件,原始文件形式保存,不会被集成到resources.index文件中。文件名可自定义。

在entry中通过$ rawfile可以访问到rawfile文件下存放的音频资源。例如xxx.mp3,此时如果不同module模块的resource下资源,是不能通过直接$rawfile访问。

需要通过模块名字,使用上下文获取到子模块的上下文:

getContext.createModuleContext(moduleName).resourceManager.getRawFd("xxx.mp3")。

之后会访问得到的是RawFileDescriptor类型对象。
那如何转化为string 或者Resource ?


更多关于HarmonyOS鸿蒙Next中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

一、结论

在鸿蒙中资源的形式一般为 fd,string,Uint8Array,RawFileDescriptor。大家的惯性思维首先想到的是,从其中一个类型转化成目标类型。其实鸿蒙已经提供了一个强大的资源管理器,就是问题背景中调用函数的resourceManager。当我们通过这个管理器是可以获取任意上述目标类型的。只要知道其资源id即可。

二、代码实现和详细解释

let fileDescriptor =  getContext(this).createModuleContext("模块名").resourceManager.getRawFdSync("test.mp3");
    
let fd = fileDescriptor.fd;

let Uint8Array =  getContext(this).createModuleContext("模块名").resourceManager.getRawFileContentSync("test.mp3");

let stringValue =  getContext(this).createModuleContext("模块名").resourceManager.getStringByNameSync("test.mp3");

更多关于HarmonyOS鸿蒙Next中如何获取资源文件的指定类型 fd,string,Uint8Array,RawFileDescriptor的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS Next中,获取资源文件的不同类型数据使用ResourceManager。获取fd使用getRawFd方法;获取string使用getStringValue;获取Uint8Array使用getMediaContent;获取RawFileDescriptor使用getRawFileDescriptor。具体调用需传入资源ID和对应参数。

在HarmonyOS Next中,获取资源文件的指定类型(fd、string、Uint8Array、RawFileDescriptor)主要通过ResourceManager API实现。以下是具体方法:

1. 获取RawFileDescriptor(文件描述符)

使用getRawFd()方法,适用于需要直接操作文件描述符的场景(如音频播放)。

let rawFd = this.context.resourceManager.getRawFd('xxx.mp3');
// 或跨模块获取
let moduleContext = this.context.createModuleContext('moduleName');
let moduleRawFd = moduleContext.resourceManager.getRawFd('xxx.mp3');

2. 获取string(字符串)

对于文本文件(如.txt、.json),使用getRawFileContent()并指定编码:

let textContent = await this.context.resourceManager.getRawFileContent('data.json', { encoding: 'utf-8' });
// textContent为string类型

3. 获取Uint8Array(二进制数据)

对于二进制文件(如图片、音频),使用getRawFileContent()不指定编码:

let buffer = await this.context.resourceManager.getRawFileContent('image.png');
// buffer为Uint8Array类型

4. 直接使用RawFileDescriptor对象

getRawFd()返回的RawFileDescriptor包含:

  • fd: 文件描述符(number)
  • offset: 文件起始偏移量(number)
  • length: 文件长度(number)

可直接用于系统API,如媒体播放:

let rawFileDescriptor = this.context.resourceManager.getRawFd('audio.mp3');
// 使用fd、offset、length进行底层操作

关键点说明:

  • 跨模块资源访问:必须通过createModuleContext()获取目标模块上下文后再调用资源管理方法。
  • 资源路径:无需包含rawfile/前缀,直接使用文件名(含扩展名)。
  • 异步处理getRawFileContent()为异步方法,需使用await或Promise。
  • 媒体资源media/目录下的资源推荐使用getMediaContent()等方法,rawfile/目录下的资源使用上述方法。

根据你的需求选择对应方法即可直接获得目标数据类型,无需额外转换。

回到顶部