webview长按图片识别二维码

webview长按图片识别二维码

第一次写博客,主要是做这个功能是临时让加的功能,当时一头雾水,就想着用zxing,但是具体怎么做也不太清楚,然后就查了很多资料,所以在此记录一下。
导入zxing包

implementation 'com.google.zxing:core:3.3.3'

首先是长按webview里面的图片,实现长按监听功能

  /**
         * 长按webview图片
         */
        webView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                final WebView.HitTestResult htr = ((WebView) v).getHitTestResult();//获取所点击的内容
                if (htr.getType() == WebView.HitTestResult.IMAGE_TYPE //判断被点击的类型为图片
                        || htr.getType() == WebView.HitTestResult.IMAGE_ANCHOR_TYPE
                        || htr.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) {
                    imagePath = htr.getExtra();
                    getDecodeAbleBitmap(imagePath);
                }
                return false;
            }
        });

然后就是将获取到的网络图片下载下来,通过流转成Bitmap,注意的是,必须在子线程中实现网络下载

/**
     *
     * @param picturePath 网络图片文件路径
     * @return
     */
    private   void getDecodeAbleBitmap(final String picturePath) {
        new Thread(new Runnable() {
            @Override
            public void run() {
                try {
                    URL url = new URL(picturePath);
                    HttpURLConnection httpURLConnection = (HttpURLConnection) url.openConnection();
                    //这里就简单的设置了网络的读取和连接时间上线,如果时间到了还没成功,那就不再尝试
                    httpURLConnection.setReadTimeout(8000);
                    httpURLConnection.setConnectTimeout(8000);
                    if(httpURLConnection.getResponseCode()==200) {
                        InputStream inputStream = httpURLConnection.getInputStream();
                        //这里直接就用bitmap取出了这个流里面的图片,哈哈,其实整篇文章不就主要是这一句嘛
                        Bitmap bm = BitmapFactory.decodeStream(inputStream);
                        //下面这是把图片携带在Message里面,简单,不多说
                        Message message = Message.obtain();
                        message.obj = bm;
                        handler.sendMessage(message);
                        inputStream.close();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }).start();
    }
***

在handler中进行解码操作


//使用Handler更新主线程(UI线程)
    private Handler handler = new Handler(){
        public void handleMessage(Message msg) {
            Bitmap bitmap=(Bitmap) msg.obj;
           final Result ret = parsePic(bitmap);
            if (null == ret) {
                ToastUtil.show(act,"未解析到结果");
            } else {
                if (ret.toString().startsWith("http://")||ret.toString().startsWith("https://")){
                    AlertDialog.Builder builder = new AlertDialog.Builder(act);
                    builder.setMessage(ret.toString());
                    builder.setTitle("识别成功");
                    builder.setPositiveButton("确认", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            //用默认浏览器打开扫描得到的地址
                            Intent intent = new Intent();
                            intent.setAction("android.intent.action.VIEW");
                            Uri url = Uri.parse(ret.toString());
                            intent.setData(url);
                            startActivity(intent);
                            dialog.dismiss();
                        }
                    });
                    builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });
                    builder.create().show();
                }else{
                    ToastUtil.show(act,ret.toString());
                }
            }
        }
    };

以下才是重点,解码方法。利用zxing


 /**
     * 解析二维码图片
     * @return
     */
    public Result parsePic(Bitmap bitmap) {
        //解析转换类型UTF-8
        Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
        hints.put(DecodeHintType.CHARACTER_SET, "utf-8");
        //新建一个RGBLuminanceSource对象,将bitmap图片传给此对象
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        int[] data = new int[width * height];
        bitmap.getPixels(data, 0, width, 0, 0, width, height);
        RGBLuminanceSource rgbLuminanceSource = new RGBLuminanceSource(width,height,data);
        //将图片转换成二进制图片
        BinaryBitmap binaryBitmap = new BinaryBitmap(new HybridBinarizer(rgbLuminanceSource));
        //初始化解析对象
        QRCodeReader reader = new QRCodeReader();
        //开始解析
        Result result = null;
        try {
            result = reader.decode(binaryBitmap, hints);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return result;
    }

好了,所有用到的方法都在此了,希望有此需求的少走弯路

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值