android webview长按识别图片 ,利用zxing识别图片是否是二维码

主要实现webwiew的OnLongClick()方法 ,利用

final HitTestResult htr = getHitTestResult();//获取所点击的内容
判断点击的是不是图片 ,其主要代码是:

@Override
	public boolean onLongClick(View v) {
		// 长按事件监听(注意:需要实现LongClickCallBack接口并传入对象)
		final HitTestResult htr = getHitTestResult();//获取所点击的内容
		if (htr.getType() == HitTestResult.IMAGE_TYPE
				|| htr.getType() == HitTestResult.IMAGE_ANCHOR_TYPE
				|| htr.getType() == HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
			//判断被点击的类型为图片
			if (mCallBack!=null) {
				mCallBack.onLongClickCallBack(htr.getExtra());
			}
		}
		return false;
	}

如果判断是为图片后就可以利用zxing 来识别是否是二维码图片了:


  @Override
    public void onLongClickCallBack(final String imgUrl) {
        imgurl=imgUrl;
        // 获取到图片地址后做相应的处理
        new Thread(){
            public void run() {
                decodeImage(imgUrl);
                handler.sendEmptyMessage(0);
            };
        }.start();

        showDialog();
    }


首先 我们把图片的链接地址 转换成图片:

 /**
     * 根据地址获取网络图片
     * @param sUrl 图片地址
     * @return
     * @throws IOException
     */
    public static Bitmap getBitmap(String sUrl){
        try {
            URL url = new URL(sUrl);
            HttpURLConnection conn = (HttpURLConnection)url.openConnection();
            conn.setConnectTimeout(5000);
            conn.setRequestMethod("GET");
            if(conn.getResponseCode() == 200){
                InputStream inputStream = conn.getInputStream();
                Bitmap bitmap = BitmapFactory.decodeStream(inputStream);
                return bitmap;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

把链接转出图片了后在识别图片是不是二维码图:


    /**
     * 判断是否为二维码
     * @param sUrl 图片地址
     * @return
     */
    private boolean decodeImage(String sUrl){
        result = DecodeImage.handleQRCodeFormBitmap(getBitmap(sUrl));
        if(result == null){
            isQR = false;
        }else {
            isQR = true;
        }
        return isQR;
    }

如果是二维码图片的画 发送handle 来更新adapter来显示“识别图中二维码”


 @SuppressLint("HandlerLeak")
    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            if (msg.what == 0){
                if (isQR){
                    adapter.add("识别图中二维码");
                }
                adapter.notifyDataSetChanged();
            }
        };
    };

点击保存图片了的话 使用asnytask线程来保存图片到本地 :


 /***
     * 功能:用线程保存图片
     *
     * @author wangyp
     *
     */
    private class SaveImage extends AsyncTask<String, Void, String> {
        @Override
        protected String doInBackground(String... params) {
            String result = "";
            try {
                String sdcard;
                if (FileUtils.SDisExists()){
                    sdcard = Environment.getExternalStorageDirectory().getAbsolutePath();
                }else{
                    sdcard=getFilesDir().getAbsolutePath();
                }

                File file = new File(sdcard + "/Download");
                if (!file.exists()) {
                    file.mkdirs();
                }
                file = new File(sdcard + "/Download/" + new Date().getTime() + ".jpg");
                InputStream inputStream = null;
                URL url = new URL(imgurl);
                HttpURLConnection conn = (HttpURLConnection) url.openConnection();
                conn.setRequestMethod("GET");
                conn.setConnectTimeout(20000);
                if (conn.getResponseCode() == 200) {
                    inputStream = conn.getInputStream();
                }
                byte[] buffer = new byte[4096];
                int len = 0;
                FileOutputStream outStream = new FileOutputStream(file);
                while ((len = inputStream.read(buffer)) != -1) {
                    outStream.write(buffer, 0, len);
                }
                outStream.close();
                result = "图片已保存至:" + file.getAbsolutePath();
            } catch (Exception e) {
                result = "保存失败!" + e.getLocalizedMessage();
            }
            return result;
        }

        @Override
        protected void onPostExecute(String result) {
           Toast.makeText(H5Activity.this,result,Toast.LENGTH_SHORT).show();
        }
    }

如果用户点击 识别二维码 的话 把识别好了的二维码链接打开浏览器:


Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setData(Uri.parse(result.toString()));
startActivity(intent);
closeDialog();

这是demo地址

时间: 2024-10-13 18:10:10

android webview长按识别图片 ,利用zxing识别图片是否是二维码的相关文章

Python zxing 库解析(条形码二维码识别)

各种扫码软件 最近要做个二维码识别的项目,查到二维码识别有好多开源的不开源的软件 http://www.oschina.net/project/tag/238/ Zbar 首先试了一下Zbar,python加载ZBar时各种报错.可能的原因是zbar的dll文件是32位的,而我系统是64位的,所以运行不了.只能自己拿源码编译一个64位的出来,对于我这种伸手党来说自己编译源码是难以接受的,所以就放弃了.后来看到文章说Zbar不能识别倾斜的条形码,而且也不能定位条形码区域. Zxing zbar不可

使用zxing工具包创建和解析二维码

关于二维码是什么,以及二维码是如何生成的,我也没有研究得很深入,就不多说了,以免误导大家.请参看: java 二维码原理以及用java实现的二维码的生成.解码 二维码的生成细节和原理 下面是一个可以生成和解析二维码的工具类,该类用到了zxing工具包,我通过Maven去下载的: <dependencies>     <!-- JavaSE包依赖于Core包,因此Core包不需要直接依赖了     <dependency>         <groupId>com.

在Excel中,不利用任何第三方工具,生成二维码

有同事提需求,要批量生成二维码.谈了之后,我觉得可以做个excel文件,把要打印的内容放进去,然后给每行数据生成一个二维码.下一步就要在Excel里面生成二维码.问了一下度娘,貌似都得利用一些第三方工具,但是公司的政策比较严,任何软件都必须是正版(这种需求,短时间内估计不会批准预算买软件).因此想不靠第三方的东西,就用纯粹的vba,去生成二维码.这个时候就要感谢一下谷歌,很快在StackOverflow上找到了我想要的源码. 这是StackOverflow的原帖 原帖的最受欢迎答案是由Jonas

利用vcard和qrcode.js生成二维码导入联系人

vCard是一种容许交换个人信息的数据规范,vCard数据格式的标识符是VCARD,vCard数据格式行是: 类型 [;参数]:值,具体的介绍百度都有,我们可以通过vcard来进行通讯录的保存,名片的交换 基本格式: BEGIN:VCARD N:姓;名;;; FN: 名 姓 TITLE:XX集团前端 ADR;WORK:;;北京市五环区GT路19号;;;; TEL;CELL,VOICE:159351111111 TEL;WORK,VOICE:010-6666666 URL;WORK:www.gt.

利用Google API快速生成QR二维码

//laravel public function index(){ $urlToEncode="http://www.baidu.com"; $this -> generateQRfromGoogle($urlToEncode); //return view('welcame'); } public function generateQRfromGoogle($chl,$widhtHeight ='150',$EC_level='L',$margin='0') { $chl =

ZXing.NET(条码、二维码)

    ZXing.NET用来生成和解释 (条码.二维码) 添加引用:zxing.dll.zxing.presentation.dll 1 生成 (条码.二维码)主要用到 BarcodeWriter.BarcodeFormat.EncodingOptions.BitmapRenderer 这几个类. 2  解释 (条码.二维码)主要用到 BarcodeReader.DecodingOptions 这两个类. /// <summary> /// 条码.二维码 /// </summary&g

C#微信公众号接口开发,灵活利用网页授权、带参数二维码、模板消息,提升用户体验之完成用户绑定个人微信及验证码获取

一.前言 当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,需要用户进行复杂的操作才可以和网站绑定,或者很多公司直接不绑定,而是每次都让用户填写账号密码.作为微信接口开发人员我们知道网页授权可以用作微信网页用作安全登录,带参数二维码的使用用作记录用户来源,模板消息用作购物消费等消息的通知,但是很少看到有综合利用这些高级接口做出体验比较好的公众账号,这里分享一些我开发的用户绑定和验证码的一些心得.所需要的接口有基础的回复.网页授权.带参数二维码.

java给图片写正反字体,并将二维码写到图片上,代码实现

/** * @param filePath * 源图片路径 * @param markContent * 图片中添加内容 * @param outPath * 输出图片路径 字体颜色等在函数内部实现的 * * @param */ // 给jpg添加文字 public boolean createStringMark(String url , String filePath, String markContent, int R,int G,int B,String choosefont) { Im

C# 利用BarcodeLib.dll生成条形码(一维,zxing,QrCodeNet/dll二维码)

原文:http://blog.csdn.net/kongwei521/article/details/17588825 首先效果: 1:首先下载BarcodeLib.dll 下载地址 http://pan.baidu.com/share/link?shareid=2590968386&uk=2148890391&fid=1692834292 如果不存在了则自行搜索下载. 1.BarcodeLib.dll 一维条码库支持以下条码格式 UPC-A UPC-E UPC 2 Digit Ext.

Android之zxing二维码生成与识别

二维码: 是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的: 在代码编制上巧妙的利用构成计算机内部逻辑基础的0和1比特流的概念,使用若干个与二进制相对应的几何形体来表示文字数值信息,通过图像输入设备或光电扫描设备自动识读以实现信息自动处理: 二维码能够在横向和纵向两个方位同时表达信息,因此能在很小的面积内表达大量的信息: 二维码相对于条形码的优势就是省空间:   zxing简介: zxing是一个开放源码的,用java实现的多种格式的1D/2D条码图像处