Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在android中以InputStream的形式读取资源_Java_Android_Android Studio - Fatal编程技术网

Java 在android中以InputStream的形式读取资源

Java 在android中以InputStream的形式读取资源,java,android,android-studio,Java,Android,Android Studio,我有一些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

我有一些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
的根,因此我仍然得到相同的
没有这样的文件或目录
错误消息

更新:

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

InputStream is = null;

        try {

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

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

但我仍然收到相同的错误

只有在
xhdpi
设备上运行应用程序时,才会从
“res/drawable xhdpi”
获取可绘制文件。否则,它将根据屏幕从相应的drawable文件夹中获取drawable,如果它不在那里,您将得到与上面相同的错误。如果您不确定使用的屏幕大小,最好的解决方法是在res文件夹(即,
“res/drawable”
)中创建一个名为
“drawable”
)的目录,然后将
我的btn
添加到新创建的
“drawable”
文件夹中。然后,无论屏幕大小如何,它都将从新文件夹中获取图像

编辑

您使用的是原始文件夹,而不是资源文件夹
openRawResource
从原始文件夹读取数据。使用下面的代码获得一个可绘制文件,并将其转换为输入流(您将不得不使用try-catch进行包围)


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


将测试映像放在
res/raw/
中的某个位置(然后,使用现有的代码,使用
R.raw。无论您称之为什么,_映像
)或
assets/
(然后,使用
getAssets().open()
,在
assets/
中使用与映像相关的路径)。

\p>\u pm.iconStream=getResources().openrawsource>(+R.drawable.pdf_icon);

您想用这种方法解决什么问题?这不是您使用可绘制资源的方式。
openRawResource()
用于原始资源,而不是可绘制资源。我只是尝试测试,然后拍摄一张照片并将其发送到
Parse
,这比它应该的要复杂,可能是因为这样做的基本方法是错误的。因此,作为建议,请编辑您的问题,告诉我们您想要实现的目标,以便我们可以找到更合适的答案。我照你说的做了,我在一个可绘图文件夹中添加了一些图片,但仍然收到相同的消息!!等等。在阅读了你问题下的评论后,我注意到你犯了严重错误。我将编辑我的答案。更新。请检查并告诉我是否有帮助。:)这对于用例来说是相当内存密集的。刚才回答了他的问题。他的问题是关于获取一个可绘制的输入流。我尝试将
assets/
目录添加到
res
文件夹中,然后将
getAssets()放入。打开(“我的btn”)
,我仍然得到了相同的结果message@user1611830:您忘记了文件扩展名。对于资产,您使用扩展名为的完整文件名。对不起,我的意思是我使用了正确的扩展名。顺便说一下,当我放置
Log.d(“TAG”)时,Arrays.toString(getAssets().list(“.”))我得到一个空的array@user1611830:由于您没有名为
的文件,这并不奇怪。这不是一个目录;它是ZIP样式存档(APK)中的条目。@user1611830它不属于res文件夹,您必须将其添加到assets目录中。首先,您需要在src>main中添加它(因为您使用的是android studio)。第二,别忘了分机。
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());