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

CameraCaptureSession的setRepeatingRequest应传入哪种Capture Callback?

关于CameraCaptureSession.setRepeatingRequest的CaptureCallback选择

嘿,先纠正一个小细节:你提到的PictureCaptureCallback应该是继承自CameraCaptureSession.CaptureCallback才对,它是相机会话的内部回调类,不是直接继承CameraCaptureSession哦。

接下来咱们分场景说该选哪种回调:

1. 如果你要做实时预览帧处理(比如实时滤镜、人脸检测)

这时候你需要自定义一个专门的CameraCaptureSession.CaptureCallback,或者配合ImageReader.OnImageAvailableListener来处理帧数据。这个回调里你主要重写onCaptureCompleted()或者onCaptureProgressed(),用来监听每一次预览帧的捕获状态,或者获取帧的元数据(比如曝光、对焦参数)。

为什么不推荐用PictureCaptureCallback?因为这类回调是为单次拍照设计的——它的逻辑通常是在拍照完成后处理图片数据(比如保存到本地),而setRepeatingRequest是持续触发的循环捕获,用它的话会频繁触发拍照完成的逻辑,既浪费资源,也不符合预览的需求。

2. 如果你只是需要启动预览,不需要额外处理帧数据

那你完全可以传一个空的CaptureCallback,比如:

new CameraCaptureSession.CaptureCallback() {}

或者用系统默认的实现,只要能让预览正常循环起来就行。

总结一下选择逻辑

  • 处理预览帧:自定义CameraCaptureSession.CaptureCallback,聚焦预览相关的状态监听和数据处理
  • 仅启动预览:空回调或默认实现就够了
  • 拍照操作:才用PictureCaptureCallback(配合capture()方法,而不是setRepeatingRequest)

举个自定义预览回调的简单例子:

private CameraCaptureSession.CaptureCallback previewCallback = new CameraCaptureSession.CaptureCallback() {
    @Override
    public void onCaptureCompleted(@NonNull CameraCaptureSession session, @NonNull CaptureRequest request, @NonNull TotalCaptureResult result) {
        super.onCaptureCompleted(session, request, result);
        // 在这里可以处理预览帧的捕获完成状态,比如获取当前的曝光、对焦信息
        // 如果需要获取实际的帧图像数据,还要配合ImageReader的监听来实现
    }
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 09:29:48