美文网首页
ZXing扫码的两个小坑

ZXing扫码的两个小坑

作者: 蝴蝶之梦天使 | 来源:发表于2020-05-18 19:18 被阅读0次

    扫码已经是一个应用的必备功能,但是随着手机性能和安卓版本的更新迭代,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 有时候忙的很开心,有时候忙的很慌乱。

    相关文章

      网友评论

          本文标题:ZXing扫码的两个小坑

          本文链接:https://www.haomeiwen.com/subject/zxdpohtx.html