Android库项目 - 调用context.getResources()时出错.openRawResource()

时间:2013-03-18 11:51:57

标签: android android-resources library-project

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

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

  • SRC
  • LIB
  • RES /原料

并将其作为测试应用中的库引用。这是我使用的代码(在库项目中)以获取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文件的方法)时会发生以下错误:

Android Console Error

似乎xml文件实际上在正确的文件夹中,因为:

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

2)如果我将一个名为“xml_file_name.myextension”的文件放在应用程序的res / raw文件夹中,它就不会编译,错误是:“生成最终存档时出错:找到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文件放在应用程序的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);

1 个答案:

答案 0 :(得分:0)

我实际上已成功完成此操作 - 库对象应位于应用程序上下文中。但是,它仅适用于Activity,而不是我找到的其他类型。使用FragmentActivity的同一个库会因NoClassDefFoundError而失败。

修改****

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

END EDIT ****

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

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

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

Context context = this.getContext();

关键是完全符合注入的getResourcecontext.getResources()...