Используя Android Camera2, приложение застревает на неопределенное время в STATE_WAITING_PRECAPTURE или STATE_WAITING_NON_PRECAPTURE - PullRequest
0 голосов
/ 11 мая 2018

Я использую 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_PRECAPTURE или STATE_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;
            }

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

я думаю, что так и должно быть,

 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;
              }
0 голосов
/ 11 мая 2018

Когда не удается сделать снимок, CameraCaptureSession.CaptureCallback 's onCaptureCompleted не будет вызван, поэтому ваш takePicture.setVisibility(View.VISIBLE) in unlockFocus(), который вызывается внутри onCaptureCompleted, не будет вызван, тогда кнопка исчез.

Вам следует разобраться с ситуацией, когда запрос захвата не выполняется. onCaptureFailed и onCaptureSequenceCompleted в CameraCaptureSession.CaptureCallback выполнят ваше требование, и я предпочитаю использовать onCaptureSequenceCompleted, потому что он будет вызываться независимо от того, будет ли запрос захвата неудачным или успешным. Однако вам также может понадобиться рассмотреть ситуацию сброса, которая относится к методу обратного вызова onCaptureSequenceAborted.

См. CameraCaptureSession.CaptureCallback для полной документации.

...