0

我正在使用 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 而不是被异常捕获,失败似乎是随机的。

4

2 回答 2

3

文档

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

因此,要么您的 InputStream 为空,要么您打开的文件不能用于解码位图。

于 2013-04-05T17:52:04.743 回答
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 是您计算的合理值。

于 2013-04-05T17:58:56.127 回答