我已经在我的应用程序中实现了 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()
}
一旦分析器获得有效代码,我只需要关闭相机和活动
此外,如果我在扫描仪活动相机预览关闭然后重新打开并且必须再次按下该返回按钮以完成此扫描仪活动时,请按下返回按钮。
所以它不仅仅是条码监听器。它也发生在返回按钮上。