Получение растрового изображения из WebView приводит к сбою OutOfMemory

У меня есть пользовательский WebView, и я хочу получить растровое изображение его содержимого (включая скрытый экран). Я использовал этот код, который я получил от здесь:

 public static Bitmap getBitmapFromWebviewV2(WebView webView) {
    webView.measure(View.MeasureSpec.makeMeasureSpec(
        View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
        View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
    webView.layout(0, 0, webView.getMeasuredWidth(),
            webView.getMeasuredHeight());
    webView.setDrawingCacheEnabled(true);
    webView.buildDrawingCache();
    Bitmap bm = Bitmap.createBitmap(webView.getMeasuredWidth(),
            webView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

    Canvas bigcanvas = new Canvas(bm);
    Paint paint = new Paint();
    int iHeight = bm.getHeight();
    bigcanvas.drawBitmap(bm, 0, iHeight, paint);
    webView.draw(bigcanvas);
    return bm;
}

Он работает отлично до такой степени, когда я увеличиваю масштаб, и в этом случае я получаю OutOfMemory Crash. Я проверил это с одним и тем же изображением (слегка увеличенным и увеличенным до максимального), и он ведет себя так же, как я упоминал выше.

Я попытался противостоять этому, добавив

while(webView.canZoomOut()){
      webView.zoomOut();
}

в начале, но это совсем не помогает.

Ответ 1

Хорошо, я взломал это. Проблема действительно заключалась в том, что функция вернула wa Bitmap до того, как процедура масштабирования закончилась, поэтому мне пришлось ее задержать.

Я включил

Handler handler = new Handler();
        handler.postDelayed(new Runnable() {
            @Override
            public void run() {
                //bulk of my code
            }
        }, 1000);

которые вынуждены изменить структуру функции от public Bitmap до public void. Здесь прямая ссылка. Несмотря на некоторые незначительные хитрости, которые мне все еще нужно исправить, подход работает как шарм

Ответ 2

Быстрое исправление: -

Задайте android: largeHeap = "true" в файле AndroidManifest.xml.

<application
    android:name="yourapplication"
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher_rounded"
    android:label="@string/app_name"
    android:largeHeap="true"
    android:roundIcon="@mipmap/ic_launcher_rounded"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">

Удача удачи:)