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

作者: 吾非言 | 来源:发表于2017-10-13 16:35 被阅读569次

作者:邹峰立,微博:zrunker,邮箱:zrunker@yahoo.com,微信公众号:书客创作,个人平台:www.ibooker.cc

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

书客创作

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

ZXing使用

先看一下最终效果图:

最终效果图

一、下载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...

导入ZXing库Module1
找到下载到本地的Zxing库,导入。 导入本地的Zxing库2
导入成功工程变化,工程结构图。 工程结构图
2、自己的工程引入Zxing库Module。 第一步 第二步 第三步
这时候引入可能会出现下面的错误情况。 错误情况1
解决办法:这种情况是指目前你的Android Studio Tools版本不支持libzxing中的版本,直接点击下载即可。 错误情况2
解决办法:这种错误是指libzxing中最小版本为16,而在主工程中最小版本为15,所以在修改主工程build.gradle最小版本为16就好。 错误情况3
解决办法:
首先对比对比以下两张图,图一和图二。 libzxing清单文件 自己工程清单文件

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

三、代码实现

1、布局XML

<?xml version="1.0" encoding="utf-8"?>  
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:background="#FFF"  
    android:scrollbars="none">  

    <LinearLayout  
        android:layout_width="match_parent"  
        android:layout_height="wrap_content"  
        android:orientation="vertical">  

        <TextView  
            android:id="@+id/tv_scan_result"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:padding="15dp"  
            android:text="显示扫描结果字符串" />  

        <Button  
            android:id="@+id/btn_scan_barcode"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_gravity="center_horizontal"  
            android:layout_margin="10dp"  
            android:text="扫描二维码" />  

        <EditText  
            android:id="@+id/et_qr_string"  
            android:layout_width="match_parent"  
            android:layout_height="wrap_content"  
            android:inputType="text"  
            android:padding="15dp" />  

        <ImageView  
            android:id="@+id/iv_qr_image"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_gravity="center"  
            android:contentDescription="@null"  
            android:padding="10dp"  
            android:src="@mipmap/ic_launcher" />  

        <CheckBox  
            android:id="@+id/logo"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_margin="15dp"  
            android:text="是否显示logo(图片)" />  

        <Button  
            android:id="@+id/btn_add_qrcode"  
            android:layout_width="wrap_content"  
            android:layout_height="wrap_content"  
            android:layout_gravity="center_horizontal"  
            android:layout_margin="10dp"  
            android:text="生成二维码" />  

    </LinearLayout>  
</ScrollView>  

在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地址
阅读原文


微信公众号:书客创作

相关文章

网友评论

  • a8b570047034:扫描二维码的时候看到二维码都变形了 这个怎么弄
  • 8640e0afcca2:扫描二维码不成功!相机报错,displayFrameworkBugMessageAndExit()
    吾非言:@世界末末日 这是一个IO异常,在Android6.0+版本中,访问相机之前需要动态申请权限,你申请一下相机的权限就可以了。

本文标题:【Android】ZXing二维码扫描与生成

本文链接:https://www.haomeiwen.com/subject/kyjzyxtx.html