HarmonyOS SDK内部资源获取异常

Har包内字符串资源相互获取异常,无法通过正常的API(resource.getStringSync)接口进行资源获取。目前SDK情况如下:

问题1. Har包A持有真实的资源信息,且能获取Resource,Har包B提供了一个通用的资源获取方法,入参为Resource,通过resourceManager.getStringSync,目前通过getStringByNameSync来解决。

问题2. 在问题1修复方案上,提供给客户包的时候发现,Har包的传递依赖资源无法获取,客户对SDK封装成了一个Har工程bizHar,entry工程依赖客户必须在entry主工程dependencies中在我们提供的所有Har包资源才能获取。

HarmonyOS
2024-08-14 15:37:07
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zxjiu

目前整体分析如下:

1、对于HAP包自带全局Context,对应resourceManager的接口只会读取HAP下的resource资源;

2、对于HSP包需要使用createModuleContext(moduleName)创建独立的Context,对应resourceManager的接口只会读取HSP下的resource资源;

3、对于HAR包,目前没有自己的context,所以resourceManager像getStringValue这种接口会报资源找不到 — 当前问题根因;该问题对策如下:以字符串举例,HAR包可以通过resourceManager的getStringByNameSync接口获取到字符串文本。

但是有个规则:

1、如果是HAP包直接依赖的HAR包,则需要使用getContext().resourceManager来获取resourceManager;

2、如果是HSP包直接依赖的HAR包,这需要使用getContext().createModuleContext(moduleName).resourceManager来获取resourceManager;参考示例如下:

import { Context } from '@kit.AbilityKit'; 
/** 
 * 对外暴露资源名称 
 */ 
export enum HarStringName { 
  PAGE_SHOW = 'page_show', 
  PAGE_SHOW_SUMMARY = 'page_show_summary' 
} 
/** 
 * 封装一个单例类,用于har包对外暴露资源文件。 
 * 对外暴露的字符串名称需要做限制,这里做了枚举限制。 
 */ 
export class ResUtils { 
  private static sResUtils?: ResUtils; 
  private mContext?: Context; 
  private mModuleName?: string; 
 
  private ResUtils() { 
  } 
  public static getInstance(): ResUtils { 
    if (!ResUtils.sResUtils) { 
      ResUtils.sResUtils = new ResUtils(); 
    } 
    return ResUtils.sResUtils; 
  } 
  public getStringByNameSync(stringName: HarStringName) { 
    let pageShowRes = $r(`app.string.${stringName}`); 
    let stringValue: string | undefined = undefined; 
    try { 
      // 这里主要是为了创建 mContext 
      if (!this.mContext || !this.mModuleName || pageShowRes.moduleName !== this.mModuleName) { 
        this.mModuleName = pageShowRes.moduleName; 
        this.mContext = getContext().createModuleContext(pageShowRes.moduleName); 
      } 
      // 目前只能使用该接口获取资源 
      stringValue = this.mContext?.resourceManager.getStringByNameSync(stringName); 
    } catch (error) { 
      console.warn('getStringByNameSync, error: ' + error); 
    } 
    console.debug('stringName: ' + stringValue); 
  } 
}
分享
微博
QQ
微信
回复
2024-08-14 23:21:27
相关问题
HarmonyOS 调用内部资源问题
263浏览 • 1回复 待解决
HarmonyOS 异常堆栈获取
276浏览 • 1回复 待解决
HarmonyOS 图片exif信息获取异常
280浏览 • 2回复 待解决
如何动态根据资源获取资源id
8459浏览 • 1回复 已解决
鸿蒙资源id哪里获取
6184浏览 • 1回复 待解决
获取系统当前时间戳异常
37浏览 • 1回复 待解决
HarmonyOS 如何获取媒体资源的md5信息
490浏览 • 1回复 待解决
HarmonyOS中如何获取资源的绝对路径
256浏览 • 1回复 待解决
HarmonyOS webview内部history问题
365浏览 • 1回复 待解决
通过相册名获取相册资源
662浏览 • 1回复 待解决
如何获取HSP的资源文件
2112浏览 • 1回复 待解决
HarmonyOS 如何实现内部类?
57浏览 • 1回复 待解决
HarmonyOS SDK和openHarmony SDK怎么选择?
7915浏览 • 1回复 待解决
HarmonyOS UI内部使用AppStorage问题
167浏览 • 1回复 待解决