QR 扫描仪相机预览停止并再次启动,然后在读取二维码时关闭

QR Scanner Camera Preview stops and starts again and then shuts down when reads qr code

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

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

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

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

获得有效的二维码后,相机关闭一秒钟然后再次启动,一两秒钟后关闭,然后 activity 完成并且 return 结果与之前的 activity .

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

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

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

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

ACTIVITY

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()
}

我只需要关闭摄像头,activity一旦分析器获得有效代码

另外,如果我按下扫描仪上的后退按钮 ACTIVITY 相机预览会关闭然后重新打开,必须再次按下后退按钮才能完成此扫描仪 ACTIVITY。

所以它不仅仅是条码侦听器。后退按钮也会发生这种情况。

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

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

QR Code Gist File

不要忘记添加权限

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

干杯

[已解决]

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

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

在 Fragment 中实现所有内容确实可以解决问题。唯一的事情就是必须将所有与相机相关的东西保存在片段中。当需要完成 activity 和 return 之前的 activity 扫描结果时,最好在托管片段的 Activity 中进行。