2012-03-22 12 views
15

Así que he leído la API de la cámara y no he podido encontrar nada al respecto. Estoy usando la cámara para tomar marcos y funciona perfectamente, hasta que intento liberar la cámara. Me replicado el error en una secuencia de llamadas:error de lanzamiento de la cámara Android de PreviewCallback

camera = Camera.open(); 
camera.setPreviewDisplay(getHolder()); 
Parameters params = camera.getParameters(); 
List<Size> ls = params.getSupportedPreviewSizes(); 
Size size = ls.get(1); 
this.width = size.width; 
this.height = size.height; 
params.setPreviewSize(size.width, size.height); 
camera.setParameters(params); 
camera.setDisplayOrientation(90); 
camera.setPreviewCallback(this); 
camera.startPreview(); 
camera.stopPreview(); 
camera.release(); 

El error que consigo es

03-22 13:31:42.592: E/AndroidRuntime(14152): java.lang.RuntimeException: Method called after release() 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.hardware.Camera.setHasPreviewCallback(Native Method) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.hardware.Camera.access$600(Camera.java:114) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.hardware.Camera$EventHandler.handleMessage(Camera.java:545) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.os.Handler.dispatchMessage(Handler.java:99) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.os.Looper.loop(Looper.java:130) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at android.app.ActivityThread.main(ActivityThread.java:3684) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at java.lang.reflect.Method.invokeNative(Native Method) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at java.lang.reflect.Method.invoke(Method.java:507) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:845) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:603) 
03-22 13:31:42.592: E/AndroidRuntime(14152): at dalvik.system.NativeStart.main(Native Method) 

Así que lo que está sucediendo no está en una de mis funciones. Si comento la cámara.setPreviewCallback (this); entonces este error no aparece, pero obviamente pierdo mi devolución de llamada, que es el punto de incluir la cámara en mi aplicación.

+0

También enfrentado mismo problema, lo fijé usando [http://stackoverflow.com/a/34064944/4531507](http: //stackoverflow.com/a/34064944/4531507) –

+0

La regla general es que cualquier llamada a la cámara puede lanzar una RuntimeException en cualquier momento, incluso si la llamada específica no tiene esta excepción oficialmente documentada. Si sus dispositivos de prueba nunca se portan mal de esta manera, tenga la seguridad de que una desafortunada superposición de hardware, ROM y software instalado provocará este bloqueo, ya sea de manera reproducible o irreproducible. –

Respuesta

60

Tienes que desarmar devolución de llamada vista previa antes de camera.release(), después camera.stopPreview():

camera.setPreviewCallback(null); 

de lo contrario podría ser llamado después de que la cámara ha sido puesto en libertad.

+0

Gracias, funcionó como un encanto. –

+0

Esto funcionó para mí también. Otras respuestas de stackoverflow lo mencionaron, pero la clave para mí fue que tenía que hacerse entre camera.stopPreview y camera.release(). ¡Gracias! – Danation

+0

muchas gracias! – jlopez

12

Como nota al margen, una releaseCamera método completo se parece a:

// release Camera for other applications 
private void releaseCamera() { 
    // check if Camera instance exists 
    if (mCamera != null) { 
     sPreviewing = false; 
     // first stop preview 
     mCamera.stopPreview(); 
     // then cancel its preview callback 
     mCamera.setPreviewCallback(null); 
     // and finally release it 
     mCamera.release(); 
     // sanitize you Camera object holder 
     mCamera = null; 
    } 
} 
+0

¡Eso es todo, eso es todo lo que necesita! Sólo tenga cuidado de ponerlo en el lugar correcto, porque mi problema era que tenía un segundo lugar donde estaba tratando de 'stopPreview()' y, por supuesto, se estaba cayendo .. – Apostrofix

+0

@Apostrofix, con el fin de detener la cámara Es posible que desee crear otro método si lo usa en más de un lugar o verificar si el objeto 'mCámara' es nulo antes de detenerlo. – georger

Cuestiones relacionadas