原文网址:http://blog.csdn.net/xiaanming/article/details/14450809

转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809

我之前写了一篇关于google Zxing扫描二维码的文章,效果是仿微信的效果,有兴趣的朋友可以去看看基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果,有时候我们有这样子的需求,需要扫描手机中有二维码的的图片,所以今天实现的就是对手机中的二维码图片进行扫描,我这里是直接在原来的工程上面加的这个功能,下面就简单介绍下这个小功能的实现,首先我在界面上加了一个ImageButton,图片还是用的微信的图片,下面是扫描界面的title

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
  3. android:layout_width="fill_parent"
  4. android:layout_height="wrap_content"
  5. android:background="@drawable/mmtitle_bg_alpha" >
  6. <Button
  7. android:id="@+id/button_back"
  8. android:layout_width="75.0dip"
  9. android:layout_height="wrap_content"
  10. android:layout_alignParentLeft="true"
  11. android:background="@drawable/mm_title_back_btn"
  12. android:text="返回"
  13. android:textColor="@android:color/white" />
  14. <TextView
  15. android:id="@+id/textview_title"
  16. android:layout_width="wrap_content"
  17. android:layout_height="wrap_content"
  18. android:layout_centerHorizontal="true"
  19. android:layout_centerVertical="true"
  20. android:gravity="center_vertical"
  21. android:text="二维码扫描"
  22. android:textColor="@android:color/white"
  23. android:textSize="18sp" />
  24. <ImageButton
  25. android:id="@+id/button_function"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_alignParentRight="true"
  29. android:layout_marginRight="2dip"
  30. android:background="@drawable/mm_title_right_btn"
  31. android:minWidth="70dip"
  32. android:src="@drawable/mm_title_btn_menu_normal" />
  33. </RelativeLayout>

在扫描界面MipcaActivityCapture对ImageButton对其点击监听,点击ImageButton从手机中选择图片

  1. //打开手机中的相册
  2. Intent innerIntent = new Intent(Intent.ACTION_GET_CONTENT); //"android.intent.action.GET_CONTENT"
  3. innerIntent.setType("image/*");
  4. Intent wrapperIntent = Intent.createChooser(innerIntent, "选择二维码图片");
  5. this.startActivityForResult(wrapperIntent, REQUEST_CODE);

在这里使用了startActivityForResult来跳转界面,当我们选中含有二维码的图片的时候会回调MipcaActivityCapture的onActivityResult方法,我们需要在onActivityResult方法里面解析图片中的二维码

  1. @Override
  2. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  3. super.onActivityResult(requestCode, resultCode, data);
  4. if(resultCode == RESULT_OK){
  5. switch(requestCode){
  6. case REQUEST_CODE:
  7. //获取选中图片的路径
  8. Cursor cursor = getContentResolver().query(data.getData(), null, null, null, null);
  9. if (cursor.moveToFirst()) {
  10. photo_path = cursor.getString(cursor.getColumnIndex(MediaStore.Images.Media.DATA));
  11. }
  12. cursor.close();
  13. mProgress = new ProgressDialog(MipcaActivityCapture.this);
  14. mProgress.setMessage("正在扫描...");
  15. mProgress.setCancelable(false);
  16. mProgress.show();
  17. new Thread(new Runnable() {
  18. @Override
  19. public void run() {
  20. Result result = scanningImage(photo_path);
  21. if (result != null) {
  22. Message m = mHandler.obtainMessage();
  23. m.what = PARSE_BARCODE_SUC;
  24. m.obj = result.getText();
  25. mHandler.sendMessage(m);
  26. } else {
  27. Message m = mHandler.obtainMessage();
  28. m.what = PARSE_BARCODE_FAIL;
  29. m.obj = "Scan failed!";
  30. mHandler.sendMessage(m);
  31. }
  32. }
  33. }).start();
  34. break;
  35. }
  36. }
  37. }

