HarmonyOS鸿蒙Next中HAR包内组件调用getContext().resourceManager获取资源的问题分析
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
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)
我看文档里面,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包内使用ResourceManager
的getResource
方法,并显式指定HAR包的资源路径。例如,可以使用ResourceManager.getResource("har://[HAR包名]/[资源路径]")
来获取HAR包内的资源。这样可以确保ResourceManager
在HAR包的资源路径下查找资源,从而避免资源路径解析错误或资源无法加载的问题。
此外,还可以在HAR包内使用ResourceManager
的getResourceManager
方法,获取HAR包内的ResourceManager
实例,然后使用该实例来获取资源。这样可以确保ResourceManager
在HAR包的资源路径下查找资源,从而避免资源路径解析错误或资源无法加载的问题。
在HarmonyOS鸿蒙Next中,HAR(HarmonyOS Ability Resources)包内的组件调用getContext().resourceManager
获取资源时,可能会遇到资源路径或资源ID解析错误的问题。这通常是由于HAR包的资源路径与主模块的资源路径不一致导致的。解决方法包括:确保资源ID在HAR包和主模块中唯一,使用ResourceManager
的getResource
方法时指定正确的资源路径,或在HAR包中通过ResourceTable
直接引用资源。此外,检查HAR包的构建配置,确保资源文件正确打包。