首页 > 解决方案 > 使用 ImageDecoder#createSource(contentResolver, uri) 时应用程序崩溃

问题描述

尝试替换已弃用的代码以从 Uri 检索图像

MediaStore#Images#Media#getBitmap(contentResolver, uri)

与新

ImageDecoder#createSource(contentResolver, uri)

这是我的新代码:

Bitmap thumbNail;
                        if (Build.VERSION.SDK_INT < 28) {
                            thumbNail = MediaStore.Images.Media.getBitmap(
                                    getContentResolver(),
                                    data.getData()
                            );
                        } else {
                            ImageDecoder.Source source = ImageDecoder.createSource(getContentResolver(), data.getData());
                            thumbNail = ImageDecoder.decodeBitmap(source);
                        }

但我注意到,每当我尝试使用它来处理大约 2MB 到 3.5MB 的相对较大尺寸的图像时。应用程序崩溃了哪条消息

通道已不可恢复地损坏,将被处理!

我做错了什么还是不适合处理较大的图像文件?当我决定使用不推荐使用的方法时,该应用程序运行良好:

MediaStore#Images#Media#getBitmap(contentResolver, uri)。

标签: javaandroidkotlinmobile

解决方案


因为它会为某些设备抛出 OOM,为了解决这个问题,您可以在使用 ImageDecoder 解码时设置 sampleSize

val source = ImageDecoder.createSource(context.contentResolver, imageUri)
val listener = ImageDecoder.OnHeaderDecodedListener { decoder, info, source ->
    var scaleFactor = (info.size.width / 1280).coerceAtMost(info.size.height / 1280)
    if (scaleFactor < 1) scaleFactor = 1
    decoder.setTargetSampleSize(scaleFactor)
    decoder.setOnPartialImageListener {
        true
    }
}
ImageDecoder.decodeBitmap(source)

参考:https://developer.android.com/reference/android/graphics/ImageDecoder#setTargetSampleSize(int)


推荐阅读