2010-02-15 5 views
11

Aparece el error de transacción del encuadernador fallido en el logcat al devolver la imagen tomada con la cámara del intento de la cámara al intento principal (como un byte [] usando putExtra). No entiendo por qué, no es como un gran mapa de bits ni nada. Solo sucede cuando tomo fotos con mucha luz, porque entonces el byte [] es más grande. El error ocurre al dejar la intención de la cámara. ¿Alguien ve un error en mi código?Transacción de encuadernador fallido al devolver la imagen de la cámara

Este es el código de la cámara intención:

package example.imaging.ape; 

import java.io.IOException; 
import java.util.Iterator; 
import java.util.Set; 

import android.app.Activity; 
import android.content.Intent; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.PixelFormat; 
import android.hardware.Camera; 
import android.hardware.Camera.AutoFocusCallback; 
import android.os.Bundle; 
import android.util.Log; 
import android.view.MotionEvent; 
import android.view.SurfaceHolder; 
import android.view.SurfaceView; 
import android.view.View; 
import android.view.Window; 
import android.view.WindowManager; 
import android.view.View.OnTouchListener; 

public class TakePicture extends Activity implements SurfaceHolder.Callback{ 
    Camera mCamera; 
    Boolean mPreviewRunning = false; 
    int imageLayoutHeight; 
    int imageLayoutWidth; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 

      //setup camera surface 
      getWindow().setFormat(PixelFormat.TRANSLUCENT); 
      requestWindowFeature(Window.FEATURE_NO_TITLE); 
      getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); 
      setContentView(R.layout.cameralayout); 

      SurfaceView mSurfaceView = (SurfaceView) findViewById(R.id.hist_surface_camera); 
      SurfaceHolder mSurfaceHolder = mSurfaceView.getHolder(); 
      mSurfaceHolder.addCallback(this); 
      mSurfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 
      Bundle extras = getIntent().getExtras(); 
      imageLayoutHeight = extras.getInt("layoutHeight"); 
      imageLayoutWidth = extras.getInt("layoutWidth"); 

      OnTouchListener touchListener = new View.OnTouchListener() { 
       public boolean onTouch(View v, MotionEvent e) { 

        System.out.println("MAKING PICTURE"); 
        mCamera.autoFocus(cb);    
        return false; 
       } 
      }; 

      //setup touch listener 
      mSurfaceView.setOnTouchListener(touchListener); 

    } 

    AutoFocusCallback cb = new AutoFocusCallback() { 
      public void onAutoFocus(boolean success, Camera c) { 
       c.takePicture(null, null, mPictureCallback); 
      } 
    }; 

    Camera.PictureCallback mPictureCallback = new Camera.PictureCallback() { 
      public void onPictureTaken(byte[] imageData, Camera c) { 
       System.out.println("Picture taken, now returning");    
       Intent resultIntent = new Intent(); 
       resultIntent.putExtra("cameraImage", imageData); 
       System.out.println("put Extra"); 
       setResult(Activity.RESULT_OK, resultIntent); 
       finish();   
      } 
    }; 

    //initialize camera 
    public void surfaceCreated(SurfaceHolder holder) { 
      mCamera = Camera.open(); 
    } 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
      if (mPreviewRunning) { 
       mCamera.stopPreview(); 
      } 

      Camera.Parameters p = mCamera.getParameters(); 

      p.setPreviewSize(h, w); 
      System.out.println("PreviewSize: " + h + "," + w); 
      p.setPictureSize(h*3,w*3); // is around 1200x900 
      p.set("rotation", 90); 
      mCamera.setParameters(p); 

      try { 
       mCamera.setPreviewDisplay(holder); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      mCamera.startPreview(); 
      mPreviewRunning = true; 
    } 

    public void surfaceDestroyed(SurfaceHolder holder) { 
      mCamera.stopPreview(); 
      mPreviewRunning = false; 
      mCamera.release(); 
    } 

} 

Y aquí es el código que llama a la cámara intención:

Intent intent = new Intent(Example.this, TakePicture.class); 
intent.putExtra("layoutWidth",layoutWidth); 
intent.putExtra("layoutHeight",layoutHeight);     
startActivityForResult(intent,0); 
+2

¿Alguna vez conseguir este trabajo? Estoy teniendo el mismo problema. –

Respuesta

17

Por alguna razón, Android no le gusta cuando intenta pasar el conjunto de bytes sin formato [] o un mapa de bits creado a partir de él. Algunas personas han tenido éxito al comprimir el Bitmap resultante y pasarlo a través de Intent. Yo recomendaría primero guardar la imagen en un archivo y enviar su ruta a través del Intento.

+0

asegúrese de que return-data sea falso – hunterp

+2

@hunterp ¿qué quiere decir con ese cazador? Estoy teniendo este problema y necesito solucionarlo. – Metropolis

2

Durante una llamada a procedimiento remoto, los argumentos y el valor de retorno de la llamada se transfieren como objetos Parcel almacenados en el búfer de transacción Binder. Si los argumentos o el valor de retorno son demasiado grandes para caber en el búfer de transacción, la llamada fallará y se lanzará TransactionTooLargeException.

esta forma se refieren enlace android developer

0

emulador pierde atribuye la carga de memoria en el intento, por lo que la excepción se produce

Cuestiones relacionadas