实现Android 版网页快照功能

现在一般的购物网站,在你完成交易后都会将页面拍照以免日后发生商务纠纷,而对于我们移动开发者这个传统互联网上的优秀经验也同样给了我们一些设计上的启迪,接下来我将几种实现思路写出来供大家参考。

方案一:使用WebViewClient的onPageFinished事件

我们使用WebView当做程序里的内嵌式浏览器的显示网页的时候,如果不进行特殊设置,当用户点击WebView里面的链接就会另外启动Android手机内置的浏览器,而离开当前的Activity,针对这一问题,我们可以进行自定义浏览器的客户端设置,代码如下:

  1. mWebView.setWebViewClient(new WebViewClient(){
  2. });

在setWebViewClient()的内容时,我们可以重写onPageFinished()来捕捉WebView加载完毕的事件,关键代码如下:

  1. /* WebView取得WebSettings */
  2. WebSettings webSettings = wView.getSettings();
  3. /* 设置能运行JavaScript */
  4. webSettings.setJavaScriptEnabled(true);
  5. /*  */
  6. /*  */
  7. /* WebView设置WebViewClient */
  8. wView.setWebViewClient(new WebViewClient(){
  9. @Override
  10. public void onPageFinished(WebView view, String url) {
  11. /* 获取画面 */
  12. Picture picture = view.capturePicture();
  13. ByteArrayOutputStream baos = new ByteArrayOutputStream();
  14. /* 获取宽高 */
  15. int width = picture.getWidth();
  16. int height = picture.getHeight();
  17. if (width > 0 && height > 0) {
  18. Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
  19. Canvas canvas = new Canvas(bitmap);
  20. picture.draw(canvas);
  21. bitmap.compress(Bitmap.CompressFormat.JPEG, 90, baos);
  22. FileOutputStream fos = null;
  23. try {
  24. if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
  25. fos = new FileOutputStream(Environment.getExternalStorageDirectory());
  26. if (fos!=null) {
  27. bitmap.compress(Bitmap.CompressFormat.JPEG, 90, fos);
  28. fos.close();
  29. Toast.makeText(ATestActivity.this, "快照保存成功",Toast.LENGTH_LONG).show();
  30. }
  31. }
  32. } catch (Exception e) {
  33. e.printStackTrace();
  34. }
  35. }
  36. super.onPageFinished(view, url);
  37. }
  38. });

方案二:

使用View的 Bitmap  getDrawingCached(boolean autoScale)方法实现,不过要注意的是cache
先要通过setDrawingCacheEnable方法把cache开启,然后再调用getDrawingCache方法就可以获得view的
cache图片了。buildDrawingCache方法可以不用调用,因为调用getDrawingCache方法时,若果
cache没有建立,系统会自动调用buildDrawingCache方法生成cache。若果要更新cache,
必须要调用destoryDrawingCache方法把旧的cache销毁,才能建立新的。
当调用setDrawingCacheEnabled方法设置为false, 系统也会自动把原来的cache销毁。
   ViewGroup在绘制子view时,而外提供了两个方法
   void setChildrenDrawingCacheEnabled(boolean enabled)
   setChildrenDrawnWithCacheEnabled(boolean enabled)
 
 setChildrenDrawingCacheEnabled方法可以使viewgroup里所有的子view开启cache,
setChildrenDrawnWithCacheEnabled使在绘制子view时,若该子view开启了cache,
则使用它的cache进行绘制,从而节省绘制时间。
   获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理,通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。

  1. public static Bitmap convertViewToBitmap(View view){
  2. view.buildDrawingCache();
  3.     Bitmap bitmap = view.getDrawingCache();
  4.     return bitmap;
  5. }

一般情况下,直接使用上面方法是能够正常的工作。但有时候,生成Bitmap会出现问题(Bitmap全黑色)。主要原因是drawingCache的值大于系统给定的值。我们可以看一下buildDrawingCache()方法中的一段代码:

  1. if (width <= 0 || height <= 0 ||(width * height * (opaque && !translucentWindow ? 2 : 4) > ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize())) {
  2. destroyDrawingCache();
  3. return;
  4. }

