Android WebView实现长按保存图片及长按识别二维码功能

先来简单说一下本文所要实现的功能:用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能。同时识别图片是否是二维码,如果是则在弹框中追加识别二维码功能。

细节上:保存图片的弹框要显示在手指长按的位置;选择图片保存后,可以让用户直接去相册查看;选择识别二维码,判断是是不是网址,是的话可以让用户选择复制或访问,否则可以让用户选择复制或搜索。

然后再来看一下效果图:

保存图片

save.gif

识别包含普通文字的二维码:

text.gif

识别包含网址的二维码:

code.gif

上述功能所用到的类和库:

  • 获得长按内容: WebView.HitTestResult
  • 弹框列表: DialogFragment
  • 图片下载: Glide
  • 二维码识别: Zxing

实现要点

记录长按位置

继承 WebView 记录触摸位置:

@Override
 public boolean onInterceptTouchEvent(MotionEvent event) {
  touchX = (int) event.getRawX();
  touchY = (int) event.getRawY();
  return super.onInterceptTouchEvent(event);
 }

弹框我选择 DialogFragment 而不是 poupwindow 的原因是 poupwindow 的显示通常需要依托另一个View,而且在7.0以上有兼容问题。

判断长按位置的内容类型是否是图片:

获取图片信息

setOnLongClickListener(new View.OnLongClickListener() {

   public boolean onLongClick(View v) {
    WebView.HitTestResult result = getHitTestResult();
    if (null == result)
     return false;
    int type = result.getType();
    switch (type) {
     case WebView.HitTestResult.EDIT_TEXT_TYPE: // 选中的文字类型
      break;
     case WebView.HitTestResult.PHONE_TYPE: // 处理拨号
      break;
     case WebView.HitTestResult.EMAIL_TYPE: // 处理Email
      break;
     case WebView.HitTestResult.GEO_TYPE: //  地图类型
      break;
     case WebView.HitTestResult.SRC_ANCHOR_TYPE: // 超链接
      break;
     case WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE: // 带有链接的图片类型
     case WebView.HitTestResult.IMAGE_TYPE: // 处理长按图片的菜单项
      String url = result.getExtra();
      if (mOnSelectItemListener != null && url != null && URLUtil.isValidUrl(url))       mOnSelectItemListener.onSelected(touchX, touchY, result.getType(), url);
      }
      return true;
     case WebView.HitTestResult.UNKNOWN_TYPE: //未知
      break;
    }
    return false;
   }
  });

在手指长按位置处弹出弹框

HitTestResult 是一个实体类,只记录两个信息:当选选择内容的类型和内容的具体值。可以看到通过 WebView.HitTestResult ,我们可以获得除了图片外的很多内容类型。当然这里我们只需要判断是否是图片就好了,然后将长按位置和url一起回调给外层。在手指长按处显示弹框,主要就是 DialogFragment 显示位置的设定了:

public void onStart() {
  super.onStart();
  Dialog dialog = getDialog();
  if (dialog != null) {
   Window window = dialog.getWindow();
   if (window != null) {
    WindowManager.LayoutParams lp = window.getAttributes();
    window.setGravity(Gravity.LEFT | Gravity.TOP);
    lp.x = LocationX;//横坐标位置
    lp.y = LocationY;//纵坐标位置
    lp.width = UIHelper.dip2px(100);
    lp.dimAmount = 0.0f;//外层背景透明,默认变暗
    lp.width = ViewGroup.LayoutParams.WRAP_CONTENT;
    lp.height = ViewGroup.LayoutParams.WRAP_CONTENT;
    window.setAttributes(lp);
    window.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));//内部背景透明
   }
  }
 }

保存到相册

利用 Glide 下载图片, Glide 自带预加载和图片缓存功能,不需要每次都从网络中下载:

GlideApp.with(appContext).asFile().load(url).submit().get();

可以在长按识别出图片的时候就行预加载:

