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

У меня есть пользовательский WebView и я хочу получить растровое изображение его содержимого (включенное 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(); } в while(webView.canZoomOut()){ webView.zoomOut(); } 

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

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

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

Я включил

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

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

Быстрая починка:-

Установите 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"> 

Удачи удачи 🙂