You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

安卓自定义Camera Preview启动时无需触摸自动对焦实现咨询

解决安卓自定义Camera Preview启动自动对焦问题

嘿,作为安卓开发新手碰到这个对焦问题太正常了!我当初做自定义相机预览的时候也踩过这个坑,给你几个亲测有效的解决办法:

  • 针对旧版Camera API(Android 5.0及以下常用)
    在初始化相机、启动预览的流程里,一定要主动触发自动对焦。通常可以在SurfaceHolder.CallbacksurfaceChanged回调(确保Surface已经准备好)里设置对焦参数并触发对焦:

    // 获取相机实例后
    Camera.Parameters params = camera.getParameters();
    // 先检查设备是否支持自动对焦模式
    if (params.getSupportedFocusModes().contains(Camera.Parameters.FOCUS_MODE_AUTO)) {
        params.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);
        camera.setParameters(params);
        // 启动预览后触发自动对焦
        camera.startPreview();
        camera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
                // 这里可以处理对焦成功/失败的逻辑,比如日志打印
            }
        });
    }
    

    注意:有些设备需要等预览完全启动后再对焦,所以把autoFocus()放在startPreview()之后更稳妥。

  • 针对Camera2 API(Android 5.0+推荐使用)
    Camera2的逻辑更复杂,但对焦控制更灵活。你需要在创建预览请求时就指定自动对焦模式,甚至可以主动触发一次对焦:

    // 当相机会话创建完成后
    CaptureRequest.Builder previewBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    previewBuilder.addTarget(surface); // surface是你的预览Surface
    // 设置连续自动对焦模式,这样不仅启动时对焦,后续也会持续对焦
    previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
    // 发送重复请求启动预览
    cameraCaptureSession.setRepeatingRequest(previewBuilder.build(), null, null);
    

    如果想要启动时立刻完成一次对焦,还可以额外发送一个对焦触发请求:

    CaptureRequest.Builder focusTriggerBuilder = cameraDevice.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW);
    focusTriggerBuilder.addTarget(surface);
    focusTriggerBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START);
    cameraCaptureSession.capture(focusTriggerBuilder.build(), new CameraCaptureSession.CaptureCallback() {
        @Override
        public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
            super.onCaptureCompleted(session, request, result);
            // 对焦完成后可以保持连续对焦模式
            previewBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
            session.setRepeatingRequest(previewBuilder.build(), null, null);
        }
    }, null);
    
  • 小技巧:适配部分“慢热”设备
    有些设备的相机硬件初始化需要一点时间,直接触发对焦可能没效果,你可以延迟几百毫秒再执行对焦操作:

    new Handler(Looper.getMainLooper()).postDelayed(() -> {
        if (camera != null) { // 针对旧Camera API
            camera.autoFocus(null);
        }
        // 针对Camera2 API的话,在这里发送对焦触发请求
    }, 500); // 延迟500毫秒,可根据实际情况调整
    
  • 别忘了权限检查!
    一定要确保你的App已经获取了CAMERA权限,Android 6.0及以上版本还需要动态申请权限,没有权限的话相机的对焦功能会完全失效。

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

火山引擎 最新活动