怎么在Android中使用WebView实现截图分享功能

发布时间:2021-05-17 17:10:19 作者:Leah
来源:亿速云 阅读:281

今天就跟大家聊聊有关怎么在Android中使用WebView实现截图分享功能,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

1.通过android SDK自带的Canvas方法进行绘制。 

2.通过webView实现客户端与H5交互,然后将H5界面做截图处理。

本文主要介绍第二种方式的实现过程,第一种方式的实现方法,后续有时间会在博客中做说明,下面开始本文内容。
首先确定我们要实现的逻辑:

1.客户端与H5的交互,客户端将用户信息(用户名、Uid、用户头像等)发送给H5;

2.客户端截取WebView功能的实现;

3.分享功能的添加。

1.客户端与H5交互

在界面布局中添加webView布局,对WebView布局进行初始化操作(此处需要网络权限,不做单独处理)

wv_imgweb = (WebView) findViewById(R.id.h6_wv_imgweb);

WebSettings webSettings = wv_imgweb.getSettings();
//此处可更加具体的H5界面功能进行相应的WebSettings设置,本文只是演示基本效果
  webSettings.setJavaScriptEnabled(true);
  webSettings.setSupportZoom(false); 
  wv_imgweb.requestFocusFromTouch();
  wv_imgweb.setDrawingCacheEnabled(true);
  wv_imgweb.setVerticalScrollBarEnabled(false);
  wv_imgweb.setHorizontalScrollBarEnabled(false);
  wv_imgweb.setVerticalScrollbarOverlay(false);
  wv_imgweb.setHorizontalScrollbarOverlay(false);
  wv_imgweb.setWebViewClient(new WebViewClient() {
   @Override
   public boolean shouldOverrideUrlLoading(WebView view, String url) {
    view.loadUrl(url);
    return true;
   }

   @Override
   public void onPageFinished(WebView view, String url) {
    super.onPageFinished(view, url);
    //加载逻辑的处理
   }

   @Override
   public void onPageStarted(WebView view, String url, Bitmap favicon) {
    super.onPageStarted(view, url, favicon);
    //加载逻辑的处理
   }
  });

//添加用户信息参数,加载H5分享地址
wv_imgweb.loadUrl(h6_url);

2.截图功能的实现

上文中的WebView页面加载完成后,即可调用截图功能,并将图片保存在本地指定文件夹(此处需要存储权限,不做单独处理)
android中WebView可以通过多种方式实现截图,下面分别做不同介绍:

2.1截取屏幕内内容

第一种方式是通过Bitmap bitmap = webView.getDrawingCache()截取屏幕内显示内容,注意调用此方法setDrawingCacheEnabled(true)必须设置为true;

2.2截取整个WebView内容

第二种方式是通过Picture snapShot = wv_imgweb.capturePicture()来截取整个WebView的内容

Picture snapShot = wv_imgweb.capturePicture();
if (snapShot != null && snapShot.getWidth() > 0 && snapShot.getHeight() > 0) {
  Bitmap bitmap = Bitmap.createBitmap(snapShot.getWidth(), snapShot.getHeight(), Bitmap.Config.ARGB_8888);//设置相应的图片质量
  Canvas canvas = new Canvas(bitmap);
  snapShot.draw(canvas);
//将截取的图片保存到本地
try {
  File appFile = new File(Environment.getExternalStorageDirectory() + "/testpic/app");
  if (!appFile.exists() && !appFile.isDirectory()) {
   appFile.mkdirs();
  }
  String fileName = Environment.getExternalStorageDirectory().getPath() + "/testpic/app/share.jpg";
  FileOutputStream fos = new FileOutputStream(fileName);
  //设置保存本地图片质量
  bitmap.compress(Bitmap.CompressFormat.JPEG, 70, fos);
  fos.close();
  } catch (Exception e) {
   UIUtils.setLogInfo("eee", e.getMessage());
  }
}

2.3截取整个WebView内容

Android 为了提高各方面的绘制速度(如滚动操作),为每一个 View 建立一个缓存,使用 View.buildDrawingCache 为自己的 View 建立相应的缓存, 这个 cache 就是一个 bitmap 对象。利用这个功能可以对整个屏幕视图进行截屏并生成 Bitmap ,也可以获得指定的 View 的 Bitmap 对象。

wv_imgweb.measure(View.MeasureSpec.makeMeasureSpec(View.MeasureSpec.UNSPECIFIED, View.MeasureSpec.UNSPECIFIED),
    View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED));
  wv_imgweb.layout(0, 0, wv_imgweb.getMeasuredWidth(), wv_imgweb.getMeasuredHeight());
  wv_imgweb.setDrawingCacheEnabled(true);
  wv_imgweb.buildDrawingCache();
  Bitmap longImage = Bitmap.createBitmap(wv_imgweb.getMeasuredWidth(),
    wv_imgweb.getMeasuredHeight(), Bitmap.Config.ARGB_8888);

  Canvas canvas = new Canvas(longImage); // 画布的宽高和 WebView 保持一致
  Paint paint = new Paint();
  canvas.drawBitmap(longImage, 0, wv_imgweb.getMeasuredHeight(), paint);
  wv_imgweb.draw(canvas);
  //将截取的图片保存到本地
  try {
   File appFile = new File(Environment.getExternalStorageDirectory() + "/testpic/app");
   if (!appFile.exists() && !appFile.isDirectory()) {
    appFile.mkdirs();
   }
   String fileName = Environment.getExternalStorageDirectory().getPath() + "/testpic/app/share.jpg";
   FileOutputStream fos = new FileOutputStream(fileName);
   longImage.compress(Bitmap.CompressFormat.JPEG, 70, fos);
   fos.close();
  } catch (Exception e) {
   UIUtils.setLogInfo("eee", e.getMessage());
  }

问题:在5.0+上会发现,截取的快照只显示了webview中显示出来的那部分,没有显示出来的部分是空白的。通过google找到了原因,在5.0+版本上,Android对webview做了优化,旨在减少内存占用以提高性能。因此在默认情况下会智能的绘制html中需要绘制的部分,其实就是当前屏幕展示的html内容,因此会出现未显示的图像是空白的。解决办法是调用enableSlowWholeDocumentDraw()方法。这个方法需要在webview创建之前调用,在Activity里就是在setContentView前去调用,此方法会有显著的性能开销。

Android是什么

Android是一种基于Linux内核的自由及开放源代码的操作系统,主要使用于移动设备,如智能手机和平板电脑,由美国Google公司和开放手机联盟领导及开发。

看完上述内容,你们对怎么在Android中使用WebView实现截图分享功能有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。

推荐阅读:
  1. android webView截图的4种方法
  2. Android控件WebView实现完整截图

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

android webview

上一篇:在Android中使用webview时需要注意哪些事项

下一篇:如何在SpringBoot中使用动态定时器

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》