【问题标题】:Android O: DragShadowBuilder throws IllegalStateException: Software rendering doesn't support hardware bitmapsAndroid O:DragShadowBuilder 抛出 IllegalStateException:软件渲染不支持硬件位图
【发布时间】:2019-10-22 14:44:40
【问题描述】:

我的 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

显然,我可以再次加载位图以进行拖放。但是,这对设备来说是额外的工作,而且需要将大量解耦的代码捆绑在一起。

有没有办法解决这个问题?有没有办法将位图从硬件中取出并放入堆中?

【问题讨论】:

    标签: android bitmap


    【解决方案1】:

    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);
    

    【讨论】:

      【解决方案2】:

      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);
      

      【讨论】:

        【解决方案3】:

        免责声明:- 我没有在这个活动中使用滑翔,但我得到了"IllegalStateException: Software rendering doesn't support hardware bitmaps"

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

        最后,我的应用程序运行没有任何错误,但我不明白为什么会抛出这个错误。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-01-10
          • 1970-01-01
          相关资源
          最近更新 更多