SurfaceView for Camera Preview no se destruye cuando se pulsa el botón de encendido

Quiero implementar una vista previa de la cámara. Para eso tengo una vista personalizada CameraView extends ViewGroup que en el constructor crea mediante programación un surfaceView.

Tengo los siguientes componentes (muy simplificados para beverity):

ScannerFragment.java

 public View onCreateView(..) { //inflate view and get cameraView } public void onResume() { //open camera -> set rotation -> startPreview (in a thread) -> //set preview callback -> start decoding worker } public void onPause() { // stop decoding worker -> stop Preview -> release camera } 

CameraView.java amplía ViewGroup

 public void setUpCalledInConstructor(Context context) { //create a surfaceview and add it to this viewgroup -> //get SurfaceHolder and set callback } /* SurfaceHolder.Callback */ public void surfaceCreated(SurfaceHolder holder) { camera.setPreviewDisplay(holder); } public void surfaceDestroyed(SurfaceHolder holder) { //NOTHING is done here } public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { camera.getParameters().setPreviewSize(previewSize.width, previewSize.height); } 

Fragment_scanner.xml

 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent"> <com.myapp.camera.CameraView android:id="@+id/cameraPreview" android:layout_width="match_parent" android:layout_height="match_parent"/> </RelativeLayout> 

Creo que he establecido el ciclo de vida correcto (obteniendo recursos onResume (), liberándolo onPause () aproximadamente) y lo siguiente funciona muy bien:

  • Presionando a casa y regresando
  • Presionando Taskswitcher y regresando
  • rotación
  • Presionando hacia atrás (por supuesto)

Pero una cosa no funciona y es cuando presiono el botón de encendido en el dispositivo y luego volver a la vista previa de la cámara. El resultado es: la vista previa está pegada con la imagen que se capturó por última vez antes de presionar el botón. Si vuelvo a girar funciona bien de nuevo, ya que pasará a través del ciclo de vida.

Después de algunas investigaciones descubrí que esto se debe probablemente al hecho de que SurfaceView no se destruirá cuando se presione el botón de encendido, es decir SurfaceHolder.Callback.surfaceDestroyed(SurfaceHolder holder) no será llamado. Y de hecho, cuando comparo la salida de registro (muy detallada) de la casilla de botón de inicio y la de botón de encendido, es la misma, excepto que 'surfaceDestroyed' no se llamará.

Hasta ahora no he encontrado ninguna solución para solucionarlo. surfaceDestroyed() propósito cualquier código de limpieza de recursos en mi surfaceDestroyed() , pero esto no ayuda. Mi idea era destruir manualmente el surfaceView como pedido en esta pregunta pero esto no parece posible. También probé otras aplicaciones con visores de superficie / cámaras y no parecen tener este problema. Así que agradecería cualquier sugerencias o consejos sobre eso.

Sólo intenta agregar

  public void onDestroy() { // stop decoding worker -> stop Preview -> release camera } 

Como se hace para la onPause () causa que podría ser invocado siempre y cuando el método de pausa.

En mi releaseCamera () eso es lo que hago

  private void releaseCamera() { if (myCamera != null) { FrameLayout preview = (FrameLayout) findViewById(R.id.cameraPreview); preview.removeView(myPreview); myCamera.setPreviewCallback(null); myCamera.release(); myCamera = null; } } 

Desacople el CameraPreview (myPreview), que es lo que contiene la imagen actual. Y destruir completamente la cámara.

MPreview.getHolder (). RemoveCallback (mPreview); ¿debería ayudar?

  • Android translate ImageView sobre SurfaceView
  • ¿Debería el renderingThread de un SurfaceView tener el mismo ciclo de vida que la vista o la actividad?
  • Android: creación de un mapa de bits con contenido de SurfaceView
  • Se ha abandonado BufferQueue: Al reproducir vídeo con TextureView
  • El lienzo SurfaceView de Android produce colores incorrectos
  • GetSupportedPictureSize () devuelve un valor que no es realmente compatible con Nexus4
  • escala de previsualización de la cámara para adaptarse a la mitad de la pantalla
  • Android IllegalArgumentException lockCanvas ()
  • Combinación de SurfaceView con otras vistas, como TextView y botones
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.