2010-02-15 4 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 не нравится, когда вы пытаетесь для передачи массива raw byte [] или растрового изображения, созданного из него. Некоторым людям удалось сжать полученный битмап и передать это через Intent. Я бы рекомендовал сначала сохранить изображение в файл и отправить его путь через Intent.

+0

убедитесь, что возвращаемые данные ложны – hunterp

+2

@hunterp Что вы подразумеваете под этим охотником? У меня возникла эта проблема, и мне нужно ее исправить. – Metropolis

2

Во время вызова удаленной процедуры аргументы и возвращаемое значение вызова передаются как объекты Посылки, хранящиеся в буфере транзакции Binder. Если аргументы или возвращаемое значение слишком велики для размещения в буфере транзакций, тогда вызов завершится с ошибкой и будет выведено TransactionTooLargeException.

см этой ссылка образует android developer

0

Emulator теряет нагрузку памяти атрибутов в намерениях, поэтому происходит исключение

Смежные вопросы