这篇博客是学习完 Google 员工的 zxing 开源项目后所写。如有不妥之处,欢迎留言,谢谢~

业内都说没有二维码扫描及生成的 APP,不是一个好的 APP,为了不掉队,学习了 Google 员工的 zxing 的开源项目。由于本人能力有限, zxing 项目实在超出了本人的范围,我只选取了 二维码扫描、解析及生成的代码。

前言

将二维码集成到 APP 中已经是一件在正常不过的事,所以我就不多介绍二维码的重要性那些了。直接开始吧~


演示

依我个人而言,我喜欢先看到效果,才有动力继续往下看。

zxing的简单使用演示

zxing

项目地址GitHub传送门

zxing 是一个开源 Java 类库用于解析多种格式的 1D/2D 条形码、二维码。目标是能够对 QR 编码、Data Matrix、UPC 的 1D 条形码进行解码。 其提供了多种平台下的客户端包括:Java SE 和 Android。


本博文将介绍:

1、扫描二维码:点击按钮,跳转到 zxing 中的 Activity 去扫描,并将得到的结果显示到 TextView

2、解析二维码:长按二维码,进行解析,并将二维码中的内容弹 Toast 提示

3、生成二维码:点击按钮,将 http://www.liuguangmingcn.com 生成二维码,并显示出来


zxing 的简单使用

为了方便使用,已将其抽取出来成一个 module 基于 zxing 3.2.1 的。可直接 import 到 项目中使用。lib_zxing 传送门

1.导入 lib_zxing ,设置为 module;

1
compile project(':lib_zxing')

2.扫描二维码,核心代码

1
2
3
4
5
6
7
8
9
10
private static final int REQUEST_CODE = 0;
/* 扫描二维码按钮 */
mBtnScan.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent(MainActivity.this, CaptureActivity.class);
startActivityForResult(intent, REQUEST_CODE);
}
});

tips:大家应该注意到了,这里使用了 startActivityForResult ,明显需要重写 onActivityResult,用于回到扫描得到的结果。

1
2
3
4
5
6
7
8
9
10
11
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
// CaptureActivity中使用RESULT_OK作为结果返回码
if (resultCode == RESULT_OK) { // RESULT_OK == -1
Bundle bundle = data.getExtras();
// CaptureActivity中使用"result"作为 key
String scanResult = bundle.getString("result");
mTvScanResult.setText("扫描结果: " + scanResult);
}
}

3.生成二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/* 生成二维码按钮 */
mBtnCreate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
try {
/**
* 第一个参数:内容
* 第二个参数:二维码图片的长宽(其实是正方形)
*/
Bitmap bitmap = QRCodeEncoder.encodeAsBitmap("http://www.liuguangmingcn.com", 500);
mIvCreateBarcode.setImageBitmap(bitmap);
} catch (WriterException e) {
e.printStackTrace();
}
}
});

4.解析二维码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
private static final Map<DecodeHintType, ?> HINTS = new EnumMap<>(DecodeHintType.class);
/* 长按二维码时,解析二维码数据 */
mIvCreateBarcode.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View view) {
// 开启cache
mIvCreateBarcode.setDrawingCacheEnabled(true);
// 通过cache机制获取缓存图片
Bitmap bitmap = Bitmap.createBitmap(mIvCreateBarcode.getDrawingCache());
// 关闭cache.获取cache通常会占用一定的内存,所以通常不需要的时候有必要对其进行清理.
// 通过destroyDrawingCache或setDrawingCacheEnabled(false)实现。
mIvCreateBarcode.setDrawingCacheEnabled(false);
decodeQRCode(bitmap);
return true;
}
});
/**
* 解析二维码.因为解析可能会耗时,所以使用了AsyncTask进行处理
*
* @param bitmap 带解析的二维码图片
*/
private void decodeQRCode(final Bitmap bitmap) {
new AsyncTask<Void, Void, String>() {
@Override
protected String doInBackground(Void... params) {
try {
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int[] pixels = new int[width * height];
bitmap.getPixels(pixels, 0, width, 0, 0, width, height);
// 将 ARGB 像素阵列转换为 RGB
RGBLuminanceSource source = new RGBLuminanceSource(width, height, pixels);
// 进行解码
Result result = new MultiFormatReader().decode(
new BinaryBitmap(new HybridBinarizer(source)), HINTS);
return result.getText();
} catch (Exception e) {
runOnUiThread(new Runnable() {
@Override
public void run() {
Toast.makeText(MainActivity.this, "解析出错.", Toast.LENGTH_SHORT).show();
}
});
return null;
}
}

zxing 中的二维码扫描、解析、生成的简单使用到此就结束了。

由于权限问题,需要将 targetSdkVersion 设置为低于 23。


项目地址

Demo传送门

lib_zxing 传送门


参考博文:
zxing源码分析——QR码部分

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


作者简介

刘广明(@cnLGMing),一步一步往上爬。

个人博客GitHub知乎

邮箱:liuguangmingcn@163.com

文章若有不对之处,欢迎指正,谢谢~

版权声明:原创作品,转载时请务必注明原始出处。

留言