我在项目中用到了二维码扫描的技术,用的是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. <Button
  8. android:id="@+id/btn_scan_barcode"
  9. android:layout_width="fill_parent"
  10. android:layout_height="wrap_content"
  11. android:layout_marginTop="30dp"
  12. android:text="Open camera" />
  13. <LinearLayout
  14. android:orientation="horizontal"
  15. android:layout_marginTop="10dp"
  16. android:layout_width="fill_parent"
  17. android:layout_height="wrap_content">
  18. <TextView
  19. android:layout_width="wrap_content"
  20. android:layout_height="wrap_content"
  21. android:textColor="@android:color/black"
  22. android:textSize="18sp"
  23. android:text="Scan result:" />
  24. <TextView
  25. android:id="@+id/tv_scan_result"
  26. android:layout_width="fill_parent"
  27. android:textSize="18sp"
  28. android:textColor="@android:color/black"
  29. android:layout_height="wrap_content" />
  30. </LinearLayout>
  31. <EditText
  32. android:id="@+id/et_qr_string"
  33. android:layout_width="fill_parent"
  34. android:layout_height="wrap_content"
  35. android:layout_marginTop="30dp"
  36. android:hint="Input the text"/>
  37. <Button
  38. android:id="@+id/btn_add_qrcode"
  39. android:layout_width="fill_parent"
  40. android:layout_height="wrap_content"
  41. android:text="Generate QRcode" />
  42. <ImageView
  43. android:id="@+id/iv_qr_image"
  44. android:layout_width="wrap_content"
  45. android:layout_height="wrap_content"
  46. android:layout_marginTop="10dp"
  47. android:layout_gravity="center"/>
  48. </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. @Override
  7. public void onCreate(Bundle savedInstanceState) {
  8. super.onCreate(savedInstanceState);
  9. setContentView(R.layout.main);
  10. resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);
  11. qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);
  12. qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);
  13. Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);
  14. scanBarCodeButton.setOnClickListener(new OnClickListener() {
  15. @Override
  16. public void onClick(View v) {
  17. //打开扫描界面扫描条形码或二维码
  18. Intent openCameraIntent = new Intent(BarCodeTestActivity.this,CaptureActivity.class);
  19. startActivityForResult(openCameraIntent, 0);
  20. }
  21. });
  22. Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);
  23. generateQRCodeButton.setOnClickListener(new OnClickListener() {
  24. @Override
  25. public void onClick(View v) {
  26. try {
  27. String contentString = qrStrEditText.getText().toString();
  28. if (!contentString.equals("")) {
  29. //根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350)
  30. Bitmap qrCodeBitmap = EncodingHandler.createQRCode(contentString, 350);
  31. qrImgImageView.setImageBitmap(qrCodeBitmap);
  32. }else {
  33. Toast.makeText(BarCodeTestActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();
  34. }
  35. } catch (WriterException e) {
  36. // TODO Auto-generated catch block
  37. e.printStackTrace();
  38. }
  39. }
  40. });
  41. }
  42. @Override
  43. protected void onActivityResult(int requestCode, int resultCode, Intent data) {
  44. super.onActivityResult(requestCode, resultCode, data);
  45. //处理扫描结果(在界面上显示)
  46. if (resultCode == RESULT_OK) {
  47. Bundle bundle = data.getExtras();
  48. String scanResult = bundle.getString("result");
  49. resultTextView.setText(scanResult);
  50. }
  51. }
  52. }

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

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

最后是在哪里对扫描结果进行解码,进入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. }
    23. 转自:http://blog.csdn.net/tangren03/article/details/7831826

