2010-02-15 18 views
11

Tôi nhận được lỗi giao dịch Không kết nối lỗi trong logcat khi trả lại hình ảnh được quay bằng máy ảnh về mục đích của cha mẹ (dưới dạng byte [] sử dụng putExtra). Tôi không hiểu tại sao, nó không giống như một bitmap lớn hay bất cứ thứ gì. Nó chỉ xảy ra khi tôi chụp ảnh với nhiều ánh sáng, bởi vì sau đó byte [] lớn hơn. Lỗi xảy ra khi rời khỏi máy ảnh. Có ai thấy lỗi trong mã của tôi không?Giao dịch Binder không thành công khi trả lại hình ảnh máy ảnh

Đây là mã của mục đích camera:

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

} 

Và đây là đoạn code mà các cuộc gọi mục đích camera:

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

Bạn đã bao giờ làm việc này? Tôi đang gặp vấn đề tương tự. –

Trả lời

17

Đối với một số lý do, Android không giống như khi bạn cố gắng để chuyển mảng byte thô [] hoặc bitmap được tạo từ nó. Một số người đã thành công khi nén Bitmap kết quả và truyền qua Intent. Tôi khuyên bạn nên lưu hình ảnh vào một tệp đầu tiên và gửi đường dẫn của nó qua Intent.

+0

đảm bảo dữ liệu trả về là sai – hunterp

+2

@hunterp ý của người thợ săn đó là gì? Tôi đang gặp sự cố này và cần khắc phục sự cố. – Metropolis

2

Trong khi gọi thủ tục từ xa, các đối số và giá trị trả về của cuộc gọi được chuyển thành đối tượng Parcel được lưu trữ trong bộ đệm giao dịch Binder. Nếu các đối số hoặc giá trị trả về quá lớn để vừa với bộ đệm giao dịch, thì cuộc gọi sẽ thất bại và TransactionTooLargeException sẽ bị ném.

tham khảo hình thức liên kết này android developer

0

Emulator mất tải bộ nhớ trong thuộc tính mục đích, vì vậy ngoại lệ xảy ra

Các vấn đề liên quan