当前位置: 首页 > 知识库问答 >
问题:

Android CameraX初始化随机崩溃

公羊凌
2023-03-14

我使用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))

共有1个答案

隗新霁
2023-03-14

我提供的代码段位于onCreate()中,而它本应位于onResume()中。

事实上,即使视图已经在onCreate()中初始化,它们也不一定准备好显示,因为在onResume()回调之前活动并没有真正运行。

随机性来自于这样一个事实,即我只有1个活动,所以onCreative()和onResume()调用在时间上非常接近。

此链接提供有用的信息,以更好地理解活动生命周期。

 类似资料:
  • 我正在我的应用程序中使用CameraX API。我已经将预览用例和ImageAnalysis用例绑定到活动生命周期,如 该应用程序大部分时间都可以工作,但会随机崩溃以下日志 2020-01-17 11:24:47.411 6581-6614/com。我的应用程序D/摄像头:重置捕获会话 2020-01-17 11:24:47.411 6581-6614/com.my.appD/相机:关闭状态下的释

  • 我有一个概率问题: 在任何一天,埃里克要么是快乐的(C),要么是马马虎虎的(S),要么是闷闷不乐的(G)。 如果他今天很高兴,那么他明天将是C、S或G,相应的概率为0.5、0.3、0.2。 如果他今天感觉一般,那么他明天会是C,S或G,概率是0.3,0.4,0.3。 如果他今天闷闷不乐,那么他明天会是C,S或G,概率是0.2,0.2,0.6。 我在R中生成了50,000个独立的伪随机数(均匀的),

  • 经过一些调试,我找到了这行代码 导致我的应用程序崩溃,我已经尝试过了 ; 但结果还是一样,有什么帮助吗??

  • Initialization 初始化 Although it doesn’t look superficially very different from initialization in C or C++, initialization in Go is more powerful. Complex structures can be built during initialization a

  • 初始化是为类、结构体或者枚举准备实例的过程。这个过需要给实例里的每一个存储属性设置一个初始值并且在新实例可以使用之前执行任何其他所必须的配置或初始化。 你通过定义初始化器来实现这个初始化过程,它更像是一个用来创建特定类型新实例的特殊的方法。不同于 Objective-C 的初始化器,Swift 初始化器不返回值。这些初始化器主要的角色就是确保在第一次使用之前某类型的新实例能够正确初始化。 类类型的