如何访问我放在res文件夹中的原始资源?

61
在J2ME中,我会像这样做: getClass().getResourceAsStream("/raw_resources.dat"); 但在安卓中,我总是得到null,为什么?

21
在为Android和J2ME编程之间存在巨大差异。 - Janusz
3
在一个关于Android和J2ME都能够完全相同工作的问题下看到这样一条评论,感觉很有意思。请查看我的回答。 - 0xF
8个回答

136

对于原始文件,您应该考虑在res目录下创建一个raw文件夹,然后从您的活动中调用getResources().openRawResource(resourceName)


Samuh,谢谢您的回复。如果我这样做,我会遇到错误Android XML格式问题,因为我使用的不是标准的xml,是否有其他方法可以将其作为真正的原始数据使用? - Arkaha
@hackbod 但是通过这种技术,你可以在编译时检查资源文件的存在,这对于确保代码质量是一个巨大的进步。 - Snicolas
嗨,Samuah。我有一个测试项目X,用于测试项目Y。项目Y引用了库Z。库Z有一个原始资源R,我正在尝试打开它,但是一直提示找不到资源。你知道为什么你的代码片段对此无效吗? - Guy
1
@Guy:当你有不同的R时,这是一个常见的问题。你只是没有引用正确的R。检查你的导入或者引用拥有资源的正确的R。 - m0skit0
十年过去了,这个答案仍然很有价值。 - Danish Ansari
显示剩余3条评论

26
InputStream raw = context.getAssets().open("filename.ext");

Reader is = new BufferedReader(new InputStreamReader(raw, "UTF8"));

20
请参考下面Samuh的回答,它更加准确。 - BoD
1
顺便提一下,原始文件夹不允许通过文件名访问。有些应用程序需要动态文件名,在这种情况下 assets 文件夹很有用。 - Caner
10
他没有询问资产/他询问的是 res/raw/。 - Jeffrey Blattman
2
这不是在Android中做事的方式。请查看Samuh的回答。 - m0skit0
2
他说的是“res”文件夹,而不是“assets”文件夹。 - Barry Fruitman
显示剩余2条评论

16

在某些情况下,我们需要根据图像名称而不是生成的ID从drawable或raw文件夹中获取图像。

// Image View Object 
        mIv = (ImageView) findViewById(R.id.xidIma);
// create context Object for  to Fetch  image from resourse 
Context mContext=getApplicationContext();

// getResources().getIdentifier("image_name","res_folder_name", package_name);

// find out below example 
    int i = mContext.getResources().getIdentifier("ic_launcher","raw", mContext.getPackageName());

// now we will get contsant id for that image       
        mIv.setBackgroundResource(i);

6
这行代码:int i = mContext.getResources().getIdentifier("ic_launcher","raw", mContext.getPackageName()); 很重要。 - Radu

9

Android访问原始资源

一种先进的方式是使用Kotlin 扩展函数

fun Context.getRawInput(@RawRes resourceId: Int): InputStream {
    return resources.openRawResource(resourceId)
}

还有一个有趣的东西是扩展函数use,它在Closeable作用域中定义。

例如,您可以优雅地处理输入流,而无需处理异常和内存管理。

fun Context.readRaw(@RawRes resourceId: Int): String {
    return resources.openRawResource(resourceId).bufferedReader(Charsets.UTF_8).use { it.readText() }
}

6
TextView txtvw = (TextView)findViewById(R.id.TextView01);
        txtvw.setText(readTxt());

 private String readTxt()
    {
    InputStream raw = getResources().openRawResource(R.raw.hello);

    ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();

    int i;
    try
    {
        i = raw.read();
        while (i != -1)
        {
            byteArrayOutputStream.write(i);
            i = raw.read();
        }
        raw.close();
    }
    catch (IOException e)
    {
        // TODO Auto-generated catch block

        e.printStackTrace();
    }


    return byteArrayOutputStream.toString();

}

TextView01:: 线性布局中的文本视图

hello:: res/raw文件夹中的.txt文件(您也可以访问其他文件夹)

前两行代码应写在onCreate()方法中

其余代码应写在扩展Activity类中!


6

getClass().getResourcesAsStream() 在安卓上可以正常使用。只需确保您要打开的文件已正确嵌入您的 APK 中(将 APK 作为 ZIP 文件打开即可)。

通常在安卓上,您会将这些文件放在 assets 目录中。因此,如果您将 raw_resources.dat 放在项目的 assets 子目录中,它将出现在 APK 的 assets 目录中,您可以使用以下代码:

getClass().getResourcesAsStream("/assets/raw_resources.dat");

你还可以定制构建过程,使文件不落入APK的assets目录中。


2
嘿,不错。甚至不需要上下文。 - Erhannis
2
需要注意的是,assets文件夹位于src/main/assets - Erhannis

3

InputStream in = getResources().openRawResource(resourceName);

这段代码是正确的。在此之前,您需要在原始资源中创建XML文件/文本文件才能访问它。

编辑:
有时,如果布局文件或图像名称存在错误,则会导入com.andriod.R。因此,您必须正确导入包才能访问原始文件。


1
openRawResource()需要一个整数参数,而不是一个字符串。http://developer.android.com/reference/android/content/res/Resources.html#openRawResource(int) - mmathieum
这个也适用于存在于drawable文件夹中的资源吗? - android developer
1
使用“R.raw.NameOfResource”作为int。 - CristianCV
尽管这个方法需要一个整数,但是我还是可以通过R.raw.filename(没有扩展名)找到我的文件。 - Julius

-1
这对我有用:getResources().openRawResource(R.raw.certificate)

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