二维码、条形码扫描——使用Google ZXing的更多相关文章

  1. java二维码生成-谷歌(Google.zxing)开源二维码生成学习及实例

    java二维码生成-谷歌(Google.zxing)开源二维码生成的实例及介绍   我们使用比特矩阵(位矩阵)的QR码编码在缓冲图片上画出二维码 实例有以下一个传入参数 OutputStream ou ...

  2. iOS系统原生二维码条形码扫描

    本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW.细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了.这个代码自己写就行了,与本文关系不大...绿色的 ...

  3. IOS原声二维码条形码扫描实现

    本文讲述如何用系统自带的东东实现二维码扫描的功能:点击当前页面的某个按钮,创建扫描VIEW.细心的小伙伴可以发现 title被改变了,返回按钮被隐藏了.这个代码自己写就行了,与本文关系不大...绿色的 ...

  4. zxing解析带logo二维码会报com.google.zxing.NotFoundException

    参考原文:https://blog.csdn.net/cyl1226541/article/details/70557232 //复杂模式,开启PURE_BARCODE模式(☆☆☆) HINTS.pu ...

  5. iOS雪花动画、音频图、新闻界面框架、2048游戏、二维码条形码扫码生成等源码

    iOS精选源码 粒子雪花与烟花的动画 iOS 2048游戏 JHSoundWaveView - 简单地声波图.音波图 一个可快速集成的新闻详情界面框架,类似今日头条,腾讯新闻 二维码/条形码扫描及扫描 ...

  6. 【转】 Android 基于google Zxing实现对手机中的二维码进行扫描--不错

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

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

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

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

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

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

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

  10. QRCode 扫描二维码、扫描条形码、相册获取图片后识别、生成带 Logo 二维码、支持微博微信 QQ 二维码扫描样式

    目录 功能介绍 常见问题 效果图与示例 apk Gradle 依赖 布局文件 自定义属性说明 接口说明 关于我 功能介绍 根据之前公司的产品需求,参考 barcodescanner 改的,希望能帮助到 ...

随机推荐

  1. ADO:DataSet存入缓存Cache中并使用

    原文发布时间为:2008-08-01 -- 来源于本人的百度文章 [由搬家工具导入] using System;using System.Data;using System.Configuration ...

  2. ASP 500错误解决方法

    最有效的解决方法: 经  c:\windows\temp 目录增加everyone写权限. 环境: windows2008

  3. 转载:Flappy Bird源代码 win32 console版

    #include"StdAfx.h" #include<stdio.h> #include<stdlib.h> #include<conio.h> ...

  4. npm-debug.log文件出现原因

    项目主目录下总是会出现这个文件,而且不止一个,原因是npm i 的时候,如果报错,就会增加一个此文件来显示报错信息,npm install的时候则不会出现.

  5. Codefroces Gym101572 I.Import Spaghetti-有向图跑最小环输出路径(Floyd)

    暑假学的很多东西,现在都忘了,补这道题还要重新学一下floyd,有点难过,我暑假学的东西呢??? 好了,淡定,开始写题解. 这个题我是真的很难过啊,输入简直是有毒啊(内心已经画圈诅咒出题人无数次了.. ...

  6. 设置USB数据监听

    设置USB数据监听   在Kali Linux中,USB也是作为一个通信端口进行存在.常见的鼠标.键盘.U盘都是通过USB接口传输数据.所以,对于USB接口也可以实施监听,类似网络接口一样.在进行US ...

  7. Xamarin.Forms支持的地图显示类型

    Xamarin.Forms支持的地图显示类型   在Xamarin.Forms中,专门提供了一个Map视图,用来显示地图.根据用户的需求不同,该视图支持三种地图显示类型,用户可以通过Map视图提供的M ...

  8. 在C++ 程序中调用被C 编译器编译后的函数,为什么要加extern “C”

    首先,作为extern是C/C++语言中表明函数和全局变量作用范围(可见性)的关键字,该关键字告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. 通常,在模块的头文件中对本模块提供给其它模块 ...

  9. svn hooks 实现自动更新

    搞来搞去,原来是hooks 下面的脚本名称必须是post-commit才可以, 写成fly-commit一直不行.晕死~~~ https://serverfault.com/questions/144 ...

  10. 有关C/C++指针的经典面试题(转)

    参考一: 有关C/C++指针的经典面试题 0.预备知识,最基础的指针 其实最基础的指针也就应该如下面代码: int a; int* p=&a; 也就是说,声明了一个int变量a,然后声明一个i ...