BitmapFactory.decodeStream(is)在下载文件夹中的某些图像上失败

时间:2013-04-05 17:43:12

标签: android cordova bitmap

我正在使用PhoneGap 2.5.0,以下是我调用该方法的方法:

try {
        InputStream is = cordova.getActivity().getContentResolver()
                .openInputStream(Uri.parse(inputString));
        Bitmap bmp = BitmapFactory.decodeStream(is);
        is.close();

使用相机拍摄照片时代码正常,但下载文件夹中的某些图像随机失败。我检查了这些图像,它们都在本地下载了一个URL,如content:// media / external / images / media / xxxx。有些文件相当大6MB,而其他文件小700K。失败似乎是随机的,返回null并且没有被异常捕获。

2 个答案:

答案 0 :(得分:3)

来自doc

  

将输入流解码为位图。如果输入流为空,或者不能用于解码位图,则该函数返回null。流的位置将是读取编码数据后的位置。

因此,您的InputStream为null,或者您打开的文件不能用于解码位图。

答案 1 :(得分:3)

任何机会都是jpeg?

请参阅此已知问题: -

https://code.google.com/p/android/issues/detail?id=6066

我使用以下方法解码位图: -

BitmapFactory.decodeStream(new FlushedInputStream(is), null, opts);

public class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
    super(inputStream);
}

@Override
public long skip(long n) throws IOException {
    long totalBytesSkipped = 0L;
    while (totalBytesSkipped < n) {
        long bytesSkipped = in.skip(n - totalBytesSkipped);
        if (bytesSkipped == 0L) {
              int myByte = read();
              if (myByte < 0) {
                  break;  // we reached EOF
              } else {
                  bytesSkipped = 1; // we read one byte
              }
       }
        totalBytesSkipped += bytesSkipped;
    }
    return totalBytesSkipped;
}
}

此外,如果某些图像很大,您可能需要设置样本大小,这样就不会导致分配过大。

BitmapFactory.Options opts = new BitmapFactory.Options();
opts.inSampleSize = sampleSize;

其中sampleSize是您计算的合理值。