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