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

Camera2 API拍照异常求助:AF状态为1时无法完成拍照

针对Android 7.0 Camera2Basic二次拍照AF状态为Inactive的解决方案

看起来你遇到的是Android 7.0(API 24)上Camera2 API的一个常见兼容性问题:首次拍照后AF模块没有自动恢复激活状态,导致第二次触发拍照时AF状态为CONTROL_AF_STATE_INACTIVE(值为1),无法完成聚焦锁定。

问题根源

在Android 7.0的Camera2实现中,当使用TEMPLATE_STILL_CAPTURE完成一次拍照后,AF模块会从预览阶段的CONTROL_AF_MODE_CONTINUOUS_PICTURE切换到静态拍照的自动模式,且拍完后不会自动恢复回连续AF模式,最终导致AF进入Inactive状态,无法响应下一次的聚焦请求。

修复方案及代码修改

我会给你两个关键的代码调整点,解决这个问题:

1. 增强capturePicture方法,处理AF_INACTIVE状态

修改你的聚焦检查逻辑,当检测到AF处于Inactive状态时,主动触发一次AF扫描,让AF重新进入激活状态:

private fun capturePicture(result: CaptureResult) {
    val afState = result.get(CaptureResult.CONTROL_AF_STATE)
    when (afState) {
        null -> {
            // 无法获取AF状态,直接尝试拍照
            captureStillPicture()
        }
        CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED,
        CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED -> {
            // 聚焦锁定完成,执行拍照
            captureStillPicture()
        }
        CaptureResult.CONTROL_AF_STATE_INACTIVE -> {
            // Android 7.0专属处理:AF处于未激活状态,主动触发AF扫描
            val previewRequestBuilder = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) ?: return
            // 重置AF模式为连续拍照模式
            previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
            // 触发一次AF扫描
            previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START)
            cameraCaptureSession?.capture(
                previewRequestBuilder.build(),
                captureCallback,
                backgroundHandler
            )
        }
        else -> {
            // 其他AF状态(如扫描中),继续等待锁定
            val previewRequestBuilder = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) ?: return
            previewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_START)
            cameraCaptureSession?.capture(
                previewRequestBuilder.build(),
                captureCallback,
                backgroundHandler
            )
        }
    }
}

2. 拍照完成后恢复预览的AF模式

在照片保存成功的回调中,主动将预览请求的AF模式重置为连续拍照模式,确保下次拍照前AF处于激活状态:

private val imageSavedListener = object : ImageReader.OnImageSavedListener {
    override fun onImageSaved(reader: ImageReader, outputFile: Uri) {
        // 照片保存完成后,恢复预览并重置AF模式
        val previewRequestBuilder = cameraDevice?.createCaptureRequest(CameraDevice.TEMPLATE_PREVIEW) ?: return
        previewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE)
        cameraCaptureSession?.setRepeatingRequest(
            previewRequestBuilder.build(),
            captureCallback,
            backgroundHandler
        )
        // 这里可以添加UI提示,比如拍照完成的Toast
    }

    override fun onError(reader: ImageReader, error: ImageReader.ImageReaderError, message: String?) {
        // 处理照片保存失败的情况
    }
}

额外注意事项

  • 确保你的captureCallback会在每帧预览结果到来时调用capturePicture方法,持续检查AF状态。
  • 避免在拍照流程中频繁切换CaptureSession的请求,所有操作尽量通过同一个会话完成,减少状态冲突。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 06:46:14