1. 文章大纲

      一、条形码、二维码扫描框架介绍
      二、条形码、二维码的区别和组成结构介绍
      三、条形码、二维码扫描框架应用场景
      四、BGAQRCode-Android框架实战
      五、项目源码下载
      六、参考文章

      一、条形码、二维码扫描框架介绍

      Android二维码扫描是一种常见的功能开发,但是技术选型不当会造成初期开发难度大、后期维护成本高。常见的Android二维码扫码解决方案很多,比如ZXing,barcodescanner和BGAQRCode-Android等等。以下给出这三种典型二维码解决方案的异同和开发场景。
      (1)ZXing是诸多二维码扫码解决方案的核心引用库,见附录文章2。很多第三方的二维码解决方案都是基于ZXing二次定制开发。但是集成和直接基于ZXing二次定制开发比较繁琐和麻烦,除非非常必要,我个人不建议开发者直接使用ZXing集成开发。
      (2)由于ZXing的以上原因,很多第三方二维码扫码解决方案应运而生。其中barcodescanner就是这样,barcodescanner在github上的项目主页:https://github.com/dm77/barcodescanner , barcodescanner最大的特点是集成简单,扫描速度较快,比较稳定,很便于开发者迅速集成开发。但是barcodescanner的不太灵活UI调整,如果设计要求二维码扫描界面比较复杂的UI要求,那么就需要把barcodescanner的整体代码都拖下来,自己再次改造定制。
      (3)BGAQRCode-Android也是一种二维码扫描解决方案,其在github上的项目主页:https://github.com/bingoogolapple/BGAQRCode-Android , BGAQRCode-Android也和barcodescanner一样简单易用,然而更加便于定制开发。我个人喜欢使用BGAQRCode-Android。

      二、条形码、二维码的区别和组成结构介绍

      1. 演示图

      二维码

      2. 组成结构

      2.1 一维码

      条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符。常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案。
      其对应字符由一组阿拉伯数字组成,供人们直接识读或通过键盘 向计算机输入数据使用。这一组条空和相应的字符所表示的信息是相同的。
      通用商品条形码一共有13位,一般由前缀部分、制造厂商代码、商品代码和校验码4个部分组成。

      前缀部分
      由第1到第3位构成,是用来标识国家或地区的代码,赋码权在国际物品编码协会,如 00-09代表美国、加拿大。45、49代表 日本。69代表中国大陆,471 代表中国台湾地区,489 代表香港特区。

      制造厂商代码
      由第4到第7位构成,是用来标识不同生产厂家的代码,赋码权在各个国家或地区的物品编码组织,中国由国家物品编码中心赋予制造厂商代码。

      商品代码
      由第8到第12位构成,是各个厂商用来标识自己商品的代码,赋码权由产品生产企业自己行使,可以组成10000个不同的商品代码。

      校验码
      由第13位构成,用来校验商品条形码中左起第1-12数字代码的正确性。这一位的数字是由前12位数字按照一定规则计算出来的,若读取出的前12位按照该规则计算出的数字跟第13位不符合,则表示读取失败,是条形码的一种验错措施。

      2.2 二维码

      二维条码/二维码(2-dimensional bar code)是用某种特定的几何图形按一定规律在平面(二维方向上)分布的黑白相间的图形记录数据符号信息的,二维码是一种比一维码更高级的条码格式。一维码只能在一个方向(一般是水平方向)上表达信息,而二维码在水平和垂直方向都可以存储信息。一维码只能由数字和字母组成,而二维码能存储汉字、数字和图片等信息,因此二维码的应用领域要广得多。
      以使用广泛的QR(Quick-Response) CODE为例,主要由定位图形、格式信息、版本信息、数据和纠错信息5部分构成。

      定位图形
      用于对二维码的定位,一共有个数为3,即3个定位图形可标识一个矩形,同时可以用于确认二维码的大小和方向;

      格式信息
      存在于所有的尺寸中,用于存放一些格式化数据。表示改二维码的纠错级别,分为L、M、Q、H;

      版本信息
      即二维码的规格,在 >= Version 7以上,需要预留两块3 x 6的区域存放一些版本信息。

      数据信息和纠错信息
      实际保存的二维码信息(Data Code 数据码)和纠错信息(Error Correction Code 纠错码)(用于修正二维码损坏带来的错误)。

      三、条形码、二维码扫描框架应用场景

      (1)信息获取(名片、地图、WIFI密码、资料)
      (2)网站跳转(跳转到微博、手机网站、网站)
      (3)广告推送(用户扫码,直接浏览商家推送的视频、音频广告)
      (4)手机电商(用户扫码、手机直接购物下单)
      (5)防伪溯源(用户扫码、即可查看生产地;同时可以获取最终消费地)
      (6)优惠促销(用户扫码,下载电子优惠券,抽奖)
      (7)会员管理(用户手机上获取电子会员信息、VIP服务)
      (8)手机支付(扫描商品二维码,通过银行或第三方支付提供的手机端通道完成支付
      (9)登陆管理(不需输入账户,密码,扫码登陆)

      四、BGAQRCode-Android框架实战

      1. build.gradle添加引用

          compile 'com.google.zxing:core:3.2.1'
      compile 'cn.bingoogolapple:bga-qrcodecore:1.1.7@aar'
      compile 'cn.bingoogolapple:bga-zxing:1.1.7@aar'

      2. 新建xml布局

      <?xml version="1.0" encoding="utf-8"?>
      <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto"
      android:layout_width="match_parent"
      android:layout_height="match_parent"> <cn.bingoogolapple.qrcode.zxing.ZXingView
      android:id="@+id/zxingview"
      android:layout_width="match_parent"
      android:layout_height="match_parent" app:qrcv_animTime="1000"
      app:qrcv_borderColor="@android:color/white"
      app:qrcv_borderSize="1px"
      app:qrcv_cornerColor="@android:color/holo_green_light"
      app:qrcv_cornerLength="20dp"
      app:qrcv_cornerSize="5dp"
      app:qrcv_isShowDefaultScanLineDrawable="true"
      app:qrcv_isShowTipTextAsSingleLine="true"
      app:qrcv_isTipTextBelowRect="true"
      app:qrcv_maskColor="#64000000" app:qrcv_qrCodeTipText="将二维码放入框内,自动扫描"
      app:qrcv_rectWidth="200dp"
      app:qrcv_scanLineColor="@android:color/holo_green_light"
      app:qrcv_scanLineSize="2dp" app:qrcv_tipTextColor="@android:color/white"
      app:qrcv_tipTextMargin="15dp"
      app:qrcv_tipTextSize="18dp" /> <LinearLayout
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_alignParentBottom="true"
      android:layout_centerHorizontal="true"
      android:layout_marginBottom="50dp"
      android:orientation="horizontal"> <Button
      android:id="@+id/start_spot"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:text="开始扫码" /> <Button
      android:id="@+id/stop_spot"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:text="暂停扫码" /> <Button
      android:id="@+id/open_flashlight"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:text="开灯" /> <Button
      android:id="@+id/close_flashlight"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:text="关灯" />
      </LinearLayout>
      </RelativeLayout>

      3. Java代码

      import android.app.Activity;
      import android.os.Bundle;
      import android.os.Handler;
      import android.os.Vibrator;
      import android.util.Log;
      import android.view.View;
      import android.widget.Toast; import cn.bingoogolapple.qrcode.core.QRCodeView;
      import cn.bingoogolapple.qrcode.zxing.ZXingView; public class MainActivity extends Activity {
      private QRCodeView mQRCodeView;
      private Activity activity; @Override
      public void onCreate(Bundle state) {
      super.onCreate(state);
      activity = this;
      setContentView(R.layout.activity_main); mQRCodeView = (ZXingView) findViewById(R.id.zxingview);
      mQRCodeView.changeToScanQRCodeStyle(); //扫二维码
      mQRCodeView.setDelegate(new QRCodeView.Delegate() { @Override
      public void onScanQRCodeSuccess(String result) {
      Log.d("二维码扫描结果", "result:" + result); Toast.makeText(activity, result, Toast.LENGTH_LONG).show(); //扫描得到结果震动一下表示
      vibrate(); //获取结果后三秒后,重新开始扫描
      new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
      mQRCodeView.startSpot();
      }
      }, 3000);
      } @Override
      public void onScanQRCodeOpenCameraError() {
      Toast.makeText(activity, "打开相机错误!", Toast.LENGTH_SHORT).show();
      }
      }); findViewById(R.id.start_spot).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
      mQRCodeView.startSpot();
      Toast.makeText(activity, "startSpot", Toast.LENGTH_SHORT).show();
      }
      }); findViewById(R.id.stop_spot).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
      mQRCodeView.stopSpot();
      Toast.makeText(activity, "stopSpot", Toast.LENGTH_SHORT).show();
      }
      }); findViewById(R.id.open_flashlight).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
      mQRCodeView.openFlashlight();
      Toast.makeText(activity, "openFlashlight", Toast.LENGTH_SHORT).show();
      }
      }); findViewById(R.id.close_flashlight).setOnClickListener(new View.OnClickListener() {
      @Override
      public void onClick(View view) {
      mQRCodeView.closeFlashlight();
      Toast.makeText(activity, "closeFlashlight", Toast.LENGTH_SHORT).show();
      }
      }); // findViewById(R.id.scan_qrcode).setOnClickListener(new View.OnClickListener(){
      // @Override
      // public void onClick(View view) {
      // mQRCodeView.changeToScanQRCodeStyle();
      // Toast.makeText(activity,"changeToScanQRCodeStyle",Toast.LENGTH_SHORT).show();
      // }
      // });
      } @Override
      protected void onStart() {
      super.onStart();
      mQRCodeView.startCamera();
      //强制手机摄像头镜头朝向前边
      //mQRCodeView.startCamera(Camera.CameraInfo.CAMERA_FACING_FRONT); mQRCodeView.showScanRect(); //显示扫描方框
      } @Override
      protected void onStop() {
      mQRCodeView.stopCamera();
      super.onStop();
      } @Override
      protected void onDestroy() {
      mQRCodeView.onDestroy();
      super.onDestroy();
      } //震动
      private void vibrate() {
      Vibrator vibrator = (Vibrator) getSystemService(VIBRATOR_SERVICE);
      vibrator.vibrate(200);
      }
      }

      4. 添加相机、闪光灯、震动权限

        <uses-permission android:name="android.permission.CAMERA" />
      <uses-permission android:name="android.permission.VIBRATE" />
      <uses-permission android:name="android.permission.FLASHLIGHT" />

      5. 运行项目并访问

      五、项目源码下载

      链接:https://pan.baidu.com/s/1rQOyYKJIVcpzlUCvsgPBXQ
      提取码:0bw8

      六、参考文章

      1. https://blog.csdn.net/csdn_aiyang/article/details/78983090
      2. https://blog.csdn.net/zhangphil/article/details/69625321
      3. https://blog.csdn.net/dcrmg/article/details/52106805

