Повторное открытие камеры после отмены выбора - PullRequest
4 голосов
/ 06 ноября 2011

Я создал пользовательский предварительный просмотр камеры CameraView, который расширяет SurfaceView, а также реализует интерфейс SurfaceHolder.Callback. Представление работает с камерой. Когда вы открываете вид, он показывает предварительный просмотр камеры. На этом же экране также есть оверлей с двумя кнопками - «Сделать снимок», «Выбрать из галереи». Операция, которая содержит CameraView, освобождает и снова открывает камеру в методах onPause() и onResume().

Если я нажму кнопку «Выбрать из галереи», будет создано следующее намерение:

Intent intent = new Intent(Intent.ACTION_GET_CONTENT);
intent.setType("image/*");
startActivityForResult(intent, LOAD_PICTURE);

Если есть только одно действие, которое может ответить на это намерение, тогда это нормально. Деятельность автоматически открывается, камера отпускается. Я также могу нанести ответный удар, когда окажусь в галерее, и я вернусь к действию CameraView, и предварительный просмотр камеры будет восстановлен.

Интересная часть начинается, если есть несколько действий, которые могут обработать это намерение, и всплывает диалоговое окно выбора намерения. Когда появляется диалоговое окно выбора цели, в родительской активности вызывается onPause(), и камера освобождается, экран становится черным. Если я не выбираю намерение из диалогового окна, но вместо этого нажимаю кнопку возврата на телефоне, вызывается onResume(), но предварительный просмотр камеры никогда не возвращается. Чтобы снова отобразить предварительный просмотр камеры, мне нужно вернуться к предыдущему действию и вернуться обратно к предварительному просмотру.

Следующая проблема возникает из-за того, что при вызове диалога вызывается только onPause(), но если я на самом деле переключаюсь на другое действие, surfaceDestroyed() также вызывается. То же самое верно для onResume(), когда диалог отменяется кнопкой назад, surfaceChanged() и surfaceCreated() никогда не вызывается.

Мой вопрос заключается в том, чтобы снова отобразить предварительный просмотр камеры, если диалоговое окно выбора намерений отменено. Есть ли способ, как явно вызвать SurfaceHolder.Callback методы? Я знаю, что есть скрытые hideSurface() и showSurface() в SurfaceView, но я не хочу идти по этому пути.

1 Ответ

0 голосов
/ 11 октября 2013

Правильно, вы открыли свою камеру в методе onStart и отпустили ее в методе onStop своей деятельности. Методы onResume и onPause являются частью видимого жизненного цикла активности Android. OnStop вызывается, когда другое действие занимает все видимое пространство. OnPause даже вызывается, когда другое действие выходит на передний план, даже если оно не занимает все видимое пространство, как, например, диалог выбора намерений, когда он появляется. Поэтому я думаю, что перемещение вашей камеры с созданием и выпуском в правильные методы жизненного цикла должно помочь. Вы можете найти дополнительную информацию о жизненном цикле деятельности здесь, но я уверен, что вы знакомы с этим:

http://developer.android.com/reference/android/app/Activity.html

...