我的问题的快速总结:我正在尝试读取本地图像文件。如果我将文件包含在我的资产目录中并将其视为资产,那么一切正常。但是,如果我尝试从外部 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"/>
我需要能够将文件动态添加到系统中,因此不能将所有内容都包含为资产。任何帮助将不胜感激。