Android Studio中为主摄像头设置5-10cm固定对焦值的方法
如何让Android主摄像头固定对焦在5-10cm距离
要实现关闭自动对焦、固定聚焦到5-10cm物体的需求,需根据你的代码中使用的Camera2或Camera1(Legacy)API分别处理,以下是具体修改方案:
一、先确认摄像头支持手动对焦
在chooseCamera()方法中,先检查目标摄像头是否支持手动对焦控制,避免后续操作无效:
private String chooseCamera() { CameraManager manager = (CameraManager) getSystemService(Context.CAMERA_SERVICE); try { for (final String cameraId : manager.getCameraIdList()) { final CameraCharacteristics characteristics = manager.getCameraCharacteristics(cameraId); // 跳过前置摄像头 final Integer facing = characteristics.get(CameraCharacteristics.LENS_FACING); if (facing != null && facing == CameraCharacteristics.LENS_FACING_FRONT) { continue; } final StreamConfigurationMap map = characteristics.get(CameraCharacteristics.SCALER_STREAM_CONFIGURATION_MAP); if (map == null) { continue; } // 新增:检查是否支持手动对焦 int[] afModes = characteristics.get(CameraCharacteristics.CONTROL_AF_AVAILABLE_MODES); if (afModes == null || !Arrays.asList(afModes).contains(CaptureRequest.CONTROL_AF_MODE_OFF)) { LOGGER.w("当前摄像头不支持手动对焦,跳过"); continue; } // 判断是否使用Camera2 API useCamera2API = (facing == CameraCharacteristics.LENS_FACING_FRONT) || isHardwareLevelSupported(characteristics); LOGGER.i("Camera API lv2?: %s", useCamera2API); return cameraId; } } catch (CameraAccessException e) { LOGGER.e(e, "无法访问摄像头"); } return null; }
二、Camera2 API场景修改(CameraConnectionFragment)
在CameraConnectionFragment的相机预览会话创建逻辑中,添加固定对焦的配置:
找到创建CaptureRequest.Builder的代码位置,添加以下设置:
// 创建预览请求Builder CaptureRequest.Builder previewRequestBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW); previewRequestBuilder.addTarget(surface); // 1. 关闭自动对焦,锁定对焦状态 previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_OFF); // 2. 设置对焦距离:参数单位是1/m,对应5-10cm的范围是10(1/0.1)到20(1/0.05) // 示例设置为15,对应约6.67cm的对焦距离 previewRequestBuilder.set(CaptureRequest.LENS_FOCUS_DISTANCE, 15.0f); // 后续继续构建会话 CameraCaptureSession.CaptureCallback captureCallback = new CameraCaptureSession.CaptureCallback() { // 你的回调逻辑 }; cameraDevice.createCaptureSession(Arrays.asList(surface), new CameraCaptureSession.StateCallback() { @Override public void onConfigured(@NonNull CameraCaptureSession session) { try { session.setRepeatingRequest(previewRequestBuilder.build(), captureCallback, backgroundHandler); } catch (CameraAccessException e) { LOGGER.e(e, "设置预览请求失败"); } } // 其他回调方法 }, backgroundHandler);
参数说明
CONTROL_AF_MODE_OFF:完全关闭自动对焦,保持当前对焦参数LENS_FOCUS_DISTANCE:对焦距离的倒数(1/米),比如:- 5cm → 0.05米 → 倒数为20.0f
- 10cm → 0.1米 → 倒数为10.0f
你可以根据需求在10.0f~20.0f之间调整具体值
三、Camera1 API场景修改(LegacyCameraConnectionFragment)
在LegacyCameraConnectionFragment获取到Camera实例后,修改对焦参数:
找到初始化Camera的代码位置,添加以下配置:
Camera camera = camera.open(); Camera.Parameters params = camera.getParameters(); // 1. 设置对焦模式为微距(优先适配近距离对焦) if (params.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_MACRO)) { params.setFocusMode(Camera.Parameters.FOCUS_MODE_MACRO); } else { // fallback到固定对焦模式 params.setFocusMode(Camera.Parameters.FOCUS_MODE_FIXED); } // 2. 部分设备支持直接设置对焦距离(单位:米),这里设置为0.075m(7.5cm) if (params.isFocusDistanceSupported()) { params.setFocusDistance(0.075f); } camera.setParameters(params); // 3. 触发一次自动对焦后锁定状态 camera.autoFocus(new Camera.AutoFocusCallback() { @Override public void onAutoFocus(boolean success, Camera camera) { if (success) { // 对焦成功后取消自动对焦,保持当前对焦状态 camera.cancelAutoFocus(); } } }); // 后续设置预览等逻辑 camera.setPreviewDisplay(surfaceHolder); camera.startPreview();
注意事项
- Camera1的对焦参数兼容性较差,部分设备可能不支持直接设置对焦距离,此时使用
FOCUS_MODE_MACRO可以近似实现近距离对焦 - 调用
cancelAutoFocus()后,摄像头会保持当前对焦状态,不再自动调整
内容的提问来源于stack exchange,提问作者rmz918
相关产品推荐
相关产品推荐

