使用Android Camera2,应用无限期陷入STATE_WAITING_PRECAPTURE或STATE_WAITING_NON_PRECAPTURE

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用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。按钮确实出现,但点击它时不会重新启动捕获图片的过程(请参阅this seven-second video)。发生这种情况时,不会调用onCaptureFailed。然而,由于STATE_WAITING_PRECAPTURE不满足STATE_WAITING_NON_PRECAPTURE条件,它无限期地卡在aeStateor 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;
            }
答案

当它没有拍照时,CameraCaptureSession.CaptureCallbackonCaptureCompleted将不会被调用,所以在takePicture.setVisibility(View.VISIBLE)中调用unlockFocus()onCaptureCompleted将不被调用,然后按钮消失。

您应该在捕获请求失败时处理这种情况。 onCaptureFailed中的onCaptureSequenceCompletedCameraCaptureSession.CaptureCallback将满足您的要求,我更喜欢使用onCaptureSequenceCompleted,因为无论捕获请求失败还是成功,都会调用它。但是,您可能还需要考虑中止情况,该情况与回调方法onCaptureSequenceAborted相关。

有关完整文档,请参阅CameraCaptureSession.CaptureCallback

另一答案

我认为它应该是这样的,

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

以上是关于使用Android Camera2,应用无限期陷入STATE_WAITING_PRECAPTURE或STATE_WAITING_NON_PRECAPTURE的主要内容,如果未能解决你的问题,请参考以下文章

Android Camera2 教程 · 第一章 · 概览

为啥应用程序在设置属性时会陷入无限循环?

Android使用camera2复制内置视频录制质量和帧率

iTunes 连接 - 添加新应用程序陷入无限状态

支持 Android Camera Api 和 Camera2 Api 的问题

Android Camera2预览偶尔会旋转90度