Android CameraX 初始化随机崩溃
Android CameraX initialization crashes randomly
我正在使用 CameraX 用例在屏幕上显示来自摄像头的图像,同时对其执行对象检测。您可以在下面找到与 CameraX 相关的代码,位于我的主 activity.
的 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))
我提供的代码片段位于 onCreate() 中,而它本应位于 onResume() 中。
事实上,即使Views已经在onCreate()中初始化了,它们也不一定准备好显示,因为activity实际上运行直到onResume()回调。
随机性来自于我只有 1 个 Activity,因此 onCreate() 和 onResume() 调用的时间非常接近。
This link 提供有用的信息以更好地理解 activity 生命周期。
我正在使用 CameraX 用例在屏幕上显示来自摄像头的图像,同时对其执行对象检测。您可以在下面找到与 CameraX 相关的代码,位于我的主 activity.
的 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))
我提供的代码片段位于 onCreate() 中,而它本应位于 onResume() 中。
事实上,即使Views已经在onCreate()中初始化了,它们也不一定准备好显示,因为activity实际上运行直到onResume()回调。
随机性来自于我只有 1 个 Activity,因此 onCreate() 和 onResume() 调用的时间非常接近。
This link 提供有用的信息以更好地理解 activity 生命周期。