之前使用过Zxing扫描二维码,一直是好用的。方法是:
1.在build文件中添加依赖#
dependencies {
//ZXing
implementation ‘com.google.zxing:core:3.3.3’
implementation(‘com.journeyapps:zxing-android-embedded:3.6.0’) { transitive = false }
2.之后只需要一行代码就可以调用扫码功能#
new IntentIntegrator(this).initiateScan();
然后在当前的Activity中重写onActivityResult去获取结果就ok了。
可是,最近开发一个新的项目,使用上述方法扫码的时候却闪退了。看了之前的项目代码,没有什么不一样的地方,而且之前的项目扫码依旧好用,真是百思不得其解。
打开android studio 里面的module setting,发现zxing:core 和zxing-android-embedded都有新版本了,于是就升级到新版本,这时候没有修改之前的任何代码,扫码画面可以出来了,但是扫码之后,返回的结果却是空,什么也没有,而且代码中IntentIntegrator被划上了横线,说是废弃了。建议用ScanOptions和ScanContract替代。
到bing,百度上查了半天,也没有找到解决方法,同样也没有找到能看懂的新版本的用法。想去谷歌查一下,那里总是能得到想要的结果,但是谷歌打不开啊…,why?…
难道是版本升级的问题?
到github上看了一下zxing-android-embedded,发现有好多版本,于是下载了zxing-android-embedded-master.zip ,看了其中的readme,里面是这样写的:
## Older SDK versions
By default, only SDK 24+ will work, even though the library specifies 19 as the minimum version.
For SDK versions 19+, one of the changes below are required.
Some older SDK versions below 19 may work, but this is not tested or supported.
### Option 1. Downgrade zxing:core to 3.3.0
“`groovy
repositories {
mavenCentral()
}
dependencies {
implementation(‘com.journeyapps:zxing-android-embedded:4.3.0’) { transitive = false }
implementation ‘com.google.zxing:core:3.3.0’
}
我的sdk是21,应该使用这段说明中的代码吧。于是照着改了一下,那么这个新的版本如何扫码呢?里面是这样写的:
## Usage with ScanContract
Note: `startActivityForResult` is deprecated, so this example uses `registerForActivityResult` instead.
See for details: https://developer.android.com/training/basics/intents/result
`startActivityForResult` can still be used via `IntentIntegrator`, but that is not recommended anymore.
“`java
// Register the launcher and result handler
private final ActivityResultLauncher<ScanOptions> barcodeLauncher = registerForActivityResult(new ScanContract(),
result -> {
if(result.getContents() == null) {
Toast.makeText(MyActivity.this, “Cancelled”, Toast.LENGTH_LONG).show();
} else {
Toast.makeText(MyActivity.this, “Scanned: ” + result.getContents(), Toast.LENGTH_LONG).show();
}
});
// Launch
public void onButtonClick(View view) {
barcodeLauncher.launch(new ScanOptions());
}
“`
Customize options:
“`java
ScanOptions options = new ScanOptions();
options.setDesiredBarcodeFormats(ScanOptions.ONE_D_CODE_TYPES);
options.setPrompt(“Scan a barcode”);
options.setCameraId(0); // Use a specific camera of the device
options.setBeepEnabled(false);
options.setBarcodeImageEnabled(true);
barcodeLauncher.launch(options);
“`
See [BarcodeOptions][5] for more options.
看来原来的IntentIntegrator是被废弃了,应该用上面的写法。
但是,我没有改之前的代码,之前是这样写的:
try {
IntentIntegrator intentIntegrator = new IntentIntegrator(this);
intentIntegrator.setPrompt(“Please Scan the QR Code “);
intentIntegrator.setOrientationLocked(true);
intentIntegrator.setBeepEnabled(true);
intentIntegrator.setDesiredBarcodeFormats(IntentIntegrator.QR_CODE);
//intentIntegrator.setTimeout(60000);
intentIntegrator.initiateScan();
}
catch (Exception e)
{
Toast t= Toast.makeText(MainActivity.this,e.getMessage(),Toast.LENGTH_LONG);
t.show();
Log.e(“test”,e.getMessage());
}
然后测试了一下,居然好用了。看来要用最新版本的zxing-android-embedded才行。之前的版本莫名其妙的不好用了,谁能告诉我原因呢?看来还是要去github上第三方库的文档。
zxing-android-embedded是什么呢?
zxing是谷歌开源的让开发者更方便使用摄像头的库,而我们常用的扫码功能就是其中之一。
github地址:https://github.com/zxing/zxing
但是因为zxing的功能太强大了,包含了很多我们用不上的功能,所以一般都会抽取其中的扫码功能单独使用,这个抽取的过程还是有点麻烦的,但是已经有很多开发者为我们省去了这个过程,而zxing-android-embedded就是一个很棒的第三方zxing库。它就是一个第三方zxing库,让我们能够简单的调用zxing功能。
github地址:https://github.com/journeyapps/zxing-android-embedded