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

Мы получаем такие трассировки стека в нашем приложении с помощью 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)

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


person Viktar Patotski    schedule 27.06.2014    source источник


Ответы (2)


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

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

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

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

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

person CommonsWare    schedule 27.06.2014
comment
для этого также следует использовать autoFocusUnavailable()? Потому что не все устройства поддерживают автофокус. - person Viktar Patotski; 27.06.2014
comment
@xp-vit: этот метод всегда будет вызываться в текущей реализации. Это просто означает, что автофокусировка возможна. Опять же, я планирую добавить лучшие методы обратного вызова для доступности предварительного просмотра в соответствии с проблемой, которую я упомянул в своем ответе. autoFocusAvailable() — это лучшее решение на данный момент. - person CommonsWare; 27.06.2014
comment
У меня такая же проблема, но сколько бы я ни ждал, я получаю сообщение об ошибке. Есть ли что-нибудь, что я могу позвонить, чтобы сбросить предварительный просмотр? - person swbandit; 06.08.2014
comment
О... Мне просто нужно было вызвать restartPreview для фрагмента, когда видеозапись остановится. - person swbandit; 06.08.2014
comment
@MikeT: Это уже сделано за вас, когда вы звоните stopRecording(). - person CommonsWare; 06.08.2014
comment
Я видел это в коде. Но почему-то у меня этого не происходило. Запись остановится, но предварительный просмотр видео останется включенным. - person swbandit; 06.08.2014
comment
@MikeT: Хм, предварительный просмотр должен быть включен. Это автоматически запускается stopRecording(). - person CommonsWare; 06.08.2014
comment
@CommonsWare Можете ли вы не проверять создание представления поверхности с помощью обратного вызова onSurfaceCreated? - person Anand Prakash; 30.10.2014
comment
@AnandPrakash: я не понимаю, какое это имеет отношение к вопросу. - person CommonsWare; 30.10.2014
comment
Неважно, на самом деле я думал, что onSurfaceCreated даст нам указание на то, что предварительный просмотр начался, поэтому можно делать снимки после этого, какое-то заблуждение ... во всяком случае, я сейчас использую это решение - github.com/commonsguy/cwac-camera/issues/179 - person Anand Prakash; 31.10.2014
comment
Мне до сих пор неясно, где должно вызываться подходящее место для вызова autoFocusAvailable() либо из этой темы, либо из предоставленной ссылки. Если он должен вызываться в CameraHost ... это onCreate или что-то еще? - person Wyatt; 12.05.2015
comment
@Wyatt: Вы не звоните autoFocusAvailable(). Вы реализуете это. См. документацию. - person CommonsWare; 12.05.2015
comment
@CommonsWare, использующий SimpleCameraHost, обнаружил, что, по сути, мне приходилось постоянно обновлять ссылку на мой cameraFragment, используя cameraFragment = (MyCameraFragment) getFragmentManager().findFragmentByTag(TAG_CAMERA_FRAGMENT);, что помогло решить эту проблему, поскольку это приводило к аналогичному сбою. - person Wyatt; 12.05.2015

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

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

person davis    schedule 26.05.2016