I have a custom WebView and I want to get a bitmap of its content (offscreen included). I used this code, which I got from here:
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;
}
It works fine up to the point when I zoom in a lot, in which case I get OutOfMemory Crash. I tested this with the same picture (slightly zoomed and zoomed to the max) and it behaves in the same way I mentioned above.
I tried to counter this by adding
while(webView.canZoomOut()){
webView.zoomOut();
}
at the start, but it doesn't help at all.
Okay, I've cracked this one meself. The problem indeed was in the fact that the function returned the Bitmap waay before the zooming out procedure was over, so I had to delay it.
I incorporated
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
//bulk of my code
}
}, 1000);
which forced to change the structure of the function from public Bitmap to public void. Here's directly related thread. Despite some minor tweaks I still need to fix, the approach works like a charm
Quick fix:-
Set android:largeHeap="true" in your AndroidManifest.xml file.
<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">
Gud luck :)
来源:https://stackoverflow.com/questions/45588882/getting-bitmap-from-webview-generates-outofmemory-crash