1

我已经在我的应用程序中实现了 QR 扫描仪。我使用了 Firebase MLKit 并尝试了 Zxing Scanner。

我开始运行 qr 扫描仪的新活动。一旦它检测到有效的二维码,它就会完成扫描器活动并将结果发送回之前的活动。

一切正常,没有任何错误。

但是android中的Camera可能存在小错误。

在获得有效的二维码后,相机会关闭一秒钟然后再次启动,并在一两秒钟后关闭,然后活动完成并将结果返回到先前的活动。

我已经尝试过 Camera、Camera2、Zxing Core、MLKit 以及所有可能的组合。每次发生同样的事情。

我还尝试了几个 Github Repos MLKitQRScanner、KotlinFirebaseMLKitQRRealtimeDemo、QRCodeCameraX、QRScannerCameraX

这是使用 CameraX,但我也尝试了 android 中较旧的相机 api,结果相同

我认为问题出在相机预览上,但我尝试了 camera2 和 cameraX api。两者都给出相同的输出。所以它可能是代码中的东西。

活动

var analyzerHandler: Handler? = null
var analysis: ImageAnalysis? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_scanner_x)

    context = this

    Dexter.withActivity(this)
        .withPermissions(Manifest.permission.CAMERA)
        .withListener(object : MultiplePermissionsListener {
            override fun onPermissionsChecked(report: MultiplePermissionsReport?) {
                textureView.post {
                    val metrics = DisplayMetrics().also { textureView.display.getRealMetrics(it) }
                    val screenAspectRatio = Rational(metrics.widthPixels, metrics.heightPixels)

                    val previewConfig = PreviewConfig.Builder().apply {
                        setTargetAspectRatio(screenAspectRatio)
                        setTargetRotation(textureView.display.rotation)
                        setLensFacing(CameraX.LensFacing.BACK)
                    }.build()

                    val analysisConfig = ImageAnalysisConfig.Builder().apply {
                        setImageReaderMode(ImageAnalysis.ImageReaderMode.ACQUIRE_LATEST_IMAGE)
                        val analyzerThread = HandlerThread("BarcodeFirebaseAnalyzer").apply { start() }
                        analyzerHandler = Handler(analyzerThread.looper)
                        setCallbackHandler(analyzerHandler!!)
                        setTargetAspectRatio(screenAspectRatio)
                        setTargetRotation(textureView.display.rotation)
                        setLensFacing(CameraX.LensFacing.BACK)
                    }.build()

                    val preview = AutoFitPreviewBuilder.build(previewConfig, textureView)
                    analysis = ImageAnalysis(analysisConfig)

                    val googlePlayServicesAvailable = GoogleApiAvailability.getInstance().isGooglePlayServicesAvailable(context)
                    if (googlePlayServicesAvailable == ConnectionResult.SUCCESS) {
                        analysis!!.analyzer = BarcodeFirebaseAnalyzer { barcode ->
                            toAddAuth(barcode) //THIS RUNS ONCE VALID QR CODE IS THERE. ITS JUST INTENT TO SEND BACK THE RESULT FOR startActivityForResult
                        }
                    } else {
                        analysis!!.analyzer = BarcodeZxingAnalyzer { barcode ->
                            toAddAuth(barcode)
                        }
                    }

                    CameraX.bindToLifecycle(this@ScannerX, preview, analysis)
                }
            }

            override fun onPermissionRationaleShouldBeShown(permissions: MutableList<PermissionRequest>?, token: PermissionToken?) {
                //
            }
        }).check()
}


override fun onResume() {
    super.onResume()
    textureView.postDelayed({
        textureView.systemUiVisibility = flagsFullscreen
    }, immersiveFlagTimeout)
}

override fun onDestroy() {
    analyzerHandler?.removeCallbacksAndMessages(null)
    analyzerHandler?.looper?.quitSafely()
    analysis?.analyzer = null
    super.onDestroy()
}

一旦分析器获得有效代码,我只需要关闭相机和活动

此外,如果我在扫描仪活动相机预览关闭然后重新打开并且必须再次按下该返回按钮以完成此扫描仪活动时,请按下返回按钮。

所以它不仅仅是条码监听器。它也发生在返回按钮上。

4

2 回答 2

2

这是二维码的要点,如果对您有帮助,请告诉我

// QR Code - XZing
implementation 'com.dlazaro66.qrcodereaderview:qrcodereaderview:2.0.3'

二维码 Gist 文件

不要忘记添加权限

   <uses-permission android:name="android.permission.CAMERA"/>

干杯

于 2019-09-05T04:23:59.687 回答
0

[解决了]

我不知道究竟是什么导致了这个问题,但不知何故,整个事情在 Activity 中不起作用。

CameraX.bindToLifecycle 有一些奇怪的错误,它弄乱了 Activity LifeCycle。

在 Fragment 中实现所有内容确实解决了这个问题。唯一的事情是必须将所有与相机相关的东西保留在片段中。当它完成活动并将扫描结果返回到以前的活动时,最好在托管片段的活动中进行。

于 2019-09-06T03:48:46.117 回答