Я пытаюсь реализовать приложение, которое требует предварительного просмотра камеры на поверхности. Поскольку я вижу вещи, как жизненные циклы активности, так и поверхности состоят из следующих состояний:
- Когда я впервые запускаю свою активность:
onResume()->onSurfaceCreated()->onSurfaceChanged()
- Когда я покидаю свою активность:
onPause()->onSurfaceDestroyed()
В этой схеме я могу выполнять соответствующие вызовы, такие как open/release camera и start/stop preview в onPause/onResume
и onSurfaceCreated()/onSurfaceDestroyed()
.
Он отлично работает, если я не заблокирую экран. Когда я запускаю приложение, затем заблокируйте экран и разблокируйте его позже, я вижу:
onPause()
- и ничего больше после того, как экран заблокирован - затем onResume()
после разблокировки - и никаких поверхностных обратных вызовов после этого. Фактически, после нажатия кнопки питания и вызывается экран onResume()
, но экран блокировки по-прежнему активен, поэтому перед тем, как активность станет видимой.
С этой схемой я получаю черный экран после разблокировки, и никаких обратных вызовов не вызываются.
Здесь фрагмент кода, который не связан с фактической работой с камерой, а вызывает обратные вызовы SurfaceHolder
. Вышеупомянутая проблема воспроизводится даже с помощью этого кода на моем телефоне (обратные вызовы вызываются в обычной последовательности, когда вы нажимаете кнопку "Назад", но при блокировке экрана отсутствуют):
class Preview extends SurfaceView implements SurfaceHolder.Callback {
private static final String tag= "Preview";
public Preview(Context context) {
super(context);
Log.d(tag, "Preview()");
SurfaceHolder holder = getHolder();
holder.addCallback(this);
holder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
}
public void surfaceCreated(SurfaceHolder holder) {
Log.d(tag, "surfaceCreated");
}
public void surfaceDestroyed(SurfaceHolder holder) {
Log.d(tag, "surfaceDestroyed");
}
public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
Log.d(tag, "surfaceChanged");
}
}
Любые идеи о том, почему поверхность остается неразрушенной после приостановки операции? Кроме того, как вы справляетесь с жизненным циклом камеры в таких случаях?