2011-06-29 8 views
7

Tengo una aplicación que muestra la vista previa de la cámara y me gustaría que el usuario pueda poner el teléfono en modo de suspensión y luego activarlo para que mi aplicación se recupere correctamente. El problema es que al volver del modo de suspensión, la vista previa de la cámara no se reiniciará.¿Cómo recuperar la vista previa de la cámara de la suspensión?

He implementado la vista previa de la cámara como se presenta en las demostraciones de API, pero parece que el ejemplo de la demostración de API funciona solo por pura suerte. En el ejemplo, la orientación de la pantalla se ve obligada a apaisarse, lo que significa que el teléfono pasará por un cambio de configuración cada vez que el teléfono entre en modo de suspensión, ya que la pantalla de bloqueo está en modo vertical. Si el modo vertical se usa en la aplicación de vista previa de la cámara (como en la mía), la superficie del error emerge.

He encontrado que el error está relacionado con la recreación de la superficie. La superficie debe destruirse siempre cuando se vaya a onPause y luego se vuelva a crear después de onResume, pero esto no ocurre cuando se va a dormir. Parece que tengo que destruir toda la actividad y luego volver a crearla para que la vista previa de la cámara funcione nuevamente. Me gustaría poder recrear la vista de superficie.

¿Hay alguna forma de forzar la recreación de la vista superficial que no sea simplemente recrear toda la actividad?

Respuesta

5

Una solución tal vez establecer la vista de superficie a invisible y visible de nuevo en onResume(), esto hace que la vista de superficie destruya y vuelva a crear.

+0

+1 Thanks that did indeed help! Sin embargo: en la implementación de la cámara también tuve que pasar el archivo Uri de la imagen que tomé y guardé, en lugar de pasar la matriz de bytes sin procesar a la actividad que llamó a la cámara, ya que al intentar pasar la matriz de bytes se produjo una carpeta fallida Transacción después de un sueño. – AgentKnopf

+0

La solución de Jason funcionó para mis dispositivos 4.0 y superiores, pero mis dispositivos 3.0 y posteriores aún muestran los mismos síntomas. ¿Algun consejo? – rotinegg

3

que estaba teniendo el mismo problema y he aquí por qué:

El método onPause no significa reciclar la clase CameraPreview hice (que implementa SurfaceView devoluciones de llamada). En lugar de tratar de volver a crear una instancia de todo ese objeto en sí mismo, que simplemente se actualizan la referencia al objeto de cámara que estaba pasando que sea ya sea

null 

o

cameraPreview.setCamera(mCamera); 

Llamé a un método getCameraInstance para volver a inicializar la cámara , luego lo pasó al objeto preivew.

Ahora el problema está aquí:

private void initializeCameraView(){ 

    RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview); 

    preview.addView(cameraPreview); 
} 

en onResume, llamé a este método para volver a inicializar el objeto cameraPreview. Sin embargo, estaba congelado porque estaba tratando de agregar otra cámaraApvista a la vista previa. Esta fue mi solución, simple y llana. Si ya existe, quítelo, luego vuelva a colocarlo. ¡Espero que esto ayude!

private void initializeCameraView(){ 

    RelativeLayout preview = (RelativeLayout)rootView.findViewById(R.id.camera_preview); 
    //removes the problem with the camera freezing onResume 
    if(cameraPreview != null) { 
     preview.removeView(cameraPreview); 
    } 
    preview.addView(cameraPreview); 
} 
+0

Hombre esta es la respuesta a un problema que me persiguió durante 3 días sin poder dormir: D ¡Gracias! –

+0

¿Por qué nadie vota por esta respuesta? ¡Me ayuda! – DYS

Cuestiones relacionadas