【问题标题】:BitmapFactory.decodeStream returns null reading local fileBitmapFactory.decodeStream 返回 null 读取本地文件
【发布时间】:2017-10-19 19:15:03
【问题描述】:

我的问题的快速总结:我正在尝试读取本地图像文件。如果我将文件包含在我的资产目录中并将其视为资产,那么一切正常。但是,如果我尝试从外部 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"/>

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

【问题讨论】:

    标签: android-image


    【解决方案1】:

    你可以简单的使用

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

    而不是

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 2015-02-25
      • 2011-05-23
      • 2011-01-31
      相关资源
      最近更新 更多