扫码已经是一个应用的必备功能,但是随着手机性能和安卓版本的更新迭代,Android系统的从Camera,Camera2到最新的CameraX,可是ZBar和ZXing还是唯二的选择,在cameraX中已经找不到采用ZBar来进行扫码的Demo了。 !_!

起因
新款的一加8Plus在使用扫码的时候出现了无法对焦的问题,尝试了手动,自动对焦都无法解决问题。在走投无路的情况下,参考了CameraX扫码二维码 和CameraX拍照,将项目中之前采用camera和ZBar实现的扫码二维码和条形码,修改为使用CameraX和ZXing来实现。
能够基本实现功能,但是采坑之路也开始了。
ZXing 扫码条形码不支持竖屏
条形码的识别速度太慢了,不管怎么跳都不行。然后就发现竖屏的时候几乎无法识别,横屏的时候概率高点。整体比ZBar的识别速度相差好几个层次。
大家慎用。
ZXing最新版本3.4.0版本最低支持到Android 7.0
查看了现在国内常用的APP的最新支持都是android 5.0,但是ZXing的最新版本支持到Android 7.0. 在收到了好多崩溃后才发现。在ZXing开发说明中提到了
### android/
The Android SDK must be installed of course. Run the tool called `sdkmanager`
and ensure that platform support for the Android release targeted by the app is installed.
At the time of this writing, that's platform level 22 / Android 5.1.
export ANDROID_HOME=/change/this/path/to/android-sdk
Note that release 3.4.0 and later requires Java 8, which requires targeting API level 24 or later. For a possible way to use it with earlier API levels, see
[https://github.com/zxing/zxing/wiki/Frequently-Asked-Questions#it-doesnt-work-with-java-7--no-interface-method-sortljavautilcomparator](https://github.com/zxing/zxing/wiki/Frequently-Asked-Questions#it-doesnt-work-with-java-7--no-interface-method-sortljavautilcomparator)
or simply use an earlier release.
所以手机是安卓7.0以下的,都会出现崩溃。
报错日志为:
java.lang.NoSuchMethodError: No interface method sort(Ljava/util/Comparator;)V in class Ljava/util/List; or its super classes (declaration of 'java.util.List' appears in /system/framework/core-libart.jar)
at com.google.zxing.qrcode.detector.FinderPatternFinder.com.google.zxing.qrcode.detector.FinderPattern[] selectBestPatterns()(FinderPatternFinder.java:616)
at com.google.zxing.qrcode.detector.FinderPatternFinder.com.google.zxing.qrcode.detector.FinderPatternInfo find(java.util.Map)(FinderPatternFinder.java:164)
at com.google.zxing.qrcode.detector.Detector.com.google.zxing.common.DetectorResult detect(java.util.Map)(Detector.java:81)
at com.google.zxing.qrcode.QRCodeReader.com.google.zxing.Result decode(com.google.zxing.BinaryBitmap,java.util.Map)(QRCodeReader.java:77)
at com.google.zxing.MultiFormatReader.com.google.zxing.Result decodeInternal(com.google.zxing.BinaryBitmap)(MultiFormatReader.java:173)
at com.google.zxing.MultiFormatReader.com.google.zxing.Result decode(com.google.zxing.BinaryBitmap)(MultiFormatReader.java:57)
at com.*.util.camerax.QRcodeAnalyzer.void analyze(androidx.camera.core.ImageProxy)(QRcodeAnalyzer.java:63)
at androidx.camera.core.ImageAnalysisAbstractAnalyzer.null lambda$analyzeImage$0$ImageAnalysisAbstractAnalyzer(null)(ImageAnalysisAbstractAnalyzer.java:87)
at androidx.camera.core.-$$Lambda$ImageAnalysisAbstractAnalyzer$V6Gtux2-h8spda8vf4wFnIZntYI.null run(null)(-.java)
at java.util.concurrent.ThreadPoolExecutor.null runWorker(null)(ThreadPoolExecutor.java:1113)
at java.util.concurrent.ThreadPoolExecutor$Worker.null run(null)(ThreadPoolExecutor.java:588)
at java.lang.Thread.null run(null)(Thread.java:818)
CameraX的数据处理在线程中执行
碰到一个在Android10上CameraX扫码后分析数据并上传到服务器,请求网络都没有成功过,感到百思不起姐,然后不断的添加log并一直怀疑人生。在Android10以下都是正常的。(小米手机没有sim卡,不能USB安装app,一天通过传送apk包,然后安装几十次,好吐血)
直到代码运行到
mHandler = new ProgressDialogHandler(view);
然后就结束了,之后的日志没有再打印。也没有任何报错,用Charles抓包一直提示“javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found”,一度以为是SSL证书的问题,但是除了在CameraX界面,其他页面访问网络又是好的,崩溃啊。
最后将创建Hander注释,一切运行正常。MY GOD。 请问为啥在Android10以下为啥是好的,不都是一样的问题吗?
最后将处理扫码结果放到UI线程处理,一切正常。
选择CameraX进行扫码请慎重。
// END 有时候忙的很开心,有时候忙的很慌乱。
网友评论