GlideApp.with(appContext).asBitmap().load(url).preload();

将图片保存在相册:

public static void displayToGallery(Context context, File photoFile) {
  if (photoFile == null || !photoFile.exists()) {
   return;
  }
  String photoPath = photoFile.getAbsolutePath();
  String photoName = photoFile.getName();
  // 把文件插入到系统图库
  try {
   ContentResolver contentResolver = context.getContentResolver();
   MediaStore.Images.Media.insertImage(contentResolver, photoPath, photoName, null);
  } catch (FileNotFoundException e) {
   e.printStackTrace();
  }
  // 最后通知图库更新
  context.sendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE, Uri.parse("file://" + photoPath)));
 }

识别图片中的二维码

显示弹框的同时还要判断图片是否包含二维码,这部分就是 Zxing 自带的功能,所以代码就不贴了。注意不应该等是 Zxing 判断是不是二维码后再显示弹框,因为这部分操作耗时可能比较长(见图二)。应当在识别二维码内容后再去更新弹框列表的内容。

总结

总体来说这个功能实现注意的地方还是挺多的,好在都不复杂。当然本例还存在待优化的地方,以及实现更高级的功能,比如以图搜图,查看大图功能,也可以利用 WebView.HitTestResult 对获取到其他类型的内容进行处理,限于篇幅就不再展开了。

最后贴下本项目github地址,对 WebView 感兴趣的可以了解下:

github

总结

以上所述是小编给大家介绍的Android WebView实现长按保存图片及长按识别二维码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!

您可能感兴趣的文章:

  • Android webview转PDF的方法示例
  • Android 保存WebView中的图片示例
  • Android 中WebView 截图的实现方式
  • Android点击WebView实现图片缩放及滑动浏览效果
  • Android WebView中图片浏览及缩放效果
  • android中webview定位问题示例详解
  • 实例详解Android Webview拦截ajax请求
  • Android自定义webView头部进度加载效果
  • Android中WebView的基本配置与填坑记录大全
  • Android用webView包装WebAPP方法
(0)

