原文网址: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. [CSS3] CSS :target Selector

    The :target selector allows us to interact with a fragment identifier, or hash, in our URL from CSS. ...

  2. Creating a Navigation Drawer 创建一个导航侧边栏

    The navigation drawer is a panel that displays the app’s main navigation options on the left edge of ...

  3. 9.7noip模拟试题

    题目名称 日历游戏 最大公约数 密码 英文代号 calendar gcd pasuwado 输入文件名 calendar.in gcd.in pasuwado.in 输出文件名 calendar.ou ...

  4. vertical-align各属性对比

    测试用代码 <!DOCTYPE html> <html> <head> <style> #dd { //line-height: 300px; back ...

  5. 关于uploadify 没有显示进度条!!!!

    如果你也弄了很久不知道为什么不出现上传进度条!,那就一定要看这里了! 我注释了 queueID 属性后 就出现了!!!!! 就是这么简答! //添加界面的附件管理 $('#file_upload'). ...

  6. MemCachedClient数据写入的三个方法

    set方法 1 将数据保存到cache服务器,如果保存成功则返回true 2 如果cache服务器存在同样的key,则替换之 3 set有5个重载方法,key和value是必须的参数,还有过期时间,h ...

  7. 【转】iOS开发系列--数据存取

    原文: http://www.cnblogs.com/kenshincui/p/4077833.html#SQLite 概览 在iOS开发中数据存储的方式可以归纳为两类:一类是存储为文件,另一类是存储 ...

  8. UICollectionView出现the behavior of the UICollectionViewFlowLayout is not defined because:

    2015-01-28 21:55:17.790 Demo[636:9351] the behavior of the UICollectionViewFlowLayout is notdefined ...

  9. Smarty环境配置

    Smaty优点:1.代码分离 2.缓存技术 使用步骤: 1.下载Smaty模板 2.将模板中那个lib文件夹复制到项目中(一般为根目录,并且重命名在此命名为Smarty), 3.配置PHP 1.新建一 ...

  10. CSS 布局Float 【4】

    一些浮动模型的基本知识:浮动模型也是一种可视化格式模型,浮动的框可以左右移动(根据float属性值而定),直到它的外边缘碰到包含框 或者另一个浮动元素的框的边缘.浮动元素不在文档的普通流中,文档的普通 ...