2010-02-15 16 views
11

Fotoğraf makinesiyle çekilen görüntüyü ana makinenin amacına (putExtra kullanarak bir bayt [] olarak) döndürdüğünüzde, geçersiz kılma işlem hatası alıyorum. Nedenini anlamıyorum, onun büyük bir bitmap ya da herhangi bir şey gibi değil. Sadece çok fazla ışıkla fotoğraf çektiğimde olur, çünkü bayt [] daha büyüktür. Kamera niyetinden ayrılırken hata oluşur. Kodumda bir hata gören var mı? İşte Makine görüntüsünü döndürürken Binder İşlemi Başarısız Oldu

kamera niyet kodudur:

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(); 
    } 

} 

Ve burada kamera niyet çağıran kodunuz: çalıştıklarında

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

Hiç bu çalışma almak mı oluşuyor? Aynı sorunu yaşıyorum. –

cevap

17

Nedense, Android sevmez ham byte [] dizisini veya ondan oluşturulan bir Bitmap'i iletmek için. Bazı insanlar, sonuçta oluşan Bitmap'i sıkıştırarak ve bunu Intent aracılığıyla geçirerek başarı elde ettiler. Görüntüyü önce bir dosyaya kaydetmenizi ve bu yolu Intent aracılığıyla göndermenizi tavsiye ederim.

+0

Dönüş verileri yanlış olduğundan emin olun – hunterp

+2

@hunterp Bu avcı tarafından ne demek istiyorsunuz? Bu problemi yaşıyorum ve düzeltmem gerekiyor. – Metropolis

2

Uzaktan yordam çağrısı sırasında, çağrının argümanları ve dönüş değeri, Ciltçi işlem arabelleğinde saklanan Parsel nesneleri olarak aktarılır. Bağımsız değişkenler veya dönüş değeri işlem arabelleğine sığmayacak kadar büyükse, çağrı başarısız olur ve TransactionTooLargeException atılır.

android developer

0

Emülatörü bellek yükü niyet öznitelikleri kaybeder bu bağlantı formu bakın, bu nedenle istisna

İlgili konular