如何在Android库项目中访问资源

16

我正在构建一个Android库项目,需要在内部使用一些静态资源(如图像、XML等)。

然后我想知道在哪里可以放置这些资源以及如何访问它们?

由于我将资源放置在 assets 文件夹中,因此我使用 AssetManager 来访问这些资源:

public class DataProvider {
    byte[] getDrawableData(int num) {
        AssetManager am = Resources.getSystem().getAssets();
        InputStream is = null;
        try {
            is = am.open("t.jpg");
        } catch (IOException e) {
            return "".getBytes();
        }
        if (is != null) {
            Drawable dw = Drawable.createFromStream(is, null);
            Bitmap bm = ((BitmapDrawable) dw).getBitmap();
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.JPEG, 100, stream);
            return stream.toByteArray();
        }

        return "".getBytes();
    }
}

然而我遇到了错误:W/System.err(19583): java.io.FileNotFoundException: t.jpg

问题出在哪里?


如同Sankar V所说,库项目不支持原始资源。看来我得将资源放在res文件夹下。

但我已经尝试使用 Resources.getSystem().getResources().... 方法获取我想要的资源,但是人们说这个方法只能获取系统级别的资源而非应用程序级别的资源。

如果这是真的,那是否意味着我需要在任何我想获取资源的地方都要持有一个Context对象的引用呢?


我已经阅读了这篇文章。但是我无法访问context对象,因此无法调用getResources()... - hguser
我想确认一下DataProvider类位于哪里?是在库项目中还是应用程序项目中? - Sankar V
DataProvider 类位于 Library 项目中。 - hguser
1
从库项目中,您可以像往常一样访问资源文件。例如,您可以通过R.drawable.image_name访问存储在drawable中的图像。 - Sankar V
但是在DataProvider类中没有引用context,所以我无法使用getResources()方法。 - hguser
显示剩余2条评论
3个回答

9

那么我想知道我应该把这些资源放在哪里以及如何访问它们?

从Android文档中获得的信息:

库项目不能包含原始资产

工具不支持在库项目中使用原始资产文件(保存在assets/目录中)。任何应用程序使用的资产资源必须存储在应用程序项目本身的assets/目录中。但是,保存在res/目录中的资源文件受到支持

文档参考链接:LibraryProjects

解决方案:如何从应用程序项目访问库项目的res/目录中保存的资源文件

注意:如果您想从库项目本身访问资源,请将资源添加到res/目录而不是assets。因为assets中的文件不会与.jar文件捆绑在一起。 您可以像往常一样使用R.java文件中生成的引用进行访问。

例如:要从drawable中访问图像,请使用以下方法:

R.drawable.image_name

这是否意味着我必须在任何想获取资源的地方都持有Context对象的引用?

实际上,您应该持有Context的引用来访问资源。

更新:

现在,Android库项目可以生成为aar(Android Archive)文件,这使您可以捆绑库项目所需的资源文件,而不是旧的jar(Java Archive)文件,它只允许您捆绑Java类。


Sankar:你说“库项目不能包含原始资产”。但我使用了一些第三方库,他们将类和资产文件夹打包在一起。问题出在哪里? - hguser
我可以知道那个第三方库是什么吗? - Sankar V
我想说的是您误解了我的意思。我的重点在于我并不试图访问Activity(上下文)范围内的图像,因此我不使用getResource(R.drawable.image_name) - hguser
我现在明白了。实际上,如果没有“Context”,你不应该访问资源,因为它是资源的句柄。 - Sankar V
这是否意味着我必须在任何想要访问资源的地方绑定一个 context 对象?那使用 Class.xx.getResources() 呢? - hguser
显示剩余2条评论

0

好的,已经有一段时间没有给出一个有效的解决方案了。我一直在创建Android库的过程中工作了几天,也遇到了这个问题。我尝试了上面提出的所有解决方案,但都没有对我起作用。

最近我看了一个关于Android库的视频,并且大致了解了解决方案,即使该视频没有提到在库代码中使用res目录资源是必要的。

所以解决方法很简单。只需检查以下行:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yourpackage">  <!-- this line -->

</manifest>

如果在您的清单中没有声明,那么您将无法在库Java文件/XML文件中使用任何字符串、样式和可绘制项。

我已经在我的端上进行了检查,并在搜索了近2天后随机找到了这个解决方案。 请尝试并告诉我是否有效。


0

或者您可以在Eclipse中使用Linked Folder,并将您的资产文件夹链接到您的新项目。


这可能有助于Eclipse,但现在应该优先使用Android Studio。但我不相信这也会在Eclipse中有所帮助,因为链接的文件夹在构建项目时没有链接。 - Deniz Celebi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接