2010-10-08 24 views
51

He incluido la funcionalidad de la cámara en mi aplicación. También lancé la aplicación en el mercado. Recibí un mensaje de error de uno de los usuarios que indica que está recibiendo un error al abrir la cámara.camera.setParameters failed in android

He probado la aplicación en el dispositivo en 2.1. El error que obtuve del usuario está utilizando un nexo que sobre todo correr 2.2 ... Aquí está el error Logcat que he recibido ...

java.lang.RuntimeException: setParameters failed 
at android.hardware.Camera.native_setParameters(Native Method) 
at android.hardware.Camera.setParameters(Camera.java:647) 
at com.CameraApp.Preview.surfaceChanged(Preview.java:67) 
at android.view.SurfaceView.updateWindow(SurfaceView.java:538) 
at android.view.SurfaceView.dispatchDraw(SurfaceView.java:339) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1638) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at android.view.ViewGroup.drawChild(ViewGroup.java:1640) 
at android.view.ViewGroup.dispatchDraw(ViewGroup.java:1367) 
at android.view.View.draw(View.java:6743) 
at android.widget.FrameLayout.draw(FrameLayout.java:352) 
at com.android.internal.policy.impl.PhoneWindow$DecorView.draw(PhoneWindow.java:1842) 
at android.view.ViewRoot.draw(ViewRoot.java:1407) 
at android.view.ViewRoot.performTraversals(ViewRoot.java:1163) 
at android.view.ViewRoot.handleMessage(ViewRoot.java:1727) 
at android.os.Handler.dispatchMessage(Handler.java:99) 
at android.os.Looper.loop(Looper.java:123) 
at android.app.ActivityThread.main(ActivityThread.java:4627) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:521) 
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
at dalvik.system.NativeStart.main(Native Method) 

que corrieron la aplicación en 2.2 emulador también para comprobarlo. Pero funcionó bien. ¿Puede alguien decirme por qué se está produciendo el error?

Aquí es la clase que he mencionado en los comentarios:

class Preview extends SurfaceView implements SurfaceHolder.Callback 
{ 
    private static final String TAG = "Preview"; 

    SurfaceHolder mHolder; 
    public Camera camera; 

    Preview(Context context) 
    { 
     super(context); 

     // Install a SurfaceHolder.Callback so we get notified when the 
     // underlying surface is created and destroyed. 
     mHolder = getHolder(); 
     mHolder.addCallback(this); 
     mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
    } 

    public void surfaceCreated(SurfaceHolder holder) 
    { 
     // The Surface has been created, acquire the camera and tell it where 
     // to draw. 
     camera = Camera.open(); 
     try { 
     camera.setPreviewDisplay(holder); 
     } catch (IOException exception) { 
     camera.release(); 
     camera = null; 
      // TODO: add more exception handling logic here 
     } 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) 
    { 
     // Surface will be destroyed when we return, so stop the preview. 
     // Because the CameraDevice object is not a shared resource, it's very 
     // important to release it when the activity is paused. 
     camera.stopPreview(); 
     camera.release(); 
     camera = null; 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) 
    { 
     // Now that the size is known, set up the camera parameters and begin 
     // the preview. 

     Camera.Parameters parameters = camera.getParameters(); 
     parameters.setPreviewSize(w, h); 
     camera.setParameters(parameters); 
     camera.startPreview(); 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     super.draw(canvas); 
     Paint p= new Paint(Color.RED); 
     Log.d(TAG,"draw"); 
     canvas.drawText("PREVIEW", canvas.getWidth()/2, canvas.getHeight()/2, p); 
    } 
} 
+0

A menos que publique el código donde está modificando los parámetros de la cámara, será muy difícil ayudarle. – CommonsWare

+0

gracias por tu respuesta Tengo una clase separada que se llama "Vista previa" en esa clase. Estoy anulando algunos métodos, uno de ellos es "surfaceChanged()" que usa "setParameters()", estoy agregando código de esa clase en cuerpo de pregunta por favor échale un vistazo ... y ayúdame a resolver este problema. gracias –

Respuesta

109

Se está fallando porque no todos los dispositivos son compatibles con tamaños de vista previa arbitrarias. Aparentemente algunos lo hacen pero no puedes confiar en eso. En el método de surfaceChanged que hay que hacer algo como esto:

public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
    Camera.Parameters parameters = camera.getParameters(); 
    List<Camera.Size> previewSizes = parameters.getSupportedPreviewSizes(); 

    // You need to choose the most appropriate previewSize for your app 
    Camera.Size previewSize = // .... select one of previewSizes here 

    parameters.setPreviewSize(previewSize.width, previewSize.height); 
    camera.setParameters(parameters); 
    camera.startPreview(); 
} 

Vas a tener que encontrar una manera de escalar esto para que no se pierde la relación de aspecto, etc.

Como referencia aquí es el Android SDK doc.

+0

gracias he intentado el código anterior, pero es de 2,1 en adelante. también está dando algunos errores. el problema es cuando estoy cambiando la orientación del móvil de vertical a horizontal. Está dando valores nulos para la vista previa en el dispositivo real. La imagen se almacena con 0kb. Está funcionando bien en el retrato y funciona bien en el emulador tanto en modo vertical como horizontal. ,, –

+0

Ok, no sé cómo hacerlo antes 2.1. Tuve un problema similar en el HTC Evo y así es como lo solucioné. El problema es que no puede establecer necesariamente la vista previa en el tamaño que desee (no todos los teléfonos lo admitirán). El tamaño de la vista previa no necesariamente tiene que ser del tamaño de la superficie en la que se dibuja, si eso ayuda en absoluto. – macbutch

+0

Gracias por este, en 2.2 tuve que reemplazar 'getSupportedPreviewSizes' por 'getPreviewSize', pero el resto simplemente funciona. – kolenda