【问题标题】:Android Library Project - Error when calling context.getResources().openRawResource()Android 库项目 - 调用 context.getResources().openRawResource() 时出错
【发布时间】:2013-03-18 11:51:57
【问题描述】:

我正在开发一个 android 库项目,它应该从其原始资源中的 xml 文件中读取(我们称之为 xml_file_name.myextension)。

我所做的基本上是创建一个包含这些文件夹的库项目的 jar 文件:

  • 源代码
  • res/raw

并在测试应用程序中将其作为库引用。这是我用来(在库项目中)获取 xml 文件的代码:

int xml_res_id = -1;

for (Field f : R.raw.class.getFields()) {

  System.out.println("Raw resource found: " + f.getName());
  if (f.getName().equalsIgnoreCase("xml_file_name"))
    xml_res_id = f.getInt(null);

}

if(xml_res_id != -1){
  System.out.println("xml_file_id: " + xml_res_id);
  InputStream is = context.getResources().openRawResource(xml_res_id);
  // Decode xml file with SAXParser..
}

(我有应用程序上下文,因为应用程序将其显式传递给库项目。)

当我启动测试应用程序(并调用读取 xml 文件的方法)时会发生以下错误:

看来xml文件实际上是在正确的文件夹中,因为:

1) for 循环实际打印“找到的原始资源:xml_file_name.myextension”和“xml_file_id:2130968576”

2) 如果我在应用程序的 res/raw 文件夹中放置了一个名为“xml_file_name.myextension”的文件,它不会编译,并且错误是:“Error generate final archive: Found duplicate file for APK: res/原始/xml_file_name.myextension”。这基本上给了我证明 文件已从库项目中正确“导入”。

请注意: 我也尝试过这种其他方式

InputStream is = context.getResources().openRawResource(R.raw.xml_file_name);

得到同样的错误。

我真的不明白可能是什么问题..我做错了什么?


编辑:

对于任何对此问题感兴趣的人: 我终于意识到这是不可能的,主要是因为当我尝试通过 context.anymethod 获取资源时,我引用了应用程序的 R 文件,所以我无法给出从我的库项目的 R 文件中获取的资源 ID .

它会编译,因为库项目 jar 文件包含资源 (R.raw.xml_file),但对 context.something 的调用将始终给出 null 作为结果,因为它引用了应用程序 R 文件,而不是有那个特定的资源。

我终于不得不把我的xml文件放到app的res/raw文件夹下,用这种方式访问​​xml_file原始资源:

int xml_id = context.getResources().getIdentifier("xml_file_name", "raw", context.getPackageName());

// Getting input stream from xml file
InputStream is = context.getResources().openRawResource(xml_id);

【问题讨论】:

    标签: android android-resources library-project


    【解决方案1】:

    我实际上已经成功地做到了 - 库对象应该在应用程序上下文中。但是,它仅适用于Activity,而我没有找到其他类型。将同一库与 FragmentActivity 一起使用会因 NoClassDefFoundError 而失败。

    编辑****

    它可以在与库相同的根命名空间中与 FragmentActivity 一起使用。我正在从不同的根名称空间访问。

    结束编辑****

    我有一个引用 xml 文件的库项目:

    InputStream is = context.getResources().openRawResource(R.raw.application_table_defs);
    

    当我调用执行上一行的库方法时,我必须传入一个上下文:

    Context context = this.getContext();
    

    关键是将注入的getResource 完全限定为context.getResources()...

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-02
      • 2019-09-26
      相关资源
      最近更新 更多