我正在编写一个需要为各种目的读取两个图像文件的应用程序。
其中一个图片文件是通过intent-filter接收的,我以这种方式打开它(注意:mIntent
是getIntent()
的结果):
mFileUri = (Uri) mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
mInputStream = getContentResolver().openInputStream(mFileUri);
然后读取mInputStream按预期工作。
问题是正在阅读第二个图片文件:它的Uri
(使用toString()
转换)是以共享首选项编写的,我得到了值并使用Uri.parse()
来恢复它,因为"默认值" getString()
调用中的参数我使用位于assets子目录(Uri
scheme)中的本地资源的android.resource
。我尝试阅读它的方式是相同的,使用getContentResolver().openInputStream()
,但出现问题:在返回的read()
上调用InputStream
始终返回-1
。我还尝试了getAssets().open()
,但使用android.resource
或content
方案Uri
无效。
注意:对于使用意图的文件,我使用read(byte[])
,而第二个使用read()
。
所以,这是我的问题:为什么会发生这种情况,我该如何解决这个问题?
答案 0 :(得分:1)
我是对的:这是AssetInputStream
实施中的错误,因为本机方法_FileAsset::read(void *, size_t)
中EOF和I / O错误之间缺乏区别。< / p>
结果是,只有使用AssetInputStream
或read(byte[])
才能从read(byte[], int, int)
进行阅读。
答案 1 :(得分:0)
你可以使用'int read()'方法读取资产,请尝试:
AssetManager mgr = getAssets();
try {
InputStream is = mgr.open("test.txt");
Log.d(TAG, "onCreate 'is': " + is);
Log.d(TAG, "onCreate note 'is' is android.content.res.AssetManager$AssetInputStream");
int c;
while ((c = is.read()) != -1) {
Log.d(TAG, "onCreate " + (char) c);
}
} catch (IOException e) {
e.printStackTrace();
}
和输出(对于包含字节“qwertyuiop”的文件assets / test.txt是:
D / Test(872):onCreate'is':android.content.res.AssetManager $ AssetInputStream D / Test(872):onCreate note'is'是android.content.res.AssetManager $ AssetInputStream D / Test(872):onCreate q D / Test(872):onCreate w D / Test(872):onCreate e D / Test(872):onCreate r D / Test(872):onCreate t D / Test(872):onCreate y D / Test(872):onCreate u D / Test(872):onCreate i D / Test(872):onCreate o D / Test(872):onCreate p
但由于您没有提供用于创建AssetInputStream的Uri,因此我无法重现您的确切错误。