2

我正在编写一个需要读取两个图像文件以用于各种目的的应用程序。

其中一个图像文件是通过意图过滤器接收的,我以这种方式打开它(注意:mIntent是的结果getIntent()):

mFileUri = (Uri) mIntent.getParcelableExtra(Intent.EXTRA_STREAM);
mInputStream = getContentResolver().openInputStream(mFileUri);

然后读取 mInputStream 按预期工作。

问题是读取第二个图像文件:它Uri(使用 转换toString())写在共享首选项中,我获取值并使用Uri.parse()它来恢复它,作为getString()调用中的“默认值”参数我使用Uri位于资产子目录(android.resource方案)。我尝试阅读它的方式是相同的,使用getContentResolver().openInputStream(),但是出了点问题:调用read()返回的InputStream总是 return -1。我也试过,但不管用 an还是schemegetAssets().open()都行不通。注意:对于我使用的意图接收文件,而对于我使用的第二个文件。android.resourcecontentUriread(byte[])read()

所以,这是我的问题:为什么会发生这种情况,我该如何解决这个问题?

4

2 回答 2

1

我是对的:这是AssetInputStream实现中的一个错误,因为本地方法中没有区分 EOF 和 I/O 错误_FileAsset::read(void *, size_t)

AssetInputStream结果是只有使用read(byte[])or才能读取read(byte[], int, int)

于 2013-10-26T10:34:03.767 回答
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 注意'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,因此我无法重现您的确切错误。

于 2013-10-27T05:58:14.050 回答