我正在尝试创建一个应用程序,它使用camera2 api从服务中获取一些照片。
我可以让这个应用程序从一个基于Camera2Basic sample的片段中拍摄照片。
但当我尝试移动到服务时,图像并没有正确地完成捕获。它永远不会超过自曝预破裂状态。
我把范围缩小到没有预览的问题。我已经通过获取camera2basic代码并删除预览来组合了一个测试片段,这导致了相同的问题。
我根据camera2basic示例整理了一个有问题的测试片段,其中我基本上删除了预览的代码。碎片代码上传到这里http://pastebin.ca/3182401。
我正在获取onCaptureCompleted()回调,但当我检查此处的相机自动曝光状态时,它仍处于控制状态。
在我看来,如果摄像机的某个状态还处于预摄状态,那么拍摄就完成了是没有意义的。
有人知道这里会发生什么吗?
最佳答案
我认为你的逻辑中有个缺陷,你把mstate设置为捕获前状态
private void process(CaptureResult result) {
switch (mState) {
case STATE_PREVIEW: {
// We have nothing to do when the camera preview is working normally.
break;
}
case STATE_WAITING_LOCK: {
Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);
if (afState == null) {
captureStillPicture();
} else if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState ||
CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
mState = STATE_PICTURE_TAKEN;
captureStillPicture();
} else {
runPrecaptureSequence();
}
}
break;
}
case STATE_WAITING_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null ||
aeState == CaptureResult.CONTROL_AE_STATE_PRECAPTURE ||
aeState == CaptureRequest.CONTROL_AE_STATE_FLASH_REQUIRED) {
mState = STATE_WAITING_NON_PRECAPTURE;
}
break;
}
case STATE_WAITING_NON_PRECAPTURE: {
// CONTROL_AE_STATE can be null on some devices
Integer aeState = result.get(CaptureResult.CONTROL_AE_STATE);
if (aeState == null || aeState != CaptureResult.CONTROL_AE_STATE_PRECAPTURE) {
mState = STATE_PICTURE_TAKEN;
captureStillPicture();
}
break;
}
}
}
等待的情况甚至会进入预保状态吗?