【Android】ZXing二维码扫描与生成

作者:邹峰立,微博:zrunker,邮箱:[email protected],微信公众号:书客创作,个人平台:www.ibooker.cc。

本文选自书客创作平台第40篇文章。阅读原文 。

【Android】ZXing二维码扫描与生成_第1张图片
书客创作

二维码最早是由日本的一家公司定义的一种编码,它包括四角定位和中央编码等多部分组成。随着智能手机的普及,二维码也越来越受各种App的喜爱。而二维码的生成和扫描分析是一个非常复杂的过程,ZXing是谷歌公司的一个开源工程,非常方便的解决二维码的生成和扫描。

ZXing使用

先看一下最终效果图:

【Android】ZXing二维码扫描与生成_第2张图片
最终效果图

一、下载ZXing源码

ZXing的github地址,Github上的源码太大,我这边提供一份,只征对于Android二维码扫描和生产的ZXing库3.1。

下载ZXing3.1库,是一个libzxing的Module文件。

二、ZXing库导入工程

下载下来的ZXing库文件,实际上是一个Module,这里以Android Studio2.2.3(简称AS)为例,说明如何导入工程。

1、AS导入ZXing库Module

点击File选择New选择Import Module...

【Android】ZXing二维码扫描与生成_第3张图片
导入ZXing库Module1

找到下载到本地的Zxing库,导入。

【Android】ZXing二维码扫描与生成_第4张图片
导入本地的Zxing库2

导入成功工程变化,工程结构图。

【Android】ZXing二维码扫描与生成_第5张图片
工程结构图

2、自己的工程引入Zxing库Module。

【Android】ZXing二维码扫描与生成_第6张图片
第一步
【Android】ZXing二维码扫描与生成_第7张图片
第二步

【Android】ZXing二维码扫描与生成_第8张图片
第三步

这时候引入可能会出现下面的错误情况。

错误情况1

解决办法:这种情况是指目前你的Android Studio Tools版本不支持libzxing中的版本,直接点击下载即可。

错误情况2

解决办法:这种错误是指libzxing中最小版本为16,而在主工程中最小版本为15,所以在修改主工程build.gradle最小版本为16就好。

【Android】ZXing二维码扫描与生成_第9张图片
错误情况3

解决办法:
首先对比对比以下两张图,图一和图二。

【Android】ZXing二维码扫描与生成_第10张图片
libzxing清单文件
【Android】ZXing二维码扫描与生成_第11张图片
自己工程清单文件

导入过程中可能会出现引入失败的情况。下载好的Zxing库版本与自己新建工程版本要一致,如果不一致可以手动进入自己的工程或者Zxing库工程AndroidManifest.xml修改版本。Application的设置也要一致,如果出现不一致也会引入Zxing失败,同样自己去修改清单文件AndroidManifest.xml。

三、代码实现

1、布局XML

  
  

      

          

        

在Activity界面当中初始化控件

TextView resultTextView = (TextView) this.findViewById(R.id.tv_scan_result);  
EditText qrStrEditText = (EditText) this.findViewById(R.id.et_qr_string);  
ImageView qrImgImageView = (ImageView) this.findViewById(R.id.iv_qr_image);  
CheckBox mCheckBox = (CheckBox) findViewById(R.id.logo);  
Button scanBarCodeButton = (Button) this.findViewById(R.id.btn_scan_barcode);  
Button generateQRCodeButton = (Button) this.findViewById(R.id.btn_add_qrcode);  

2、扫描二维码

在导入的ZXing库中,有一个CaptureActivity的页面,如果要扫描二维码启动该页面即可,如何接收该页面的回调值,就可以得到扫描出来的信息。

// 打开扫描界面扫描条形码或二维码  
Intent openCameraIntent = new Intent(MainActivity.this, CaptureActivity.class);  
startActivityForResult(openCameraIntent, 0);  

接收返回值

@Override  
protected void onActivityResult(int requestCode, int resultCode, Intent data) {  
     super.onActivityResult(requestCode, resultCode, data);  
     if (resultCode == RESULT_OK) {  
         Bundle bundle = data.getExtras();  
         String scanResult = bundle.getString("result");  
         resultTextView.setText(scanResult);  
     }  
}  

3、生成二维码

对于生成二维码,目前支持两种样式,一种是没有logo的二维码,一种是有logo的二维码。

String contentString = qrStrEditText.getText().toString();  
   if (!TextUtils.isEmpty(contentString)) {  
      // 根据字符串生成二维码图片并显示在界面上,第二个参数为图片的大小(350*350)  
      Bitmap qrCodeBitmap = EncodingUtils.createQRCode(contentString, 350, 350,mCheckBox.isChecked() ? BitmapFactory.decodeResource(getResources(), R.mipmap.ic_launcher) : null);  
      qrImgImageView.setImageBitmap(qrCodeBitmap);  
   } else {  
      Toast.makeText(MainActivity.this, "Text can not be empty", Toast.LENGTH_SHORT).show();  
}  

要生成二维码需要借助于ZXing库中的EncodingUtils类中的createQRCode,该方法有四个参数,分别是String content, int widthPix, int heightPix, Bitmap logoBm。content表示上下文对象、widthPix表示生成二维码宽度以px为单位、heightPix表示生成二维码高度以px为单位、logoBm表示图标,如果不显示图片就设置其为null。

注意:在扫描二维码的时候可能存在一个IO异常。
这是因为在Android6.0+之后的版本调用照相机需要动态申请权限,否则无法启动相机。

动态申请相机权限:

if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
        // 申请CAMERA权限
        ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, 1);
}

权限申请结果处理:

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    if(1 == requestCode) {
         // todo 做相应的处理逻辑
    }
}

Github地址
阅读原文


【Android】ZXing二维码扫描与生成_第12张图片
微信公众号:书客创作

你可能感兴趣的:(【Android】ZXing二维码扫描与生成)