我试图从webiview捕获图像,当我尝试从Web加载Url时,它会起作用,但是当我尝试在资源中加载本地html文件或在String中加载html时,它会崩溃以下错误:
java.lang.IllegalArgumentException: width and height must be > 0
at android.graphics.Bitmap.createBitmap(Bitmap.java:638)
at android.graphics.Bitmap.createBitmap(Bitmap.java:620)
我的代码是:
//Create the webview
WebView w = new WebView(this);
w.setWebViewClient(new WebViewClient() {
public void onPageFinished(WebView view, String url) {
//get the picture from webview
Picture picture = view.capturePicture();
Bitmap b = Bitmap.createBitmap(picture.getWidth(),
picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
picture.draw(c);
FileOutputStream fos = null;
try {
String path = Environment.getExternalStorageDirectory().toString();
File dir = new File(path, "/Movel/media/img/");
if (!dir.isDirectory()) {
dir.mkdirs();
}
String arquivo = "darf_"+ System.currentTimeMillis() + ".jpg";
File file = new File(dir, arquivo);
fos = new FileOutputStream(file);
String imagePath = file.getAbsolutePath();
//scan the image so show up in album
MediaScannerConnection.scanFile(MainActivity.this, new String[] { imagePath },
null, new MediaScannerConnection.OnScanCompletedListener() {
public void onScanCompleted(String path, Uri uri) {
}
});
if (fos != null) {
b.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
setContentView(w);
String html = "<html><head><meta http-equiv='Content-Type' content='text/html; charset=ISO-8859-1'> " +
"<title>Demo Html</title> </head> <body> <H1>Testing One Two Three</H1> </body></html>";
//load from assets
//w.loadDataWithBaseURL("file:///android_asset/", Strings.converterParaElementosHTMLEspeciais(html), "text/html", "iso-8859-1", null);
//w.loadUrl("file:///android_asset/darf.html");
//w.loadUrl("https://www.google.com.br");
w.loadData(html, "text/html", "iso-8859-1");
答案 0 :(得分:2)
此错误是因为您的WebView
宽度和高度为0
,因此您必须先Layout
WebView
,然后尝试以下代码:
myWebView.setWebChromeClient(new WebChromeClient() {
@Override
public void onProgressChanged(WebView view, int newProgress) {
super.onProgressChanged(view, newProgress);
if (newProgress == 100) {
view.post(new Runnable() {
@Override
public void run() {
// take the snapshot here
}
});
}
}
});