zoukankan      html  css  js  c++  java
  • 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错

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

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

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

    [html] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    7.     <Button  
    8.         android:id="@+id/button_back"  
    9.         android:layout_width="75.0dip"  
    10.         android:layout_height="wrap_content"  
    11.         android:layout_alignParentLeft="true"  
    12.         android:background="@drawable/mm_title_back_btn"  
    13.         android:text="返回"  
    14.         android:textColor="@android:color/white" />  
    15.   
    16.     <TextView  
    17.         android:id="@+id/textview_title"  
    18.         android:layout_width="wrap_content"  
    19.         android:layout_height="wrap_content"  
    20.         android:layout_centerHorizontal="true"  
    21.         android:layout_centerVertical="true"  
    22.         android:gravity="center_vertical"  
    23.         android:text="二维码扫描"  
    24.         android:textColor="@android:color/white"  
    25.         android:textSize="18sp" />  
    26.   
    27.     <ImageButton  
    28.         android:id="@+id/button_function"  
    29.         android:layout_width="wrap_content"  
    30.         android:layout_height="wrap_content"  
    31.         android:layout_alignParentRight="true"  
    32.         android:layout_marginRight="2dip"  
    33.         android:background="@drawable/mm_title_right_btn"  
    34.         android:minWidth="70dip"  
    35.         android:src="@drawable/mm_title_btn_menu_normal" />  
    36.   
    37. </RelativeLayout>  

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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方法里面解析图片中的二维码

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.                   
    14.                 mProgress = new ProgressDialog(MipcaActivityCapture.this);  
    15.                 mProgress.setMessage("正在扫描...");  
    16.                 mProgress.setCancelable(false);  
    17.                 mProgress.show();  
    18.                   
    19.                 new Thread(new Runnable() {  
    20.                     @Override  
    21.                     public void run() {  
    22.                         Result result = scanningImage(photo_path);  
    23.                         if (result != null) {  
    24.                             Message m = mHandler.obtainMessage();  
    25.                             m.what = PARSE_BARCODE_SUC;  
    26.                             m.obj = result.getText();  
    27.                             mHandler.sendMessage(m);  
    28.                         } else {  
    29.                             Message m = mHandler.obtainMessage();  
    30.                             m.what = PARSE_BARCODE_FAIL;  
    31.                             m.obj = "Scan failed!";  
    32.                             mHandler.sendMessage(m);  
    33.                         }  
    34.                           
    35.                     }  
    36.                 }).start();  
    37.                   
    38.                 break;  
    39.               
    40.             }  
    41.         }  
    42.     }  

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

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

    [java] view plaincopy在CODE上查看代码片派生到我的代码片
     
    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.   
    13.     BitmapFactory.Options options = new BitmapFactory.Options();  
    14.     options.inJustDecodeBounds = true; // 先获取原大小  
    15.     scanBitmap = BitmapFactory.decodeFile(path, options);  
    16.     options.inJustDecodeBounds = false; // 获取新的大小  
    17.     int sampleSize = (int) (options.outHeight / (float) 200);  
    18.     if (sampleSize <= 0)  
    19.         sampleSize = 1;  
    20.     options.inSampleSize = sampleSize;  
    21.     scanBitmap = BitmapFactory.decodeFile(path, options);  
    22.     RGBLuminanceSource source = new RGBLuminanceSource(scanBitmap);  
    23.     BinaryBitmap bitmap1 = new BinaryBitmap(new HybridBinarizer(source));  
    24.     QRCodeReader reader = new QRCodeReader();  
    25.     try {  
    26.         return reader.decode(bitmap1, hints);  
    27.   
    28.     } catch (NotFoundException e) {  
    29.         e.printStackTrace();  
    30.     } catch (ChecksumException e) {  
    31.         e.printStackTrace();  
    32.     } catch (FormatException e) {  
    33.         e.printStackTrace();  
    34.     }  
    35.     return null;  
    36. }  

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

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

    项目源码,点击下载

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

  • 相关阅读:
    记开发个人图书收藏清单小程序开发(二)
    记一次使用MemoryCache不能Get的问题
    Linux:系统安全相关优化,(firewalld、iptables、selinux)
    linux:操作系统优化
    Linux:日志,cpu,memory,mount,load等系统信息查看
    linux:yum系统如何安装软件
    Linux:系统运行级别
    linux:eth0(ens33)-网卡名称及配置文件信息解析
    linux:linux系统中的挂载技术
    linux:命令行常用快捷方式
  • 原文地址:https://www.cnblogs.com/wi100sh/p/4481332.html
Copyright © 2011-2022 走看看