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

CameraX连续对焦取消及AE/AF锁定实现技术咨询

CameraX 连续对焦取消与AE锁定实现方案

一、取消CameraX默认的连续对焦

CameraX绑定生命周期后默认启用连续对焦(对应Camera2的CONTROL_AF_MODE_CONTINUOUS_PICTURE),由于高层API未直接提供关闭入口,需通过Camera2Interop扩展直接修改CaptureRequest参数实现。

实现代码

Kotlin版本

// 1. 构建Preview时配置(全局生效)
val preview = Preview.Builder()
    .apply {
        Camera2Interop.Extender(this).setCaptureRequestOption(
            CaptureRequest.CONTROL_AF_MODE,
            CaptureRequest.CONTROL_AF_MODE_OFF // 关闭自动对焦,也可设为AF_MODE_AUTO等非连续模式
        )
    }
    .build()

// 绑定生命周期
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)

// 2. 已绑定相机后动态修改
val cameraControl = camera.cameraControl
val captureRequestOptions = Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
    .build()
cameraControl.setCaptureRequestOptions(captureRequestOptions)

Java版本

// 1. 构建Preview时配置(全局生效)
Preview preview = new Preview.Builder()
    .apply(new Camera2Interop.Extender<>(builder) {
        @Override
        public void extendBuilder(Preview.Builder builder) {
            setCaptureRequestOption(
                CaptureRequest.CONTROL_AF_MODE,
                CaptureRequest.CONTROL_AF_MODE_OFF
            );
        }
    })
    .build();

// 绑定生命周期
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview);

// 2. 已绑定相机后动态修改
CameraControl cameraControl = camera.getCameraControl();
Camera2Interop.CaptureRequestOptions options = new Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
    .build();
cameraControl.setCaptureRequestOptions(options);

二、CameraX中实现AE锁定

CameraX高层API未直接提供AE锁定的快捷方法,同样通过Camera2Interop直接设置CONTROL_AE_LOCK参数,支持全局配置或动态切换。

实现代码

Kotlin版本

// 1. 构建UseCase时全局配置AE锁定
val preview = Preview.Builder()
    .apply {
        Camera2Interop.Extender(this).setCaptureRequestOption(
            CaptureRequest.CONTROL_AE_LOCK,
            true
        )
    }
    .build()

// 2. 动态锁定/解锁AE
val cameraControl = camera.cameraControl

// 锁定AE
val lockAEOptions = Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, true)
    .build()
cameraControl.setCaptureRequestOptions(lockAEOptions)

// 解锁AE
val unlockAEOptions = Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, false)
    .build()
cameraControl.setCaptureRequestOptions(unlockAEOptions)

Java版本

// 1. 构建UseCase时全局配置AE锁定
Preview preview = new Preview.Builder()
    .apply(new Camera2Interop.Extender<>(builder) {
        @Override
        public void extendBuilder(Preview.Builder builder) {
            setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, true);
        }
    })
    .build();

// 2. 动态锁定/解锁AE
CameraControl cameraControl = camera.getCameraControl();

// 锁定AE
Camera2Interop.CaptureRequestOptions lockOptions = new Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, true)
    .build();
cameraControl.setCaptureRequestOptions(lockOptions);

// 解锁AE
Camera2Interop.CaptureRequestOptions unlockOptions = new Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, false)
    .build();
cameraControl.setCaptureRequestOptions(unlockOptions);

补充:同时锁定AF与AE

若需同时实现AF和AE锁定,可在同一个CaptureRequestOptions中配置两个参数:

Kotlin版本

val lockOptions = Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, true)
    .build()
cameraControl.setCaptureRequestOptions(lockOptions)

Java版本

Camera2Interop.CaptureRequestOptions lockOptions = new Camera2Interop.CaptureRequestOptions.Builder()
    .setCaptureRequestOption(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF)
    .setCaptureRequestOption(CaptureRequest.CONTROL_AE_LOCK, true)
    .build();
cameraControl.setCaptureRequestOptions(lockOptions);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 04:35:53