1

我的问题的快速总结:我正在尝试读取本地图像文件。如果我将文件包含在我的资产目录中并将其视为资产,那么一切正常。但是,如果我尝试从外部 sd 卡读取它,BitmapFactory.decode 流返回 null。我对 .jpeg 和 .png 文件都有相同的结果。

这就是我从资产文件中获取 InputStream 的方式:

InputStream isa = context.getAssets().open("Boulder.jpg");

这就是我从资产文件中获取 InputStream 的方式:

File f = new File( "/mnt/extSdCard/Maps/Colorado/Boulder.jpg" );
InputStream isf = new BufferedInputStream( new FileInputStream( f.toString() ) );

在任何一种情况下,InputStream 都会传递给这段代码:(如果这段代码看起来很熟悉,它是从互联网示例中借来的)

this.decoder = BitmapRegionDecoder.newInstance(inputStream, false);

tmpOptions.inJustDecodeBounds = true;   
Bitmap temp = BitmapFactory.decodeStream(inputStream, null, tmpOptions);
setSceneSize(tmpOptions.outWidth, tmpOptions.outHeight);

tmpOptions.inJustDecodeBounds = false;
tmpOptions.inSampleSize = (1<<downShift);
sampleBitmap = BitmapFactory.decodeStream(inputStream, null, tmpOptions);

同样,使用资产文件派生的 InputStream,一切正常。相反,对于 sdCard 文件,第一次调用后 outWidth 和 outHeight 均为 -1,第二次调用后 sampleBitmap 为空。

我真的被这个问题缠住了,花了很多时间浏览这个论坛并尝试了建议的解决方案,但都无济于事。我还编写了一些测试代码来打开文件的两个版本,创建如上所示的 InputStreams,然后读取每个流的内容并比较每个字节,发现它们是相同的。

我已经在不同的设备上尝试了相同结果的代码。我目前正在使用 AndroidManifest 中的以下版本信息在 Galaxy Note II (Android 4.1.1) 上进行测试:

<uses-sdk android:minSdkVersion="16" android:targetSdkVersion="16"/>

我需要能够将文件动态添加到系统中,因此不能将所有内容都包含为资产。任何帮助将不胜感激。

4

1 回答 1

0

你可以简单地使用

        BitmapFactory.decodeFile(file.getAbsolutePath(), tmpOptions);

而不是

文件 f = 新文件(“/mnt/extSdCard/Maps/Colorado/Boulder.jpg”);InputStream isf = new BufferedInputStream( new FileInputStream( f.toString() ) ); BitmapFactory.decodeStream(inputStream, null, tmpOptions)

于 2017-10-19T11:15:03.463 回答