`

二维码、条形码扫描——使用Google ZXing

阅读更多

我在项目中用到了二维码扫描的技术,用的是Google提供的ZXing开源项目,它提供二维码和条形码的扫描。扫描条形码就是直接读取条形码的内容,扫描二维码是按照自己指定的二维码格式进行编码和解码。

 

可以到http://code.google.com/p/zxing/下载ZXing项目的源码,然后按照官方文档进行开发,我这里使用的ZXing是经过简化版的,去除了一些一般使用不必要的文件,项目工程截图如下:

 

 

其中encoding包是我 在它的基础上自己加上去的,功能是根据传入的字符串来生成二维码图片,返回一个Bitmap,其余的包是ZXing项目自带的。另外对扫描界面的布局我也 进行了修改,官方的扫描界面是横向的,我改成了纵向的,并加入了顶部的Tab和取消按钮(camera.xml),另外还需要的一些文件是 colors.xml、ids.xml,这些都是原本ZXing项目中自带的,最后就是libs下面的jar包。

 


 

先来看看最后的效果:

 

首先是根据输入的字符串生成二维码图片(左图),然后扫描二维码图片可以在界面上显示扫描结果(右图):

 


 

                           

 


 

点击Open Camera按钮代开扫描框(左图),扫描条形码结果如下(右图):

 


 

                           

 

接下来看如何使用,首先是把ZXing项目中的一些文件拷贝到我们自己的项目中,然后在Mainifest文件中进行配置权限:

 

 

 

  1. <uses-permission android:name="android.permission.VIBRATE" />  
  2.     <uses-permission android:name="android.permission.CAMERA" />  
  3.     <uses-feature android:name="android.hardware.camera" />  
  4.     <uses-feature android:name="android.hardware.camera.autofocus" />  

还有就是扫描界面Activity的配置:

 

 

  1. <activity  
  2.             android:configChanges="orientation|keyboardHidden"  
  3.             android:name="com.zxing.activity.CaptureActivity"  
  4.             android:screenOrientation="portrait"  
  5.             android:theme="@android:style/Theme.NoTitleBar.Fullscreen"  
  6.             android:windowSoftInputMode="stateAlwaysHidden" >  
  7.         </activity>  

接下来是我自己项目的布局文件:

 

 

  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="fill_parent"  
  4.     android:layout_height="fill_parent"  
  5.     android:background="@android:color/white"  
  6.     android:orientation="vertical" >  
  7.   
  8.     <Button  
  9.         android:id="@+id/btn_scan_barcode"  
  10.         android:layout_width="fill_parent"  
  11.         android:layout_height="wrap_content"  
  12.         android:layout_marginTop="30dp"  
  13.         android:text="Open camera" />  
  14.       
  15.     <LinearLayout   
  16.         android:orientation="horizontal"  
  17.         android:layout_marginTop="10dp"  
  18.         android:layout_width="fill_parent"  
  19.         android:layout_height="wrap_content">  
  20.           
  21.         <TextView   
  22.         android:layout_width="wrap_content"  
  23.         android:layout_height="wrap_content"  
  24.         android:textColor="@android:color/black"  
  25.         android:textSize="18sp"  
  26.         android:text="Scan result:" />  
  27.           
  28.         <TextView   
  29.         android:id="@+id/tv_scan_result"  
  30.         android:layout_width="fill_parent"  
  31.         android:textSize="18sp"  
  32.         android:textColor="@android:color/black"  
  33.         android:layout_height="wrap_content" />  
  34.     </LinearLayout>  
  35.       
  36.     <EditText   
  37.         android:id="@+id/et_qr_string"  
  38.         android:layout_width="fill_parent"  
  39.         android:layout_height="wrap_content"  
  40.         android:layout_marginTop="30dp"  
  41.         android:hint="Input the text"/>  
  42.       
  43.     <Button  
  44.         android:id="@+id/btn_add_qrcode"  
  45.         android:layout_width="fill_parent"  
  46.         android:layout_height="wrap_content"  
  47.         android:text="Generate QRcode" />  
  48.       
  49.     <ImageView   
  50.         android:id="@+id/iv_qr_image"  
  51.         android:layout_width="wrap_content"  
  52.         android:layout_height="wrap_content"  
  53.         android:layout_marginTop="10dp"  
  54.         android:layout_gravity="center"/>  
  55.   
  56. </LinearLayout>  

 


下面是主Activity的代码,主要功能是打开扫描框、显示扫描结果、根据输入的字符串生成二维码图片:

 

 

  1. public class BarCodeTestActivity extends Activity {  
  2.     /** Called when the activity is first created. */  
  3.     private TextView resultTextView;  
  4.     private EditText qrStrEditText;  
  5.     private ImageView qrImgImageView;  
  6.       
  7.     @Override  
  8.     public void onCreate(Bundle savedInstanceState) {  
  9.         super.onCreate(savedInstanceState);  
  10.         setContentView(R.layout.main);  
  11.           
  12.         resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);  
  13.         qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);  
  14.         qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);  
  15.           
  16.         Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);  
  17.         scanBarCodeButton.setOnClickListener(new OnClickListener() {  
  18.               
  19.             @Override  
  20.             public void onClick(View v) {  
  21.                 //打开扫描界面扫描条形码或二维码  
  22.                 Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptureActivity.class);  
  23.                 startActivityForResult(openCameraIntent, 0);  
  24.             }  
  25.         });  
  26.           
  27.         Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);  
  28.         generateQRCodeButton.setOnClickListener(new OnClickListener() {  
  29.               
  30.             @Override  
  31.             public void onClick(View v) {  
  32.                 try {  
  33.                     String contentString = qrStrEditText.getText().toString();  
  34.                     if (!contentString.equals("")) {  
  35.                         //根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350)  
  36.                         Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350);  
  37.                         qrImgImageView.setImageBitmap(qrCodeBitmap);  
  38.                     }else {  
  39.                         Toast.makeText(BarCodeTestActivity.this"Text can not be empty", Toast.LENGTH_SHORT).show();  
  40.                     }  
  41.                       
  42.                 } catch (WriterException e) {  
  43.                     // TODO Auto-generated catch block  
  44.                     e.printStackTrace();  
  45.                 }  
  46.             }  
  47.         });  
  48.     }  
  49.   
  50.     @Override  
  51.     protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
  52.         super.onActivityResult(requestCode, resultCode, data);  
  53.         //处理扫描结果(在界面上显示)  
  54.         if (resultCode == RESULT_OK) {  
  55.             Bundle bundle = data.getExtras();  
  56.             String scanResult = bundle.getString("result");  
  57.             resultTextView.setText(scanResult);  
  58.         }  
  59.     }  
  60. }  


其中生成二维码图片的代码在EncodingHandler.java中:

 

 

  1. public final class EncodingHandler {  
  2.     private static final int BLACK = 0xff000000;  
  3.       
  4.     public static Bitmap createQRCode(String str,int widthAndHeight) throws WriterException {  
  5.         Hashtable<EncodeHintType, String> hints = new Hashtable<EncodeHintType, String>();    
  6.         hints.put(EncodeHintType.CHARACTER_SET, "utf-8");   
  7.         BitMatrix matrix = new MultiFormatWriter().encode(str,  
  8.                 BarcodeFormat.QR_CODE, widthAndHeight, widthAndHeight);  
  9.         int width = matrix.getWidth();  
  10.         int height = matrix.getHeight();  
  11.         int[] pixels = new int[width * height];  
  12.           
  13.         for (int y = 0; y < height; y++) {  
  14.             for (int x = 0; x < width; x++) {  
  15.                 if (matrix.get(x, y)) {  
  16.                     pixels[y * width + x] = BLACK;  
  17.                 }  
  18.             }  
  19.         }  
  20.         Bitmap bitmap = Bitmap.createBitmap(width, height,  
  21.                 Bitmap.Config.ARGB_8888);  
  22.         bitmap.setPixels(pixels, 0, width, 00, width, height);  
  23.         return bitmap;  
  24.     }  
  25. }  


最后是在哪里对扫描结果进行解码,进入CaptureActivity.java找到下面这个方法便可以对自己对结果进行操作:

 

 

  1. /** 
  2.      * Handler scan result 
  3.      * @param result 
  4.      * @param barcode 
  5.      */  
  6.     public void handleDecode(Result result, Bitmap barcode) {  
  7.         inactivityTimer.onActivity();  
  8.         playBeepSoundAndVibrate();  
  9.         String resultString = result.getText();  
  10.         //FIXME  
  11.         if (resultString.equals("")) {  
  12.             Toast.makeText(CaptureActivity.this"Scan failed!", Toast.LENGTH_SHORT).show();  
  13.         }else {  
  14. //          System.out.println("Result:"+resultString);  
  15.             Intent resultIntent = new Intent();  
  16.             Bundle bundle = new Bundle();  
  17.             bundle.putString("result", resultString);  
  18.             resultIntent.putExtras(bundle);  
  19.             this.setResult(RESULT_OK, resultIntent);  
  20.         }  
  21.         CaptureActivity.this.finish();  
  22.     }  


以上过程没有把每一步的详细步骤写出来,整体思路基本大致如上,源码下载:源码

分享到:
评论

相关推荐

    高仿仿微信界面二维码扫描效果 之 Android 基于google Zxing实现二维码、条形码扫描

    总的来说,通过深入理解Zxing库的使用,结合自定义的UI设计和交互效果,我们可以创建出一个与微信类似的高质量二维码和条形码扫描功能。这个过程中,不仅需要掌握Android的相机操作、UI设计,还要懂得如何优化用户...

    基于Zxing的二维码条形码扫描和生成demo

    **基于Zxing的二维码条形码扫描和生成详解** 二维码和条形码在现代生活中扮演着重要的角色,尤其是在数据交换、商品追踪以及移动支付等领域。Zxing(也称为ZXing,意为“zebra crossing”,斑马线)是Google开发的...

    二维码扫描——精简zxing 3.1.1,仅保留扫描和解码部分,增加n种特性

    ZXing(Zebra Crossing)是Google开发的一个开源项目,用于处理各种条形码和二维码的扫描与解码。ZXing库功能强大,但其全功能版本可能包含许多应用程序并不需要的所有组件,这可能会导致体积过大,影响应用性能。...

    ireport生成一维码和google zxing二维码

    本文将深入探讨如何使用iReport生成一维码和二维码,以及涉及到的关键技术——Google的ZXing(Zebra Crossing)。 一、iReport简介 iReport是一款开源的Java Swing应用程序,专门用于设计基于JasperReports的报表。...

    二维码扫码 google官网程序zxing-core-2.3.0 JAR包

    Google的ZXing(Zebra Crossing)项目是开源的二维码和条形码扫描库,旨在跨多种平台提供二维码和条形码的读取与生成功能。ZXing意为“斑马线”,象征着它连接了数字世界与现实世界的通道。 标题中的“二维码扫码 ...

    安卓Android源码——使用ZXing识别条码二维码(简单的实现).zip

    在安卓开发中,ZXing(Zebra Crossing)库是一个广泛使用的开源项目,它提供了二维码和条形码的读取和生成功能。这个压缩包“安卓Android源码——使用ZXing识别条码二维码(简单的实现)”包含了一个示例项目,展示...

    Android ZXing二维码——集成本地图片扫描、图片浏览器、相机扫描二维码、生成二维码

    在Android开发中,ZXing(Zebra Crossing)库是一个广泛使用的二维码和条形码处理工具。这个库提供了扫描、解析和生成二维码与条形码的能力,使得开发者可以轻松地将这些功能集成到自己的应用程序中。本文将深入探讨...

    Android 基于google Zxing实现对手机中的二维码进行扫描 程序源码

    在Android应用中,我们可以利用Zxing的Android端组件——`android-sdk`,来轻松地构建二维码扫描功能。 首先,你需要在项目中引入Zxing库。可以通过在`build.gradle`文件中添加依赖来实现: ```groovy ...

    Android扫描条形码 二维码,生成二维码源码

    在本文中,我们将深入探讨如何在Android应用中使用Zxing库实现条形码和二维码的扫描与生成。 一、条形码与二维码简介 1. 条形码:是一种宽度不等的黑白相间的平行线条图形,用于表示一定的数字、字母和符号。最...

    android zxing 二维码扫描亲测可用

    本篇文章将详细介绍如何在Android项目中使用Zxing进行二维码扫描,并分享一个已亲测可用的示例——ZxingExample。 首先,我们来理解Zxing的核心功能。Zxing支持多种条码格式,包括一维码和二维码,如QR码、Data ...

    二维码扫描zxingDemo

    二维码扫描在移动应用开发中是一项常见且实用的功能,ZXing(Zebra Crossing)是一个流行的开源项目,用于处理一维和二维条码,包括二维码。在Android平台上,ZXing库为开发者提供了便捷的方式来集成二维码扫描功能...

    android 二维码生成和长按识别 goole.ZXing

    在Android开发中,ZXing(Zebra Crossing)库是一个广泛使用的开源项目,它提供了二维码和条形码的生成与识别功能。ZXing这个名字来源于它的原意——斑马线,象征着条形码的黑白条纹。在这个特定的案例中,我们关注...

    在Android上使用ZXing识别条形码/二维码 ZXingDemo

    在Android平台上,ZXing提供了专门的Android端组件——`com.google.zxing.client.android`,这使得在Android应用中实现条码和二维码扫描变得相对简单。ZXingDemo项目就是演示了如何使用这些组件。 **3. ZXingDemo...

    二维码条形码解析插件

    本插件——"二维码条形码解析插件",基于ZXing库,旨在简化这些操作,让用户在各种应用场景下能够快速、便捷地进行二维码和条形码的解析。 1. **二维码与条形码基础** - **二维码**:二维码(Quick Response Code...

    android 二维码扫描 支持横竖屏切换Demo

    ZXing的核心库`core`提供了条码解码能力,而`zxing-android-embedded`则为Android设备封装了相机扫描的接口,简化了在Android应用中集成扫码的功能。 为了实现横竖屏切换,我们需要关注Activity的生命周期管理和...

    android 实现二维码扫描

    这里我们将深入探讨如何使用一个常见的开源库——Zxing(又称为“条形码扫描器”)来实现这一功能。Zxing是一个多格式的一维和二维条码图像处理库,支持多种编码解码格式,包括二维码。 首先,你需要将Zxing库集成...

    安卓Android源码——zxing 生成二维码名片.zip

    ZXing(Zebra Crossing)是Google开发的一个开源项目,用于读取和生成多种条形码和二维码格式。 【描述】中的内容与标题相同,再次强调了这个压缩包包含的是Android应用中利用ZXing库生成二维码名片的源代码。 ...

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

    在Android平台上实现二维码和条形码的扫描功能,开发者经常使用的开源库是ZXing(Zebra Crossing)。这个项目提供了一套完整的扫码解决方案,包括生成、解码二维码和条形码。本教程将深入探讨如何在Android应用中...

    Android 二维码扫描怎样实现第二次(重复)扫描

    在Android项目中,我们可以直接引入Zxing的Android端库——BarcodeScanner,或者使用更现代化的替代品如Google的Vision API,它包含了条形码和二维码的扫描功能。 1. **集成二维码扫描库**: - 对于Zxing,可以...

    安卓Android源码——二维码及条形码生成与扫描.zip

    这个压缩包“安卓Android源码——二维码及条形码生成与扫描.zip”提供了实现这些功能的源代码示例。下面我们将深入探讨相关知识点。 1. **Zxing (ZXing: Zebra Crossing)**: Zxing是一个开源的、多格式的一维/二...

Global site tag (gtag.js) - Google Analytics