首页 > 解决方案 > 如何解决CameraX闪屏问题

问题描述

在 1.0.0-beta03 CameraX 版本之前,我使用的是 1.0.0-alpha06 版本,图像分析和条形码扫描对我来说效果很好。现在在较新的版本上,它并不总是有效,因为相机预览有时会闪烁,并且图像最终不够清晰,无法检测到条形码。

看看我附上的图片。屏幕是黑色的,目的是为了能够看到差异。 alpha06 beta03

我认为问题在于相机占用了太多内存。我注意到,如果我清除在后台运行的应用程序并重新启动应用程序,相机质量会变得更好,不会出现这种屏幕闪烁。当我这样做时,它仅从我的应用程序中就说“释放了 200mb 内存”。我无法一直重现闪烁的错误,但我所做的是杀死应用程序,重新启动并最终开始闪烁。在我的BarcodeScanFragment 中,这里是我的 onDestroy

override fun onDestroy() {
    super.onDestroy()
    // I call cameraUtil.unbindCamera() which executes code below:
    cameraProvider?.unbindAll()
    cameraExecutor?.shutdown()
}

这是我的CameraUtil(用于为不同片段初始化相机)setupCameraX函数:

fun setupCameraX(previewView: PreviewView,fragment:Fragment, analyzer:ImageAnalysis.Analyzer?) {
        previewView.preferredImplementationMode = PreviewView.ImplementationMode.TEXTURE_VIEW
        val cameraProviderFuture = ProcessCameraProvider.getInstance(fragment.context!!)
        val rotation = previewView.display.rotation
        cameraExecutor = Executors.newSingleThreadExecutor()

        cameraProviderFuture.addListener(Runnable {
            cameraProvider = cameraProviderFuture.get()
            val cameraSelector = CameraSelector.Builder().requireLensFacing(CameraSelector.LENS_FACING_BACK).build()
            val preview = Preview.Builder().setTargetRotation(rotation).build()
            preview.setSurfaceProvider(previewView.createSurfaceProvider(null))

            var useCase:UseCase?=null
            if(analyzer==null){
                imageCapture = ImageCapture.Builder()
                        .setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
                        .setTargetRotation(previewView.display.rotation)
                        .build()
                useCase = imageCapture!!
            }else{
                val imageAnalysis = ImageAnalysis.Builder()
                        .setTargetRotation(rotation)
                        .build()
                        .also{
                            it.setAnalyzer(cameraExecutor!!, analyzer)
                        }
                useCase = imageAnalysis
            }


            cameraProvider?.unbindAll()

            try{
                camera = cameraProvider?.bindToLifecycle(fragment, cameraSelector, preview,useCase)
                preview.setSurfaceProvider(previewView.createSurfaceProvider(camera?.cameraInfo))
            }catch(ex: Exception){
                Log.e("error",ex.message,ex)
            }
        }, ContextCompat.getMainExecutor(fragment.context))
    }

我一定要打电话

cameraProvider?.unbindAll()

使之前的camerax用例不受约束

编辑:设备华为 P smart 2019

标签: androidkotlinandroid-camerax

解决方案


就我而言,只有当我从后堆栈中弹出一个片段时,我才会遇到闪烁。

我正在使用相机 x 版本 1.0.0-beta05

最后,我可以通过删除此行来解决此闪烁问题

previewView.preferredImplementationMode = PreviewView.ImplementationMode.TEXTURE_VIEW

推荐阅读