2011-11-24 31 views
5

Tengo una actividad de pestañas con 2 pestañas (actividades). Cada pestaña tiene una escena 3D Open GL dibujada en la parte superior de un SurfaceView con vista previa de la cámara.SurfaceView con vista previa de la cámara no se destruye

Sin embargo, dependiendo de la orientación del dispositivo, se cambian las pestañas.

El problema es que cuando se inicia la otra actividad, llama a camera.open(), que genera una excepción, diciendo que el servicio de la cámara no está disponible.

De hecho, el problema es que la cámara no se detiene cuando la actividad está en pausa, en otras palabras, en SurfaceStroyed() no se llama para SurfaceView. Intenté detener la cámara cuando se llama a OnPause() para actividades, pero sigo teniendo el mismo error.

¿Alguien tenía los mismos problemas con las actividades con pestañas? ¿Alguna idea de cómo hacer que Surfaceview sea destruido?

+0

¿Has llamado tanto '.stopPreview()' y '.release()' en el objeto de cámara? –

+0

Sí, vea el código a continuación. –

Respuesta

5

Parece que esta pregunta es bastante popular, así que voy a agregar la solución aquí una vez más.

La causa principal era que SurfaceDestroyed nunca se llamaba para SurfaceView cuando la aplicación estaba en pausa.

Así que he creado un framelayout que contiene todas las vistas secundarias. Establézcalo como vista de contenido. Sin embargo, detenga la cámara simplemente llamando a setVisibility (View.GONE) en onPause() y View.Visible en onResume(). Esto conducirá a la destrucción de SurfaceView.

3
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; 
    } 
+1

Encontré la solución. En primer lugar, para cada actividad con pestañas, cree un framelayout que contenga todas las vistas secundarias. Establecerlo como vista de contenido. Sin embargo, detenga la cámara simplemente llamando a OnPause() setVisibility para View.GONE y View.Visible en onResume(). –

+0

Muchas gracias por esto. Tuve el problema de que en el Sony Ericsson Xperia mini, el menú habilitar/deshabilitar USB de la barra de notificaciones desplegables detuvo mi aplicación de cámara pero no destruyó la superficie. Sorprendentemente, solo el menú habilitar/deshabilitar tenía este problema, el menú de configuración de depuración USB se comportó correctamente. Usar setVisibility() como describió directamente para SurfaceView para la vista previa de la cámara resolvió el problema por completo. – Nantoka

0

esto está bien para mí:

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