Получение растрового изображения из 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">
Удача удачи:)