应用程序在使用 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(.

因为它会为某些设备抛出OOM, 要解决此问题,您可以在使用图像解码器解码时设置 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(整数(

相关内容

  • 没有找到相关文章

最新更新