BitmapFactory.decodeStream返回null读取本地文件

时间:2013-02-08 03:23:53

标签: android-image

我的问题的快速摘要:我正在尝试读取本地图像文件。如果我将文件包含在我的资产目录中并将其视为资产,一切正常。但是,如果我尝试从外部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在第二次调用后为null。

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

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

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

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

1 个答案:

答案 0 :(得分:0)

您可以简单地使用

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

而不是

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