使用 ZXing Android Embedded 实现二维码扫码

晚上折腾了一个Android上的二维码扫码功能。基于封装之后的 ZXing Android Embedded 库,原型是 Google 做的一个开源项目,叫做 ZXing(zebra crossing),Logo 是下面这匹二维马。

ZXing 本身是提供直接通过 Intent 调用 的方式来实现扫码功能的,所以 ZXing Android Embedded 库也可以直接以调用 Intent 的形式进行,显得格外简洁。同时它既提供了现成的界面,也可以 充分自定义,各取所需,极为方便。

导入

使用最新版的 Android Studio ,新建一个 Project ,包含一个 Blank Activity 即可,要求 sdkVersion 在23以上。

打开 module 的 build.gradle 文件,在最外层添加下述代码:

repositories {
jcenter()
}

dependencies 中添加下述项:

compile 'com.journeyapps:zxing-android-embedded:3.2.0@aar'
compile 'com.google.zxing:core:3.2.1'

点击上方自动出现的 Try again 或者手动 Sync 一下 Gradle 就可以了。

上述代码以 官方文档 最新的版本为准。

使用

在 MainActivity 的 onCreate 方法中写入下述代码。运行时如果可以出现扫码窗口,则为导入成功:

new IntentIntegrator(this).initiateScan();

可以调整参数如下:

IntentIntegrator integrator = new IntentIntegrator(this);
integrator.setPrompt("请扫描"); //底部的提示文字,设为""可以置空
integrator.setCameraId(0); //前置或者后置摄像头
integrator.setBeepEnabled(false); //扫描成功的「哔哔」声,默认开启
integrator.initiateScan();

竖屏

默认是横屏的,如果要调整成竖屏,新建一个 Empty Activity(我命名为 ScanActivity),内容如下:

import com.journeyapps.barcodescanner.CaptureActivity;
public class ScanActivity extends CaptureActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
}

打开 AndroidManifest.xml 文件,编辑 ScanActivity 属性如下:

<activity 
android:name=".ScanActivity"
android:screenOrientation="portrait"
android:stateNotNeeded="true"
android:theme="@style/zxing_CaptureTheme"
android:windowSoftInputMode="stateAlwaysHidden"
/>

在前述调整参数的代码段中添加一句:

intentIntegrator.setCaptureActivity(ScanActivity.class);

返回

onActivityResult 接收返回的结果:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intent) {
IntentResult result = IntentIntegrator.parseActivityResult(requestCode, resultCode, intent);
if(result != null) {
if(result.getContents() == null) {
Log.d(TAG, "Cancelled");
Toast.makeText(this, "Cancelled", Toast.LENGTH_LONG).show();
} else {
Log.d(TAG, "Scanned: " + result.getContents());
Toast.makeText(this, "Scanned: " + result.getContents(), Toast.LENGTH_LONG).show();
}
}
}

下面放一个简单的二维码,需要测试的可以一用: