Режим предварительного просмотра должен быть запущен до того, как вы сможете сделать снимок

#android #android-camera #commonsware-cwac

#Android #android-камера #commonsware-cwac

Вопрос:

Мы получаем такие трассировки стека в нашем приложении с помощью cwac-camera:

 java.lang.IllegalStateException: Preview mode must have started before you can take a picture
at com.commonsware.cwac.camera.CameraView.takePicture(CameraView.java:329)
at com.commonsware.cwac.camera.CameraView.takePicture(CameraView.java:277)
at com.github.randoapp.camera.RandoCameraHost.onAutoFocus(RandoCameraHost.java:119)
at com.commonsware.cwac.camera.CameraView.onAutoFocus(CameraView.java:411)
at android.hardware.Camera$EventHandler.handleMessage(Camera.java:824)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:137)
at android.app.ActivityThread.main(ActivityThread.java:4898)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:511)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1008)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:775)
at dalvik.system.NativeStart.main(Native Method)
  

Мы считаем, что это может произойти из-за того, что пользователи нажимают «Сделать снимок» слишком рано. Решение состоит в том, чтобы отключить кнопку во время инициализации предварительного просмотра и включить только тогда, когда это будет сделано. Вопрос в том, какое событие использовать для включения кнопки? Есть ли сообщение о событии или обратном вызове, что предварительный просмотр окончательно инициализирован?

Ответ №1:

Мы считаем, что это может произойти из-за того, что пользователи нажимают «Сделать снимок» слишком рано

Это отличная возможность.

Какое событие использовать для включения кнопки? Есть ли сообщение о событии или обратном вызове, что предварительный просмотр окончательно инициализирован?

autoFocusAvailable() на CameraHost данный момент это лучший вариант. Он вызывается непосредственно перед началом предварительного просмотра и inPreview имеет значение true .

Я зарегистрировал проблему, чтобы сделать работу лучше, чем эта.

Комментарии:

1. следует ли также использовать функцию autoFocusUnavailable() для этой задачи? Потому что не все устройства поддерживают автоматическую фокусировку.

2. @xp-vit: этот метод всегда будет вызываться в текущей реализации. Это просто означает, что автофокусировка возможна. Опять же, я планирую добавить более эффективные методы обратного вызова для доступности предварительного просмотра в соответствии с проблемой, которую я привел в своем ответе. autoFocusAvailable() на данный момент это ваше лучшее решение.

3. У меня та же проблема, но независимо от того, как долго я жду, я получаю сообщение об ошибке. Есть ли что-нибудь, что я могу вызвать, чтобы сбросить предварительный просмотр?

4. Ох… Мне просто нужно было вызвать restartPreview для фрагмента, когда запись видео остановится.

5. @MikeT: Это уже сделано для вас, когда вы звоните stopRecording() .

Ответ №2:

Мы получали это исключение всякий раз, когда использовалась автоматическая вспышка при съемке в условиях плохой освещенности.

Мы «исправили» это, удалив inPreview проверку CameraView (line 284) , но я не уверен, что это не создаст других проблем (я предполагаю, что проверка была там по какой-то причине), но с тех пор у нас их нет.