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):
- Android: holder.getSurface () devuelve siempre null
- MediaServer Remote Binder Objeto de cámara muerto - sólo en KITKAT
- Grafika's CameraCaptureActivity - vista previa de la cámara distorsionada en vista previa tamaño cambiar
- Malo rendimiento al dibujar continuamente en CustomView
- Android: vista de la cámara: la aplicación se bloquea cuando no utilizo un método obsoleto
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.
- Teclado Android: no inicializa el cliente de búfer compartido porque token = -12
- Android Cámara de visión de superficie cámara recreada cuando presiono botón de nuevo en la tableta de Archos en jellybean
- Cámara de conmutación de adelante hacia atrás en pjsip android
- Android OpenGL que extiende las excepciones de puntero nulo de GLSurfaceView
- ¿Cómo utilizar el feed de cámara en vivo como un fondo de actividad?
- SlidingDrawer ocultado por la imagen en SurfaceView
- Evitar el "parpadeo" al llamar a Drawable.draw ()
- Diseño con posición dinámica
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?
- SetTypeface (fuente) no funciona
- ¿Howt para conectar dos dispositivos vía bluetooth que envía el código pairng por el parámetro? JAVA-Android