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

