You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在CameraX中使用Camera2Config.Extender?求相机状态回调示例

没问题!我给你整理了完整的实现示例,涵盖Camera2Config全局配置、Camera2Config.Extender针对用例的自定义配置,以及获取Camera.State状态回调的方法,直接抄就能用:

一、全局配置Camera2Config

通常我们会在Application类中全局初始化CameraX的Camera2配置,这样整个App的CameraX实例都会遵循这套规则:

class MyCameraApp : Application(), CameraXConfig.Provider {
    override fun getCameraXConfig(): CameraXConfig {
        return Camera2Config.Builder()
            // 可选:设置Camera2的日志级别,方便调试
            .setMinimumLoggingLevel(Log.DEBUG)
            // 可选:配置相机2的特性优先级,比如优先支持某些硬件特性
            .setCamera2ConfigOptions { camera2ConfigOptions ->
                camera2ConfigOptions.setDeviceStateCallbackEnabled(true)
            }
            .build()
    }
}

别忘了在AndroidManifest.xml中指定这个Application:

<application
    android:name=".MyCameraApp"
    ...>
</application>
二、用Camera2Config.Extender自定义单场景配置

如果只需要给特定的相机用例(比如预览、拍照)添加Camera2专属参数,就用Camera2Config.Extender:

// 构建预览用例,并通过Extender添加Camera2配置
val preview = Preview.Builder()
    .apply {
        // 初始化Camera2扩展器
        Camera2Config.Extender(this)
            // 设置自动对焦模式为连续拍照对焦
            .setCaptureRequestOption(
                CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE
            )
            // 设置自动曝光模式为带自动闪光灯
            .setCaptureRequestOption(
                CaptureRequest.CONTROL_AE_MODE,
                CaptureRequest.CONTROL_AE_MODE_ON_AUTO_FLASH
            )
            // 可选:启用Camera2的设备状态回调
            .setDeviceStateCallback(object : CameraDevice.StateCallback() {
                override fun onOpened(camera: CameraDevice) {
                    Log.d("Camera2", "相机设备已打开")
                }

                override fun onDisconnected(camera: CameraDevice) {
                    Log.d("Camera2", "相机设备已断开")
                }

                override fun onError(camera: CameraDevice, error: Int) {
                    Log.e("Camera2", "相机设备错误: $error")
                }
            })
    }
    .build()
三、获取Camera.State状态回调

要拿到androidx.camera.camera2.impl.Camera.State,需要先绑定用例到生命周期,再通过CameraInfo的状态观察者获取:

// 初始化CameraProvider
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener({
    val cameraProvider = cameraProviderFuture.get()

    // 选择后置相机(可替换为前置或其他相机)
    val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA

    try {
        // 解绑之前的所有用例,避免冲突
        cameraProvider.unbindAll()

        // 绑定预览用例到当前Activity的生命周期
        val camera = cameraProvider.bindToLifecycle(
            this, cameraSelector, preview
        )

        // 监听Camera.State的变化
        camera.cameraInfo.state.observe(this) { cameraState ->
            // cameraState就是你要的Camera.State类型
            when (cameraState.type) {
                Camera.State.Type.ACTIVE -> {
                    Log.d("CameraState", "相机已激活,可正常使用")
                }
                Camera.State.Type.INACTIVE -> {
                    Log.d("CameraState", "相机已暂停,暂时无法操作")
                }
                Camera.State.Type.CLOSED -> {
                    Log.d("CameraState", "相机已关闭,资源已释放")
                }
            }

            // 处理相机错误
            cameraState.errorCode?.let { errorCode ->
                Log.e("CameraState", "相机错误码: $errorCode")
            }
        }

    } catch (e: Exception) {
        Log.e("CameraX", "绑定相机用例失败", e)
    }
}, ContextCompat.getMainExecutor(this))
四、必要的依赖配置

确保你的build.gradle(app)中包含Camera2相关的依赖(版本可以根据需要调整):

dependencies {
    // CameraX核心库
    implementation "androidx.camera:camera-core:1.3.0"
    // Camera2扩展库
    implementation "androidx.camera:camera-camera2:1.3.0"
    // 生命周期绑定库
    implementation "androidx.camera:camera-lifecycle:1.3.0"
    // 可选:CameraX的View控件库
    implementation "androidx.camera:camera-view:1.3.0"
}

内容的提问来源于stack exchange,提问作者gipsey

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 09:09:50