Android之条形码、二维码扫描框架(非原创)的更多相关文章

  1. android利用zbar二维码扫描-(解决中文乱码及扫描区域定义)

    写在最前(这是对上一篇博文的问题做的更新[android利用zbar二维码扫描]) project下载   zbarLib编译project  project下载0积分 bug 在2.3的系统中Hol ...

  2. Android快速实现二维码扫描--Zbar

    Android中二维码扫描的最常用库是zxing和zbar,上一篇<Android快速实现二维码扫描–Zxing>介绍了Zxing.这次说Zbar,Zbar速度极快,我就比较常用,项目地址 ...

  3. ZBar 是款桌面电脑用条形码/二维码扫描工具

    ZBar 是款桌面电脑用条形码/二维码扫描工具 windows平台python 2.7环境编译安装zbar   最近一个项目需要识别二维码,找来找去找到了zbar和zxing,中间越过无数坑,总算基本 ...

  4. Android仿微信二维码扫描

    转载:http://blog.csdn.net/xiaanming/article/details/10163203 了解二维码这个东西还是从微信中,当时微信推出二维码扫描功能,自己感觉挺新颖的,从一 ...

  5. Android快速实现二维码扫描--Zxing

    Android中二维码扫描的最常用库是zxing和zbar,zxing项目地址为https://github.com/zxing/zxing,目前还有多个人在维护.zbar主要用C来写的,对速度有要求 ...

  6. Android之Zxing二维码扫描图片拉伸

    还是这个接手项目,二维码扫描集成的是zxing,扫描界面的图像有明显的拉伸变形. 这种问题,根据以往的经验,一般是x,y轴错位引起的,处理好x,y轴的问题,一般可以解决问题. 由于这个问题,之前有很多 ...

  7. android中Zing二维码扫描,二维码生成

    Android中二维码扫描的最常用库是zxing和zbar,zxing项目地址为https://github.com/zxing/zxing,目前还有多个人在维护.zbar主要用C来写的,对速度有要求 ...

  8. Android &quot;QR二维码扫描&quot;

    支持灯 扫描结果 支持 抄.分享.浏览打开(超链接) 自己主动保存扫描记录 划删除 和源代码 git: http://git.oschina.net/892642257/QRCode csdn(0分) ...

  9. Qt之二维码扫描

    简述 二维码(QR Code)是用某种特定的几何图形按一定规律在平面(二维方向)分布的黑白相间的图形记录数据符号信息的.是所有信息数据的一把钥匙.应用十分广泛,如:产品防伪/溯源.广告推送.网站链接. ...

