SurfaceView с предварительным просмотром камеры не уничтожается - PullRequest
5 голосов
/ 24 ноября 2011

У меня есть вкладка Активность с 2 вкладками (действия). Каждая вкладка имеет 3D Open GL сцену, нарисованную поверх SurfaceView с предварительным просмотром камеры.

Тем не менее, в зависимости от ориентации устройства, вкладки переключаются.

Проблема в том, что при запуске другого действия вызывается camera.open (), который генерирует исключение, сообщая, что служба камеры недоступна.

На самом деле, проблема в том, что камера не останавливается, когда активность приостановлена, другими словами onSurfaceDestroyed () не вызывается для SurfaceView. Я пытался остановить камеру, когда вызывается onPause () для действий, но все равно получаю ту же ошибку.

У кого-нибудь были такие же проблемы с вкладками? Любая идея, как сделать уничтожение поверхности?

Ответы [ 3 ]

6 голосов
/ 07 марта 2014

Похоже, этот вопрос довольно популярен, поэтому я добавляю решение еще раз.

Основной причиной было то, что SurfaceDestroyed никогда не вызывался для SurfaceView, когда приложение было приостановлено.

Итак, я создал framelayout, который содержит все дочерние представления. Установите это как представление контента. Но остановите камеру, просто вызвав setVisibility (View.GONE) в onPause () и View.Visible в onResume () Это приведет к разрушению SurfaceView.

3 голосов
/ 25 ноября 2011
private SurfaceHolder.Callback mSurfaceHolderListener = new SurfaceHolder.Callback() {

    public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }
0 голосов
/ 18 февраля 2015

это нормально для меня:

 public void surfaceDestroyed(SurfaceHolder holder) {
        Log.e("TABACT", "surfaceDestroyed()");
        camera.stopPreview();
        camera.setPreviewCallback(null); 
        camera.release();
        camera = null;
    }
...