我正在开发一个 android 库项目,它应该从其原始资源中的 xml 文件中读取(我们称之为 xml_file_name.myextension)。
我所做的基本上是创建一个包含这些文件夹的库项目的 jar 文件:
- 源代码
- 创
- 库
- 资源/原始
并将其作为测试应用程序中的库引用。这是我用来(在库项目中)获取 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/raw/xml_file_name .myextension”。这基本上证明了该文件是从库项目中正确“导入”的。
请注意:我也尝试过这种其他方式
InputStream is = context.getResources().openRawResource(R.raw.xml_file_name);
得到同样的错误。
老实说,我不明白可能是什么问题..我做错了什么?
编辑:
对于任何对此问题感兴趣的人:我终于意识到这是不可能的,主要是因为当我尝试通过 context.anymethod 获取资源时,我指的是应用程序的 R 文件,所以我无法给出从中获取的资源 ID我的库项目的 R 文件。
它将编译,因为库项目 jar 文件包含资源(R.raw.xml_file),但对 context.something 的调用将始终给出 null 作为结果,因为它引用了没有那个特定的 app 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);