随机推荐

  1. Leetcode 179.最大数

    最大数 给定一组非负整数,重新排列它们的顺序使之组成一个最大的整数. 示例 1: 输入: [10,2] 输出: 210 示例 2: 输入: [3,30,34,5,9] 输出: 9534330 impo ...

  2. 7-14 电话聊天狂人(25 分)(Hash表基本操作)

    7-14 电话聊天狂人(25 分) 给定大量手机用户通话记录,找出其中通话次数最多的聊天狂人. 输入格式: 输入首先给出正整数N(≤10​5​​),为通话记录条数.随后N行,每行给出一条通话记录.简单 ...

  3. springboot + mybatis 完成图片上传并保存到数据库

    添加依赖 <dependency> <groupId>commons-fileupload</groupId> <artifactId>commons- ...

  4. JAVA配置--JDK环境变量配置

    环境变量是整台电脑的全局变量,(这台电脑上)任何程序都可以读取这个变量. 如果您安装好jdk,但环境变量配置让你感到有一点模糊的话,那么请您看一下这篇,希望对您有帮助 根据打开电脑的属性(R),出现 ...

  5. 一个简单的Java文件工具类

    package com.xyworkroom.ntko.util; import java.io.File; import java.io.FileInputStream; import java.i ...

  6. 配置文件的备份和IOS 的备份

    分享到 QQ空间 新浪微博 百度搜藏 人人网 腾讯微博 开心网 腾讯朋友 百度空间 豆瓣网 搜狐微博 百度新首页 QQ收藏 和讯微博 我的淘宝 百度贴吧 更多... 百度分享 广场 登录 注册 关注此 ...

  7. IOS推断是否安装微信qq

    BOOL weicaht = [[UIApplicationsharedApplication]canOpenURL:[NSURLURLWithString:@"mqqapi://" ...

  8. PHP开发出来的万年历

    <?php /** * PHP万年历 */ class Calendar{ protected $_table;//table表格 protected $_currentDate;//当前日期 ...

  9. Velocity高速新手教程

    变量 (1)变量的定义: #set($name = "hello")      说明:velocity中变量是弱类型的. 当使用#set 指令时,括在双引號中的字面字符串将解析和又 ...

  10. 使用fiddler将网站上的css js重定向至本地文件

    使用fiddler将网站上的css js重定向至本地文件,进行在线调试 https://github.com/annnhan/ReRes 1条回复 这是一篇写给公司负责切图和调样式的前端的文章.主要适 ...