2010-02-15 14 views
11

मुझे कैमरे के साथ कैमरे के इरादे से कैमरे के साथ ली गई छवि को वापस करने के दौरान लॉककैट में विफल बाइंडर लेनदेन त्रुटि मिलती है (एक बाइट [] के रूप में putExtra का उपयोग करके)। मुझे समझ में नहीं आता क्यों, यह एक बड़ा बिटमैप या कुछ भी पसंद नहीं है। यह तब होता है जब मैं बहुत सारी रोशनी के साथ चित्र लेता हूं, क्योंकि तब बाइट [] बड़ा होता है। कैमरे के इरादे को छोड़ते समय त्रुटि होती है। क्या कोई मेरे कोड में कोई गलती देखता है? यहाँकैमरे की छवि लौटने पर असफल बाइंडर लेनदेन

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

} 

और कोड कि कैमरे के इरादे कहता है:

यहाँ कैमरा आशय का कोड है

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

आप कभी भी इस काम के मिली थी? मुझे एक ही समस्या है। –

उत्तर

17

किसी कारण के लिए, Android पसंद नहीं है जब आप की कोशिश कच्चे बाइट [] सरणी या इससे निर्मित बिटमैप पास करने के लिए। कुछ लोगों ने सफलतापूर्वक बिटमैप को संपीड़ित करने और इरादे के माध्यम से इसे पारित करने में सफलता प्राप्त की है। मैं छवि को पहले फ़ाइल में सहेजने और इरादे के माध्यम से अपना रास्ता भेजने की अनुशंसा करता हूं।

+0

सुनिश्चित करें कि वापसी-डेटा गलत है – hunterp

+2

@hunterp उस शिकारी द्वारा आपका क्या मतलब है? मुझे यह समस्या है और इसे ठीक करने की आवश्यकता है। – Metropolis

2

रिमोट प्रक्रिया कॉल के दौरान, कॉल के तर्क और वापसी मूल्य को बाइंडर लेनदेन बफर में संग्रहीत पार्सल ऑब्जेक्ट्स के रूप में स्थानांतरित किया जाता है। यदि लेनदेन बफर में फिट होने के लिए तर्क या वापसी मूल्य बहुत बड़ा होता है, तो कॉल विफल हो जाएगी और लेनदेन TooLargeException फेंक दिया जाएगा।

इस लिंक प्रपत्र android developer

0

एम्यूलेटर स्मृति लोड इरादे में विशेषताओं खो देता है उल्लेख है, तो अपवाद तब होता है

संबंधित मुद्दे