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
相关产品推荐
相关产品推荐

