作者:邹峰立,微博:zrunker,邮箱:[email protected],微信公众号:书客创作,个人平台: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库,导入。
导入成功工程变化,工程结构图。
2、自己的工程引入Zxing库Module。
这时候引入可能会出现下面的错误情况。
解决办法:这种情况是指目前你的Android Studio Tools版本不支持libzxing中的版本,直接点击下载即可。
解决办法:这种错误是指libzxing中最小版本为16,而在主工程中最小版本为15,所以在修改主工程build.gradle最小版本为16就好。
解决办法:
首先对比对比以下两张图,图一和图二。
导入过程中可能会出现引入失败的情况。下载好的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地址
阅读原文