Android O:DragShadowBuilder抛出IllegalStateException:软件渲染不支持硬件位图

时间:2017-12-12 05:17:10

标签: android bitmap

我的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从硬件中进入堆?

3 个答案:

答案 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"

我通过创建一个新活动并复制代码块来解决此错误,同时还检查了添加代码后我的应用程序是否运行。

最后,我的应用程序正在运行,没有任何错误,我不明白为什么会引发此错误。