HarmonyOS鸿蒙Next中HAR包内组件调用getContext().resourceManager获取资源的问题分析

发布于 1周前 作者 yuanlaile 来自 鸿蒙OS

HarmonyOS鸿蒙Next中HAR包内组件调用getContext().resourceManager获取资源的问题分析 在 HAR 包中的组件,调用了 getContext().resourceManager 来获取资源中的字符串。

如果是同项目下的 HAP 包引用该组件,则可以正常获取到字符串。

如果是跨项目,例如将该 HAR 包发布到第三方仓库,其他项目安装该 HAR 包,就会出现 Invalid resource ID 或者 GetStringById failed state

报错的代码是:

getContext().resourceManager.getStringSync($r('app.string.select_all').id)

更多关于HarmonyOS鸿蒙Next中HAR包内组件调用getContext().resourceManager获取资源的问题分析的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html

10 回复

1、确认下Har包是否开启了混淆-发布到仓库中的Har如果是release包,默认开启混淆,resourceID会变成-1

2、如果满足上述情况,可以使用以下方式解决:

(1)关闭混淆

(2)使用getStringByName 获取资源名称对应的值

更多关于HarmonyOS鸿蒙Next中HAR包内组件调用getContext().resourceManager获取资源的问题分析的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


使用 getStringByName 解决了问题。
感谢。

你好。

因为上下文不对,所以才会造成获取不到资源。

最早之前的写法是:

getContext().createModuleContext("moduleName").resourceManager.getStringSync()

现在推荐修改为:

[@ohos.app.ability.application (Application)-Stage模型能力的接口-ArkTS API-Ability Kit(程序框架服务)-应用框架 - 华为HarmonyOS开发者](https://developer.huawei.com/consumer/cn/doc/harmonyos-references-V14/js-apis-app-ability-application-V14#applicationcreatemodulecontext12)

有要学HarmonyOS AI的同学吗,联系我:https://www.itying.com/goods-1206.html

我看文档里面,moduleName 传入的为什么都是 entry,为什么不是传入 HAR 包的 moduleName 呢?HAR 包的 module.json5 中也有 module.name 字段。而且,application.createModuleContext() 也需要传入一个上下文,这个上下文又是如何选择的。

我在名为 library 的 HAR 包的 MainPage.ets 文件中使用下面的代码:

application.createModuleContext(getContext(this), 'library').then(context => {
    this.value = context.resourceManager.getStringSync($r('app.string.page_show'))
    console.log(JSON.stringify({ value: this.value }))
}).catch((error: Error) => {
    console.error(error.message)
})

同项目的 HAP 中引入 MainPage,报错,Invalid input parameter.

如果改为下面的代码,则正常:

application.createModuleContext(getContext(), 'entry')

可是这样一来,和直接 getContext 也就没区别了,我的目的是在另一个项目中引入该 HAR 包。

现在,我在另一个项目的 HAP 中导入了 MainPage,报错:Invalid resource ID

改为 library 那就更是不行了。

所以,你的方法应该是没用?还是我的方式有问题?

找HarmonyOS工作还需要会Flutter的哦,有需要Flutter教程的可以学学大地老师的教程,很不错,B站免费学的哦:BV1S4411E7LY/?p=17

目前就算使用了 application.createModuleContext() 去替换原来直接使用 getContext,可最后呈现的报错却是一模一样的。

在HarmonyOS鸿蒙Next中,HAR(HarmonyOS Ability Resources)包内的组件调用getContext().resourceManager获取资源时,可能会遇到资源路径解析错误或资源无法加载的问题。这是由于HAR包的资源路径与主应用的资源路径不同,导致resourceManager无法正确解析资源路径。

在鸿蒙Next中,HAR包的资源路径是基于HAR包的包名进行解析的,而主应用的资源路径是基于主应用的包名进行解析的。因此,当HAR包内的组件调用getContext().resourceManager获取资源时,resourceManager会尝试在主应用的资源路径下查找资源,而不是在HAR包的资源路径下查找资源,从而导致资源无法加载。

为了解决这个问题,可以在HAR包内使用ResourceManagergetResource方法,并显式指定HAR包的资源路径。例如,可以使用ResourceManager.getResource("har://[HAR包名]/[资源路径]")来获取HAR包内的资源。这样可以确保ResourceManager在HAR包的资源路径下查找资源,从而避免资源路径解析错误或资源无法加载的问题。

此外,还可以在HAR包内使用ResourceManagergetResourceManager方法,获取HAR包内的ResourceManager实例,然后使用该实例来获取资源。这样可以确保ResourceManager在HAR包的资源路径下查找资源,从而避免资源路径解析错误或资源无法加载的问题。

在HarmonyOS鸿蒙Next中,HAR(HarmonyOS Ability Resources)包内的组件调用getContext().resourceManager获取资源时,可能会遇到资源路径或资源ID解析错误的问题。这通常是由于HAR包的资源路径与主模块的资源路径不一致导致的。解决方法包括:确保资源ID在HAR包和主模块中唯一,使用ResourceManagergetResource方法时指定正确的资源路径,或在HAR包中通过ResourceTable直接引用资源。此外,检查HAR包的构建配置,确保资源文件正确打包。

回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!