我们先通过图片的Uri获取图片的路径,然后根据图片的路径扫描出图片里面的二维码内容,这将解码图片放在了一个子线程中,主要是防止因为解析太久而出现ARN的情况

接下来看scanningImage(String path) 方法,zxing.jar中提供了对二维码进行解析的类QRCodeReader.java,使用decode(BinaryBitmap image, Map<DecodeHintType, ?> hints)方法就能解析出图片里面的二维码信息,下面是通过图片的路径解析出里面的二维码内容

  1. /**
  2. * 扫描二维码图片的方法
  3. * @param path
  4. * @return
  5. */
  6. public Result scanningImage(String path) {
  7. if(TextUtils.isEmpty(path)){
  8. return null;
  9. }
  10. Hashtable<DecodeHintType, String> hints = new Hashtable<DecodeHintType, String>();
  11. hints.put(DecodeHintType.CHARACTER_SET, "UTF8"); //设置二维码内容的编码
  12. BitmapFactory.Options options = new BitmapFactory.Options();
  13. options.inJustDecodeBounds = true; // 先获取原大小
  14. scanBitmap = BitmapFactory.decodeFile(path, options);
  15. options.inJustDecodeBounds = false; // 获取新的大小
  16. int sampleSize = (int) (options.outHeight / (float) 200);
  17. if (sampleSize <= 0)
  18. sampleSize = 1;
  19. options.inSampleSize = sampleSize;
  20. scanBitmap = BitmapFactory.decodeFile(path, options);
  21. RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap);
  22. BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));
  23. QRCodeReader reader = new QRCodeReader();
  24. try {
  25. return reader.decode(bitmap1, hints);
  26. } catch (NotFoundException e) {
  27. e.printStackTrace();
  28. } catch (ChecksumException e) {
  29. e.printStackTrace();
  30. } catch (FormatException e) {
  31. e.printStackTrace();
  32. }
  33. return null;
  34. }

Result是封装了解码的条码图像内的结果,我们只需要通过Result的getText()方法就能取出里面的二维码内容,这样子我们就搞定了扫描手机中的二维码图片的小功能,接下来我们运行下项目,看看效果

有疑问的朋友可以在下面留言,我会为大家解答,源码里是在之前的效果里面新添加的功能,有兴趣的朋友可以下载源码看看

项目源码,点击下载

很多朋友下了demo发现出现Conversion to Dalvik format failed: Unable to execute dex: Multiple dex files define Lcom/google/zxing/BarcodeFormat;这个错误,是因为刚开始的时候我放了两个JAR包进去,删除一个就行了,大家自行修改

【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错的更多相关文章

  1. Android 基于google Zxing实现对手机中的二维码进行扫描

    转载请注明出处:http://blog.csdn.net/xiaanming/article/details/14450809 有时候我们有这样子的需求,需要扫描手机中有二维码的的图片,所以今天实现的 ...

  2. C#+ZXing.dll生成手机路径导航二维码

    1.原谅我先写点废话哈 这两天用C#写一个C端的软件,甲方提出一个很无理的需求(在C端的程序中实现路径导航,关键是这个程序最终是运行在物理隔绝的电脑上的……),头疼了好几天,领导突然想到可以把坐标+百 ...

  3. Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果

      Android 高手进阶(21)  版权声明:本文为博主原创文章,未经博主允许不得转载. 转载请注明出处:http://blog.csdn.net/xiaanming/article/detail ...

  4. 【转】Android 基于google Zxing实现二维码、条形码扫描,仿微信二维码扫描效果--不错

    原文网址:http://blog.csdn.net/xiaanming/article/details/10163203 转载请注明出处:http://blog.csdn.net/xiaanming/ ...

  5. Android高级控件(三)—— 使用Google ZXing实现二维码的扫描和生成相关功能体系

    Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 现在的二维码可谓是烂大街了,到处都是二维码,什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...

  6. Android高级控件(三)——&#160;使用Google ZXing实现二维码的扫描和生成相关功能体系

    Android高级控件(三)-- 使用Google ZXing实现二维码的扫描和生成相关功能体系 摘要 如今的二维码可谓是烂大街了.到处都是二维码.什么都是二维码,扫一扫似乎已经流行到习以为常了,今天 ...

  7. 【转】Android手机客户端关于二维码扫描的源码--不错

    原文网址:https://github.com/SkillCollege/QrCodeScan QrCodeScan 这是Android手机客户端关于二维码扫描的源码,使用了高效的ZBar解码库,并修 ...

  8. 基于zxing的二维码(网格)扫描

    基于zxing的二维码(网格)扫描 前言:对于二维码扫描我们使用的是开源框架Zxing或者Zbar,这里使用基于zxing的二维码扫描,类似支付宝网格扫描, 二维码原理介绍: 二维码是用某种特定的几何 ...

  9. android 使用开源库zxing生成二维码,扫描二维码【转】

    转自:http://blog.csdn.net/qq_16064871/article/details/52422723 zxing是一个开放源码的,用Java实现的多种格式的1D/2D条码图像处理库 ...

