问题通常出现在CameraX中使用的CameraFragment或CameraView被恢复时。可以通过在onPause()方法中调用CameraProvider.unbindAll()和在onResume()方法中重新绑定来解决此问题。以下是一个示例代码:
private lateinit var cameraProvider: ProcessCameraProvider
override fun onResume() {
super.onResume()
bindCameraUseCases()
}
override fun onPause() {
super.onPause()
cameraProvider.unbindAll()
}
private fun bindCameraUseCases() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(requireContext())
cameraProviderFuture.addListener({
// Used to bind the lifecycle of cameras to the lifecycle owner
cameraProvider = cameraProviderFuture.get()
// Set up the preview use case to display camera preview in the viewfinder
val preview = Preview.Builder()
.build()
// Choose the camera by requiring a lens facing
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
try {
// Unbind use cases before rebinding
cameraProvider.unbindAll()
// Bind use cases to camera
cameraProvider.bindToLifecycle(
this, cameraSelector, preview)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(requireContext()))
}