我试图在webview中以编程方式获得整个屏幕截图。当我测试我的代码时,它返回一个白屏
我试过不同的代码,但我不能完成它。有时返回白屏,有时返回黑屏。我还添加了清单互联网权限,并编写了外部存储权限。我的xml文件只存在于webview中。
我也试过"睡"五秒钟,但它不起作用。
public static Bitmap loadBitmapFromView(WebView v, int width, int height)
{
Bitmap b = Bitmap.createBitmap(width , height, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
v.layout(0, 0, v.getLayoutParams().width, v.getLayoutParams().height);
v.draw(c);
FileOutputStream fos = null;
try
{
fos = new FileOutputStream("/sdcard/image.jpg" );
}
catch (FileNotFoundException e1)
{
// TODO Auto-generated catch block
e1.printStackTrace();
}
b.compress(Bitmap.CompressFormat.JPEG, 90, fos);
try
{
fos.close();
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return b;
}
我在onpageFinished()
中调用这个方法。通过loadBitmapFromView(webView, webView.getWidth(), webView.getHeight());
,我确保加载整个页面。在我看来,当webview在调用之前没有加载时,它会尝试获取屏幕截图。但我在onpageFinished()
方法中调用它。当webview加载完成时,它会运行。
Other parts of my code
public class Wv extends Activity
{
private static WebView webView;
CustomWebViewClient webViewClient;
ProgressDialog mProgressDialog;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView1);
mProgressDialog = new ProgressDialog(this);
mProgressDialog.setMessage("Loading...");
webView.loadUrl("file:///sdcard/ZipDemo/HTML_Friday.html");
webViewClient = new CustomWebViewClient();
webView.setWebViewClient(webViewClient);
}
private class CustomWebViewClient extends WebViewClient
{
public void onPageStarted(WebView view, String url, Bitmap favicon) {
super.onPageStarted(view, url, favicon);
if(!mProgressDialog.isShowing())
{
mProgressDialog.show();
}
}
@Override
public void onPageFinished(WebView view, String url) {
super.onPageFinished(view, url);
if(mProgressDialog.isShowing()){
mProgressDialog.dismiss();
}
loadBitmapFromView(webView,webView.getWidth(),webView.getHeight());
}
}
是否启用了视图的DrawingCache?
public static Bitmap getBitmapFromView(View view) {
try {
view.setDrawingCacheEnabled(true);
view.buildDrawingCache(true);
Bitmap bitmap = Bitmap.createBitmap(view.getDrawingCache());
view.setDrawingCacheEnabled(false); // clear drawing cache
return bitmap;
} catch (Exception e) {
e.printStackTrace();
return null;
}
}
你应该在View的post-method中使用它:(http://developer.android.com/reference/android/view/View.html#post(java.lang.Runnable))
view.post(new Runnable() {
@Override
public void run() {
}
});
通过删除CustomWebViewClient类并创建新的button.onPageFinished()方法来解决问题。当我创建按钮时,问题就解决了。这是代码
public class Wv extends Activity
{
private WebView webView;
private Button screenShot;
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webView1);
screenShot=(Button) findViewById(R.id.button_screenshot);
webView.getSettings().setJavaScriptEnabled(true);
webView.getSettings().setLoadWithOverviewMode(true);
webView.getSettings().setUseWideViewPort(true);
webView.loadUrl("file:///android_asset/HTML_Friday.html");
screenShot.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Picture picture = webView.capturePicture();
Bitmap b = Bitmap.createBitmap(picture.getWidth(),picture.getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
File screen = new File(Environment.getExternalStorageDirectory()
.toString(), "tt12.jpg");
if (screen.exists())
screen.delete();
picture.draw(c);
FileOutputStream fos = null;
try {
fos = new FileOutputStream(screen);
if (fos != null) {
b.compress(Bitmap.CompressFormat.JPEG, 90, fos);
fos.close();
}
} catch (Exception e) {
e.getMessage();
}
}
});
}
}