【问题标题】:Android CameraX initialization crashes randomlyAndroid CameraX 初始化随机崩溃
【发布时间】:2023-03-20 10:00:02
【问题描述】:

我正在使用 CameraX 用例在屏幕上显示来自相机的图像,同时对其执行对象检测。您可以在下面找到与 CameraX 相关的代码,位于我的主要活动的 onCreate() 函数中。

尽管如此,我在某些(比如说 1/5)应用初始化时遇到错误,在工作和非工作情况之间没有任何代码或二进制修改:

java.lang.NullPointerException: previewView.display must not be null

如果我尝试不访问 previewView.display 以避免崩溃,我只会得到空白裁剪的图像,直到我重新启动应用程序。

似乎与视图初始化和 useCaseGroup 有关,但我无法弄清楚为什么我在连续应用启动时得到不同的结果。

val cameraProviderFuture = ProcessCameraProvider.getInstance(this)

    cameraProviderFuture.addListener(Runnable {
        // Used to bind the lifecycle of cameras to the lifecycle owner
        val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()

        // Preview
        val preview = Preview.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(***previewView.display.rotation)
            .build()
            .also {
                it.setSurfaceProvider(previewView.surfaceProvider)
            }

        val imageAnalyzer = ImageAnalysis.Builder()
            .setTargetAspectRatio(AspectRatio.RATIO_4_3)
            .setTargetRotation(previewView.display.rotation)
            .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
            .build()
            .also {
                it.setAnalyzer(
                    cameraExecutor,
                    PreprocessingAnalyzer(
                        context,
                        extendedBitmapInputStream,
                        previewView
                    )
                )
            }

        val aspectRatio = Rational(previewView.width, previewView.height)
        val viewPort = ViewPort.Builder(aspectRatio, preview.targetRotation).build()
        val useCaseGroup = UseCaseGroup.Builder()
            .addUseCase(preview)
            .addUseCase(imageAnalyzer)
            .setViewPort(viewPort)
            .build()

        // Select back camera as a default
        val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

        cameraProvider.bindToLifecycle(this, cameraSelector, useCaseGroup)

    }, ContextCompat.getMainExecutor(this))

【问题讨论】:

  • 你能粘贴崩溃的整个堆栈跟踪吗?它可能会为正在发生的事情提供更多背景信息。另外,如果你测试the official CameraX sample app,你会遇到同样的问题吗?

标签: android kotlin mobile android-camerax


【解决方案1】:

我提供的 sn-p 位于 onCreate() 中,而它本应位于 onResume() 中。

事实上,即使 View 已经在 onCreate() 中初始化,它们也不一定准备好显示,因为直到 onResume() 回调,Activity 才真正运行。

随机性来自于我只有 1 个 Activity,因此 onCreate() 和 onResume() 调用的时间非常接近。

This link 提供有用的信息以更好地了解活动生命周期。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-08
    • 1970-01-01
    • 2013-04-21
    • 2017-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多