解决 CameraX 报错:Must call CameraX.initialize() first

报错信息如下:

Caused by: java.lang.IllegalStateException: java.util.concurrent.ExecutionException: java.lang.IllegalStateException: Must call CameraX.initialize() first
        at androidx.camera.core.CameraX.waitInitialized(CameraX.java:862)
        at androidx.camera.core.CameraX.checkInitialized(CameraX.java:753)
        at androidx.camera.core.CameraX.getSurfaceManager(CameraX.java:534)
        at androidx.camera.core.Preview$Defaults.(Preview.java:491)
        at androidx.camera.core.Preview.(Preview.java:137) 
        at androidx.camera.core.Preview$Builder.build(Preview.java:591) 
        at ltd.xsfu.app.happlyface.MainActivity.onCreate(MainActivity.kt:39) 

首先,项目必须依赖以下4个 camearx 库:

dependencies {
    val cameraXVersion = "1.0.0-alpha10"
    implementation("androidx.camera:camera-core:$cameraXVersion")
    implementation("androidx.camera:camera-camera2:$cameraXVersion")
    implementation("androidx.camera:camera-lifecycle:$cameraXVersion")
    implementation("androidx.camera:camera-view:1.0.0-alpha07")
} 

然后,自定义的 Application 必须实现 CameraXConfig.Provider 接口:

class HappyFaceApplication : Application(), CameraXConfig.Provider {
    override fun onCreate() {
        super.onCreate()
    }

    override fun getCameraXConfig(): CameraXConfig {
        return Camera2Config.defaultConfig()
    }
}

最后,ProcessCameraProvider.getInstance(this) 必须要在构造 Preview 、ImageCapture、ImageAnalysis 之前:

// 该方法一定要在构造 Preview 、ImageCapture、ImageAnalysis 之前
cameraProviderFuture = ProcessCameraProvider.getInstance(this)

// 预览
val preview = Preview.Builder().build()
preview.setSurfaceProvider(viewBinding.previewView.previewSurfaceProvider)

// 拍照
val capture = ImageCapture.Builder().build()

// 分析
val analysis = ImageAnalysis.Builder().build()

// 可以放在需要的地方进行初始化
cameraProviderFuture.addListener(Runnable {
    val cameraProvider = cameraProviderFuture.get()
    cameraProvider.bindToLifecycle(
        this@MainActivity as LifecycleOwner,
        CameraSelector.DEFAULT_FRONT_CAMERA,
        preview,
        capture,
        analysis
    )
}, ContextCompat.getMainExecutor(this))

你可能感兴趣的:(Android)