java - 使用 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,为了解决这个问题,您可以在使用 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)
推荐阅读
- php - 我应该如何在 PHP 中正确命名我的命名空间?
- material-ui - 两行后的材质ui文本省略号
- javascript - 为什么用 javascript 模拟选择选项不进行 API 调用?
- php - WordPress 中的 add_submenu_page
- react-native - 如何使用导航将捕获的图像从反应本机相机传递到另一个屏幕(版本 5)
- python - 带有 TaskManager 和 selenium 的 ERR_NETWORK_CHANGED
- html - 为什么使用列表时链接不重定向用户?
- reactjs - 我将检索对象中的信息要在 FormItem 中执行 antd 如何
- docker - nginx 不会在 80 以外的端口上监听 docker 上的 pgadmin
- terraform - 基于变量的可选块