#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)
, но я не уверен, что это не создаст других проблем (я предполагаю, что проверка была там по какой-то причине), но с тех пор у нас их нет.