ZXing是一个可以生成和解析多种格式的1D/2D条形码的开源类库,采用Java实现。Android和JavaSE可以集成使用。
示例运行效果如下:
网上流传的关于ZXing的代码库很多,但几乎都是很老的版本了。而ZXing一直在更新和优化,当前最新版本已经到3.2.1,我们可以在github上下载到最新的代码库。
ZXing项目地址:
https://github.com/zxing/zxing
如果想要最新的release版本,可以在如下的链接找到:
https://github.com/zxing/zxing/releases
代码库下载下来后,会发现里面包含的代码很多。在Android集成中,我们只需要下面三个部分。
core:解码库的核心模块,无论是Android还是JavaSE在集成时都需要使用到。内部代码包名com.google.zxing。
android-core:android模块需要使用到,里面只有一个类com.google.zxing.client.android.camera.CameraConfigurationUtils。
android:集成到Android客户端需要使用的模块。内部代码包名com.google.zxing.client。
将上面三个模块集中到一起,工程就可以运行起来了。
一、扫描二维码
我们在添加扫描二维码功能时,只需使用CaptureActivity类即可。如果需要定制扫描窗口,可修改ViewfinderView类。
(1).CaptureActivity类
该类在.client.android包下,负责显示扫描界面和对二维码解析结果的处理,是我们在导入该库时需要使用的类。
打开capture.xml可以看到,该界面由SurfaceView和ViewfinderView组成。
<merge xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools">
<SurfaceView android:id="@+id/preview_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
<com.google.zxing.client.android.ViewfinderView
android:id="@+id/viewfinder_view"
android:layout_width="fill_parent"
android:layout_height="fill_parent"/>
</merge>
SurfaceView全屏显示摄像头拍摄的图像,ViewfinderView绘制扫描窗口。
DecodeHandler类在decode()方法执行完成时,会向CaptureActivityHandler发送消息,如果是解析成功,会调用CaptureActivity类的handleDecode()方法。在handleDecode()方法中,可以获取到解析结果。在该方法内部,我们可以添加自己的代码,比如在获取到结果后执行页面跳转。
public void handleDecode(Result rawResult, Bitmap barcode, float scaleFactor) {
ResultHandler resultHandler = ResultHandlerFactory.makeResultHandler(this, rawResult);
CharSequence code = resultHandler.getDisplayContents();
// add your code
}
(2).ViewfinderView类
该类在.client.android包下,负责绘制扫描窗口。
如果需要定制窗口的大小,扫描线条的颜色,闪烁小圆点的颜色等,可以修改此类的onDraw()方法。
二、生成二维码
生成二维码,可参考EncodeActivity类。EncodeActivity类在.client.android.encode包下,接收一个字符串并将对应的二维码显示出来。
使用如下方法,传入需要生成二维码的字符,即可启动EncodeActivity类生成二维码。
private void startEncodeActivity(String text) {
Intent intent = new Intent(Intents.Encode.ACTION);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET);
intent.putExtra(Intents.Encode.TYPE, Contents.Type.TEXT);
intent.putExtra(Intents.Encode.DATA, text);
intent.putExtra(Intents.Encode.FORMAT, BarcodeFormat.QR_CODE.toString());
startActivity(intent);
}
在EncodeActivity类中,调用的是QRCodeEncoder类来生成二维码图片的Bitmap对象。
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder(this, intent, dimension, useVCard);
Bitmap bitmap = qrCodeEncoder.encodeAsBitmap();
最后附上ZXing的工程代码:
http://download.youkuaiyun.com/detail/ruancoder/9607915