热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

本文要使用AndroidWebView实现长按保存图片及长按识别二维码功能,当用户在浏览网页的时候,长按某一区域,识别如果是图片,则弹出弹框,出现保存图片的功能

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

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

然后再来看一下效果图:

保存图片


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 LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文探讨了如何在不重新加载URL的情况下,触发WebView的PictureListener.onNewPicture()方法,以实现页面的重新绘制或渲染。 ... [详细]
  • 解决微信电脑版无法刷朋友圈问题:使用安卓远程投屏方案
    在工作期间想要浏览微信和朋友圈却不太方便?虽然微信电脑版目前不支持直接刷朋友圈,但通过远程投屏技术,可以轻松实现在电脑上操作安卓设备的功能。 ... [详细]
  • 本文详细介绍如何使用CSS自定义HTML5视频播放器的样式,涵盖常见属性及跨浏览器兼容性问题。发布时间:2020-09-14 14:46:29;来源:亿速云;阅读量:58;作者:小新。 ... [详细]
  • 本文回顾了2017年的转型和2018年的收获,分享了几家知名互联网公司提供的工作机会及面试体验。 ... [详细]
  • 本文详细介绍了如何在Android 4.4及以上版本中配置WebView以实现内容的自动高度调整和屏幕适配,确保中文显示正常,并提供代码示例。 ... [详细]
  • Web App vs Native App:未来的移动应用趋势
    随着移动互联网的发展,Web App和Native App之间的竞争日益激烈。对于开发者而言,选择哪一种技术路径更为明智?本文将深入探讨两种应用模式的特点及未来趋势。 ... [详细]
  • 作为一名在大型手机游戏公司工作的程序员,尽管主要负责游戏逻辑和内容的开发,但对iOS底层开发接触较少。现在有了iPhone和可以虚拟MAC环境的电脑,希望能找到有效的iOS开发学习路径。 ... [详细]
  • 本文详细介绍了如何在Android应用中处理和使用Cookie,包括登录时获取Cookie并将其存储,以及在WebView中同步这些Cookie以保持用户会话。 ... [详细]
  • 本文探讨了在安卓设备上的微信H5环境中,如何解决长按图片时无法保存或分享Base64编码图片及Blob形式图片的问题,并提供了有效的解决方案。 ... [详细]
  • 本文总结了2018年的关键成就,包括职业变动、购车、考取驾照等重要事件,并分享了读书、工作、家庭和朋友方面的感悟。同时,展望2019年,制定了健康、软实力提升和技术学习的具体目标。 ... [详细]
  • Linux 系统启动故障排除指南:MBR 和 GRUB 问题
    本文详细介绍了 Linux 系统启动过程中常见的 MBR 扇区和 GRUB 引导程序故障及其解决方案,涵盖从备份、模拟故障到恢复的具体步骤。 ... [详细]
  • 本文介绍了如何使用jQuery根据元素的类型(如复选框)和标签名(如段落)来获取DOM对象。这有助于更高效地操作网页中的特定元素。 ... [详细]
  • 本文将详细介绍如何使用剪映应用中的镜像功能,帮助用户轻松实现视频的镜像效果。通过简单的步骤,您可以快速掌握这一实用技巧。 ... [详细]
author-avatar
感动宇宙coolboy_796
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有