【问题标题】:reading resource as InputStream in android在android中将资源作为InputStream读取
【发布时间】:2014-09-15 22:58:02
【问题描述】:

我有一些 android 项目,我正在尝试从“res/drawable-xhdpi”目录中读取一些文件,所以我放了

InputStream is = null;

        try {
            is = getResources().openRawResource(R.drawable.my_btn); //my_btn is inside drawable-xhdpi directory
        } catch (Exception e) {
            e.printStackTrace();
        }

但我明白了

error opening trace file: No such file or directory 

我该如何处理这个问题。我尝试使用绝对路径直接从FileInputStream 读取此内容,然后我意识到从中获取文件的根是JVM 的根,所以我仍然得到相同的No such file or directory错误消息

更新:

我在src/main 一侧添加了一个assets 目录,然后将my_btn.png 放入其中,然后在MainActivity 类中调用

InputStream is = null;

        try {

            is = getAssets().open("my_btn.png");

        } catch (Exception e) {
            e.printStackTrace();
        }

但我仍然遇到同样的错误

【问题讨论】:

  • 你想用这种方式解决什么问题?这不是您使用可绘制资源的方式。 openRawResource() 用于原始资源,而不是可绘制资源。
  • 我只是想测试一下,我拍了一张照片发给Parse
  • 这比它应该的要复杂,可能是因为这样做的基本方法是错误的。因此,作为建议,请编辑您的问题,告诉我们您想要实现的目标,以便我们找到更合适的答案。

标签: java android android-studio


【解决方案1】:

仅当您在xhdpi 设备上运行应用程序时,才会从"res/drawable-xhdpi" 获取drawable。否则它将尝试根据屏幕从相应的drawable文件夹中获取drawable,如果它不存在,您将收到与上述相同的错误。如果您不确定要使用哪种屏幕尺寸,最好的解决方法是在 res 文件夹中创建一个名为 "drawable" 的目录(即 "res/drawable"),然后将 my_btn 添加到新创建的 "drawable" 文件夹中。然后无论屏幕大小如何,它都会从新文件夹中获取图像。

编辑

您使用的是原始文件夹,而不是资源文件夹。 openRawResource 从原始文件夹中读取。使用以下代码获取可绘制对象并将其转换为输入流(您必须使用 try-catch 包围)。

Drawable drawable = getResources().getDrawable(R.drawable.my_btn);
BitmapDrawable bitmapDrawable = ((BitmapDrawable) drawable);
Bitmap bitmap = bitmapDrawable.getBitmap();
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 100, stream); //use the compression format of your need
InputStream is = new ByteArrayInputStream(stream.toByteArray());

【讨论】:

  • 我照你说的做了,我在可绘制文件夹中添加了一些图片,但我仍然收到相同的消息!
  • 等等。在阅读了您问题下的评论后,我注意到您做的事情非常错误。我将编辑我的答案。
  • 已更新。请检查并告诉我是否有帮助。 :)
  • 这对于用例来说相当消耗内存。
  • 刚刚回答了他的问题。他的问题是关于让输入流的可绘制对象。
【解决方案2】:

_pm.iconStream = getResources().openRawResource(+ R.drawable.pdf_icon);

【讨论】:

    【解决方案3】:

    我只是想测试一下,我拍了张照片发给 Parse

    将您的测试图像放在res/raw/ 中的某个位置(然后,使用您现有的代码,使用R.raw.whatever_you_call_the_image)或assets/(然后,使用getAssets().open()assets/ 中的相对路径到您的图像) .

    【讨论】:

    • 我尝试将 assets/ 目录添加到 res 文件夹,而不是放入 getAssets().open("my_btn"),但我仍然收到相同的消息
    • @user1611830:您忘记了文件扩展名。对于资产,您可以使用带有扩展名的完整文件名。
    • 对不起,我的意思是我放了正确的扩展名。顺便说一句,当我输入Log.d("TAG", Arrays.toString(getAssets().list("."))); 时,我得到一个空数组
    • @user1611830:由于您没有名为. 的文件,这并不奇怪。这不是目录;它是 ZIP 样式存档(APK)中的条目。
    • @user1611830 它不是您必须添加资产目录的 res 文件夹。首先,您需要将它添加到 src>main(因为您使用的是 android studio)。其次,不要忘记扩展名。
    猜你喜欢
    • 2011-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-19
    • 2023-03-23
    • 2012-06-11
    • 1970-01-01
    相关资源
    最近更新 更多