随机推荐

  1. IOS Dictionary和Model相互转换

    // // HYBJSONModel.h // Json2ModelDemo // // Created by huangyibiao on 14-9-15. // Copyright (c) 201 ...

  2. redis 多实例配置

    (redis的安装, 配置, 登陆等基础不再多说, 网上很多资料的, 这里只说个人对redis多实例的理解与配置) 我自己使用的redis版本是 2.8.13, 环境是 ubuntu 个人对多实例的理 ...

  3. Verilog之event的用法

    编写verilog的testbench时,可使用event变量触发事件. event变量声明为: event var; event触发为: ->var; 捕获触发为: @(var); 在mode ...

  4. (转)一步一步学习PHP(5)——类和对象

    OO的强大我不想再多说,如果你不认同OO,那么当你放眼当前流行的语言,有哪个又不支持OO的,也许这个很有说服力了吧. 在这一节中,我们就来看看在PHP中如何创建一个类和对象. 1. 创建类 在PHP中 ...

  5. Java面向对象的概念以及OOP思想的优点

    传统面向过程程序设计的思路: 先设计一组函数用来解决一个问题,然后确定函数中需要处理的数据以及存储位置. 面向对象的设计的思路: 先确定处理的数据,然后确定处理数据的算法,最后将数据和算法封装在一起构 ...

  6. [转帖]AVS音视频编解码技术了解

    AVS高清立体视频编码器 电视技术在经历了从黑白到彩色.从模拟到数字的技术变革之后正在酝酿另一场技术革命,从单纯观看二维场景的平面电视跨越到展现三维场景的立体电视3DTV.3DTV系统的核心问题之一是 ...

  7. SQL SERVER 2012疑难问题解决方法

    问题一: 问题描述 SQL SERVER 2012 尝试读取或写入受保护的内存.这通常指示其他内存已损坏. (System.Data) 解决办法 管理员身份运行 cmd ->  输入 netsh ...

  8. Swift - 28 - 内部参数名和外部参数名

    //: Playground - noun: a place where people can play import UIKit // 外部参数的作用是为了让程序员调用代码的时候能清晰的看出所传参数 ...

  9. C#使用Expand、Shell32解压Cab、XSN文件

    前言: 需要解压InfoPath表单的xsn文件,在项目中以前使用的是Expand命令行解压,都没有出过问题,近段时间项目中突然报错解压失败,通过分析解压操作得出结论: 1.正常正常情况下,expan ...

  10. Linux系统配置成简单的路由器

    一.两个不同网段的子网相互访问或通信 废话不多说了,直接上图,一目了然吧. 按照如图配置,就可以实现两个不同网段的子网相互通信. 二.连接上网的配置: 如果想让这两个子网,不仅可以相互通信,而且还可以 ...