相关推荐

  • Android 保存WebView中的图片示例

    前言 项目中有需求在APP的Webview中长按图片可以保存.后来就去研究一下该怎么实现,顺便整理了一下. WebView基本配置 mWvContent.getSettings().setJavaScriptEnabled(true); mWvContent.getSettings().setJavaScriptCanOpenWindowsAutomatically(true); mWvContent.getSettings().setDomStorageEnabled(false); mWvC

  • Android点击WebView实现图片缩放及滑动浏览效果

    最近做的项目有一个要求,就是在WebView中显示的html,需要在点击其中的图片时进行放大,并进行缩放和滑动 浏览,我第一想到的是这是和js进行交互的事情,但是怎么获取html中图片的url,并保存起来进行显示,我就不知道 了,所以去查了下资料,最后找到了解决的办法: 博客地址:Android WebView中图片浏览及缩放效果 首先说一下处理这个要求的思路,首先我们要获取到html中的所有图片的url,并保存到集合中,当点击图片时,跳转 一个Activity用ViewPager进行显示,这样

  • Android webview转PDF的方法示例

    1.网上找了好多没有显示出来效果不错,后来看到调用手机打印预览,看了效果还不错,就打算使用系统打印服务预览下载 2.'webView.createPrintDocumentAdapter()'得到打印的PrintDocumentAdapter有了该类就可以使用onWrite方法写入制定的文件,但是这个方法需要传入回调这个悲剧的是这个回调方法是hiden的我们没办法调用 3,字怎么解决呢,有连个方法 3.1 使用此开源库替换自己的sdk 中的android.jar文件,就可以使用了 https:/

  • Android 中WebView 截图的实现方式

    Hybrid App 中网页部分的分享方式越来越趋向于多元化,比较常见的用户操作方式有:复制网页链接式,直接选择目标应用自动分享式等.其中,截图行为,越来越成为丰富用户操作.备受用户喜爱的互动方式之一,我们在很多内容社区类应用中都能看到这种功能.这篇文章总结一下 Android 应用中 WebView 截图的实现方式. WebView 作为一种特殊的控件,自然不能像其他系统 View 或者截屏的方式来获取截图(多为截取长图).如: public static Bitmap getScreenSh

  • Android自定义webView头部进度加载效果

    不多说先来看下效果图: 1. 颜色渐变加载进度条(夜神模拟器) 绿色加载进度条(魅蓝note2) 看图说话: 上图是不是加载网页的时候会有一个进度条在横向加载,比以前网速不好的时候是一片空白给人的感觉友好多了是不,然后效果还不错. 实现思路 就是自己画一条进度线(大家应该都会吧)然后加载到WebView的上面,开始进度条是隐藏的,进度线初始值为1,然后为了效果好一点,初始少于10的进度都让它加载到10的位置,等进度到100的时候0.2秒后隐藏. 请记得添加网络权限: <uses-permissi

  • android中webview定位问题示例详解

    前言 现在很多App里都内置了Web网页(Hyprid App),比如说很多电商平台,淘宝.京东.聚划算等等 京东首页 那么这种该如何实现呢?其实这是Android里一个叫WebView的组件实现的. 最近在做安卓的网页开发.有一个页面需要用到定位,但是一直定位获取失败.很难过.网上教程也很多,但是无一例外全部失败.最后老夫花了3天时间,呕心沥血,终于研制出了解决方案. 三步走战略: 一.获取权限 android 6.0 以后,需要动态的获取位置或者存储权限,按照各自的爱好放置位置.我是应用开启

  • 实例详解Android Webview拦截ajax请求

    Android Webview虽然提供了页面加载及资源请求的钩子,但是对于h5的ajax请求并没有提供干涉的接口,这意味着我们不能在webview中干涉javascript发起的http请求,而有时候我们确实需要能够截获ajax请求并实现一些功能如:统一的网络请求管理.cookie同步.证书校验.访问控制等. 思路 虽然在 Webview中无法直接拦截 ajax请求(其实在shouldInterceptRequest 中是可以收到ajax请求的,但是遗憾的是取不到请求参数,这样也是没有意义的),

  • Android用webView包装WebAPP方法

    前言 Android webView 兼容体验真的差到了极点!! 前一阵子,老板要将 WebAPP 放到 Android 和 iOS 里面,而我因为以前做过安卓,所以这方面就由我来打包,原理是很简单的,就是打开 APP 的时候用 webView 加载网站的网址,这样服务器一次更新,就能更新微信版, iOS 版和 Android 版; 首先我要说一句,如果你的 WebAPP 里面有文件上传,并且想要完全兼容,那么就别用原生的 WebAPP, 后面我会写一个关于 crossWalk 的博客,不过在此

  • Android中WebView的基本配置与填坑记录大全

    前言 在应用程序开发过程中,经常会采用webview来展现某些界面,这样就可以不受发布版本控制,实时更新,遇到问题可以快速修复. 但是在Android开发中,由于Android版本分化严重,每一个版本针对webview都有部分更改,因此在开发过程中会遇到各种各样的坑,下面这篇就来给大家介绍关于Android中WebView的基本配置与填坑记录,话不多说了,来一起看看详细的介绍吧. 基本配置 // 硬件加速 getActivity().getWindow().setFlags( WindowMan

  • Android WebView中图片浏览及缩放效果

    本文实例为大家分享了Android WebView图片浏览及缩放效果展示的具体代码,供大家参考,具体内容如下 此工程用到了两个开源库: PhotoView支持图片的缩放 Android-Universal-Image-Loader图片的异步加载 (android studio)将两个源工程中的library文件夹导入到Demo Module所在的Project中,修改各自的build.gradle文件,让里面的版本号.所用的android包等与Demo Module相同即可.大致如图: 源代码:

随机推荐