首页 > 解决方案 > 使用 Android Camera2,应用程序无限期卡在 STATE_WAITING_PRECAPTURE 或 STATE_WAITING_NON_PRECAPTURE

问题描述

我正在使用Android Camera2 API。我想知道什么时候是合适的时间:

  1. 最初显示TakePicture按钮(即相机已准备好拍摄照片)。
  2. 再次显示此按钮(如果拍照过程失败,当然完成后),因为我在单击它时将其隐藏(以捕获图片)。

我试过takePicture.setVisibility(View.GONE)了。lockFocus()_ 虽然这在大多数情况下都有效,但有时按钮会消失并且再也不会出现(我猜是当拍照过程失败时),尤其是在非常快速地单击它时(一旦它出现在屏幕上)。此时没有错误和崩溃发生。takePicture.setVisibility(View.VISIBLE)unlockFocus()

代码取自googlesamples/android-Camera2Basic

更新:

takePicture.setVisibility(View.VISIBLE)我在里面试过onCaptureSequenceCompleted。该按钮确实出现了,但是单击它时不会重新启动捕获图片的过程(请参阅此七秒视频)。发生这种情况时,onCaptureFailed不会调用 。但是,它会无限期地陷入STATE_WAITING_PRECAPTURESTATE_WAITING_NON_PRECAPTURE因为aeState不满足if条件而陷入困境。

           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;
            }

标签: androidcameraandroid-cameraandroid-camera2

解决方案


我觉得应该是这样的

 case STATE_WAITING_PRECAPTURE:
              {
                JQLog.d(TAG, "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
                    || aeState == CaptureResult.CONTROL_AE_STATE_CONVERGED) {
                  state = STATE_WAITING_NON_PRECAPTURE;
                }
                break;
              }

推荐阅读