我的Android应用允许用户在活动中拖放图片。它曾经工作正常,直到Android O和硬件图像加速到来。代码现在抛出以下异常:
IllegalStateException:软件渲染不支持硬件 位图
这是我的代码:
public class PhotoDragShadowBuilder extends DragShadowBuilder {
@Override
public void onDrawShadow(Canvas canvas) {
Drawable photoDrawable = imageView.getDrawable();
photoDrawable.draw(canvas);
}
}
imageView.getDrawable()
内的位图设置了标记Bitmap.Config.HARDWARE
。这意味着位图仅存储在硬件中。 Android拒绝将Bitmap绘制到存储在堆中的画布。
此例外的负责任Android源代码如下: https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/graphics/java/android/graphics/BaseCanvas.java#532
显然,我可以第二次加载Bitmap进行拖放。但是,这对设备来说是额外的工作,需要将许多很好的解耦代码捆绑在一起。
有没有办法解决这个问题?有没有办法让Bitmap从硬件中进入堆?
答案 0 :(得分:0)
Glide网站上的Glide问题解释了发生了什么: https://github.com/bumptech/glide/issues/2309
解决方案是在Glide中禁用硬件加速: http://bumptech.github.io/glide/javadocs/431/com/bumptech/glide/request/RequestOptions.html#disallowHardwareConfig--
禁止在Downsampler中使用Bitmap.Config.HARDWARE以避免因绘制到由Bitmaps支持的Canvass而导致的错误
以下代码显示了如何禁用特定图像的硬件加速。
GlideApp.with(context)
.applyDefaultRequestOptions(new RequestOptions().disallowHardwareConfig())
.load(imageUrl)
.into(imageView);
答案 1 :(得分:0)
ANDROID O的解决方法导致错误“IllegalStateException:软件渲染不支持硬件位图”。
重新编码您的公共类GlideConfiguration扩展AppGlideModule,如下所示:
RequestOptions options = new RequestOptions();
boolean isAndroidO = (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O);
DecodeFormat format = isAndroidO ? DecodeFormat.PREFER_ARGB_8888 : DecodeFormat.PREFER_RGB_565;
options.format(format);
if (isAndroidO) options.disallowHardwareConfig();
builder.setDiskCache(new InternalCacheDiskCacheFactory(context, diskCacheSizeBytes));
builder.setDefaultRequestOptions(options);
答案 2 :(得分:-1)
免责声明:-我仍然没有得到"IllegalStateException: Software rendering doesn't support hardware bitmaps"
我通过创建一个新活动并复制代码块来解决此错误,同时还检查了添加代码后我的应用程序是否运行。
最后,我的应用程序正在运行,没有任何错误,我不明白为什么会引发此错误。