上面的代码中,width和height是所要cache的view绘制的宽度和高度,所以(width * height * (opaque
&& !translucentWindow ? 2 : 4)
计算的是当前所需要的cache大小。
ViewConfiguration.get(mContext).getScaledMaximumDrawingCacheSize()得到的是系统
所提供的最大的DrawingCache的值。当所需要的drawingCache
>系统所提供的最大DrawingCache值时,生成Bitmap就会出现问题,此时获取的Bitmap就为null。

所以在只需要修改所需的cache值就可以解决问题了。代码实现如下:

    1. public static Bitmap convertViewToBitmap(View view){
    2.    view.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
    3. view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
    4. view.buildDrawingCache();
    5. Bitmap bitmap = view.getDrawingCache();
    6.      return bitmap;
    7. }
时间: 2024-10-29 02:52:39

实现Android 版网页快照功能的相关文章

MingQQ Android版发布了,可以在Android手机上登录你的QQ,收发消息哦...

最近为了学习Android开发,特意将原来写的MingQQ Windows版移植到了Android上面,以此练手.通过这次练习,学习到了不少Android开发的相关知识,特别是界面开发部分. MingQQ的界面模仿了Android QQ的基本功能,虽然体验性完全比不上QQ,但目前技术有限,只能做到现在这水平了,更好的界面用户体验留待以后再提升吧. 下拉刷新目前使用了第三方开源库Android-PullToRefresh,以后再考虑替换成自己写的下拉刷新组件,并增加消息列表的右滑删除功能. 发布的

从零开始开发Android版2048 (五) 撤销的实现

本篇的内容是,在前一篇的基础上加入了撤销的功能.撤销其实就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和对应的数字记录下来,当然还有分数,把这些数据写入一个栈中,然后点击撤销操作的时候,将栈顶pop掉,读取下一个栈中的对象,并根据对象中存储的数据重新绘制界面. 下面是我用于存储每次界面情况的类,在这个类中保存了界面中主要的三个数据,空白格.数字格和当前的分数. package com.example.t2048; import java.util.

使用Fiddler分析Android版API

使用Fiddler分析Android版API 首先要准备的工具: android手机+知乎日报APP: Fiddler(大名鼎鼎Telerik出的,Telerik): 局域网. 原理很简单,打开Fiddler,将它设置成为一个代理,然后将同一局域网中的Android手机代理设置为Fiddler所在的电脑. 之后Android手机所有的HTTP请求都会先经过代理(Fiddler所在的电脑),Fiddler当然也能捕获到请求的各种数据.(注意如果捕获的回话过多,请通过Fiddler右侧的Filter

cordova百度地图定位Android版插件

本插件利用百度地图提供的定位功能进行Android版手机定位. 为什么没有iOS版? 因为iOS版有官方的定位插件cordova-plugin-geolocation可以使用. 请参照:cordova-plugin-geolocation Android版为什么不使用官方的cordova-plugin-geolocation插件 最新版的插件已经删除掉的Android版定位的代码,改为基于系统浏览器(chrome内核)进行定位. 为什么这样做,也有人问过同样的问题,作者的回答是这样比原生定位更快

Android版微信小代码(转)

以下代码仅适用于Android版微信: //switchtabpos:让微信tab更贴合Android Design 如果你并不喜欢微信Android版和iOS端同用一套UI,现在有一个小方法可以实现Tab的转移:在微信任意聊天窗口输入//switchtabpos并按发送,Tab就会从转移到屏幕顶端,Android范十足.如果想再调整回来,再输入一遍并发送就好了. //multiwebview:将微信聊天页和文章页拆分为两个任务卡片 在任意聊天窗口输入//multiwebview并发送,聊天和文

Android版xx助手之天天酷跑外挂详细分析

Android版xx助手之天天酷跑外挂详细分析 图/文      莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也开始火了起来,这更是改变了人们长久以来的游戏娱乐习惯.茶余饭后,小伙伴们掏出"家伙"打个飞机已是习以为常的事情了.加之移动客户端游戏开发周期短,投入少等特点,很多初创公司也纷纷投入到这个领域中来,并且很多游戏都取得了不错的成绩.就在前不久,全球游戏巨头暴雪的新游戏<炉石传说>也推

Android版的SweetAlert,清新文艺,快意灵动的甜心弹框

Android版的SweetAlert,清新文艺,快意灵动的甜心弹框 使用服务:其他        功能分类:其他     支持平台:Android 运行环境:Eclipse    开发语言:Java     开发工具:Eclipse 下载地址:http://sina.lt/zVe 源码简介 Android版的SweetAlert,清新文艺,快意灵动的甜心弹框,使用Eclipse导入即可! 运行动态图

安全狗服云Android版 V2.0新版发布 统计分析和安全防护报告

2015年2月11日,安全狗服云Android版V2.0华丽登场,目前也已经上架各大手机应用市场,同时用户朋友们可到官网http://fuyun.safedog.cn/client.html 直接下载或扫描二维码就可以轻松安装,该版主要新增了主机面板.统计分析与安全防护报告功能.不受时间地点限制随时了解掌握所有服务器安全和异常状况,还能对服务器进行远程管理,动动手指就能轻松管理服务器,服务器安全设置.网站安全设置等,一切不是问题,你也能做个安静的美男子! 安全狗服云,是安全狗自主研发推出的服务器

Android版xx助手之天天酷跑外挂具体分析

Android版xx助手之天天酷跑外挂具体分析 图/文      莫灰灰 背景 近些年来,移动互联网的大肆崛起,潜移默化中影响着人们的生活和工作习惯.当腾讯的微信平台接入手机游戏之后,移动端的游戏也開始火了起来,这更是改变了人们长久以来的游戏娱乐习惯.茶余饭后,小伙伴们掏出"家伙"打个飞机已是习以为常的事情了.加之移动client游戏开发周期短,投入少等特点,非常多初创公司也纷纷投入到这个领域中来,而且非常多游戏都取得了不错的成绩.就在前不久,全球游戏巨头暴雪的新游戏<炉石传说&