2013-10-21 63 views
0

我有一個自定義相機應用程序。捕捉圖像時,應用程序崩潰。它應該看起來像捕獲然後圖像將在屏幕上預覽,但它崩潰(內存不足錯誤)。有兩個活動(一個是帶有兩個按鈕的CustomCamera活動和兩個按鈕的預覽活動)。內存不足錯誤在android中預覽圖像時出現錯誤

這裏是我的CustomCameraActivity:

public class CustomCameraActivity extends Activity implements 
    SurfaceHolder.Callback { 


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

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.main); 

    context = this; 

    sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE); 
    mOrientaion1 = sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION); 

    // setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_LANDSCAPE); 

    imageView = (ImageView) findViewById(R.id.imgError); 

    getWindow().setFormat(PixelFormat.UNKNOWN); 
    surfaceView = (SurfaceView) findViewById(R.id.camerapreview); 
    surfaceHolder = surfaceView.getHolder(); 
    surfaceHolder.addCallback(this); 
    surfaceHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); 

    controlInflater = LayoutInflater.from(getBaseContext()); 
    View viewControl = controlInflater.inflate(R.layout.custom, null); 
    LayoutParams layoutParamsControl = new LayoutParams(
      LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT); 

    Button btn1 = (Button) viewControl.findViewById(R.id.Button01); 
    Button btn2 = (Button) viewControl.findViewById(R.id.Button02); 

    btn1.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // Toast.makeText(context, "1111111111111111111111111", 
      // Toast.LENGTH_SHORT).show(); 
      camera.takePicture(null, null, mPicture); 

      Constant.rotationValueForCamera = Constant.rotationValue; 
     } 
    }); 

    btn2.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // Toast.makeText(context, "22222222222222222222222222", 
      // Toast.LENGTH_SHORT).show(); 
      Log.e("0 imagePickerStatus", Constant.imagePickerStatus + ""); 

      Constant.imagePickerStatus = 0; 

      Log.e("0 imagePickerStatus", Constant.imagePickerStatus + ""); 

      finish(); 
     } 
    }); 

    this.addContentView(viewControl, layoutParamsControl); 

    int ot = getResources().getConfiguration().orientation; 

    if (Configuration.ORIENTATION_LANDSCAPE == ot) { 
     imageView.setVisibility(View.GONE); 
     Log.e("ori1111", "land"); 
    } else { 
     imageView.setVisibility(View.VISIBLE); 
     Log.e("ori111", "port"); 
    } 
} 

@Override 
public void onConfigurationChanged(Configuration newConfig) { 
    super.onConfigurationChanged(newConfig); 

    // Checks the orientation of the screen 
    if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) { 
     // Toast.makeText(this, "landscape", Toast.LENGTH_SHORT).show(); 
     findViewById(R.id.Button01).setVisibility(View.VISIBLE); 
     findViewById(R.id.Button02).setVisibility(View.VISIBLE); 
     imageView.setVisibility(View.GONE); 
     Log.e("ori", "land"); 
    } else if (newConfig.orientation == Configuration.ORIENTATION_PORTRAIT) { 
     // Toast.makeText(this, "portrait", Toast.LENGTH_SHORT).show(); 
     findViewById(R.id.Button01).setVisibility(View.INVISIBLE); 
     findViewById(R.id.Button02).setVisibility(View.INVISIBLE); 
     imageView.setVisibility(View.VISIBLE); 
     Log.e("ori", "port"); 
    } 
} 

protected void onPause() { 
    super.onPause(); 

    sensorManager.unregisterListener(sensorEventListener); 

} 

@Override 
public void onResume() { 
    super.onResume(); 

    sensorManager.registerListener(sensorEventListener, 
      sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), 
      SensorManager.SENSOR_DELAY_NORMAL); 
    sensorManager.registerListener(sensorEventListener, 
      sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), 
      SensorManager.SENSOR_DELAY_NORMAL); 
    sensorManager.registerListener(sensorEventListener, 
      sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), 
      SensorManager.SENSOR_DELAY_NORMAL); 

    if (Constant.isCapturedOk) { 
     Constant.isCapturedOk = false; 

     finish(); 
    } 

} 

PictureCallback mPicture = new PictureCallback() { 
    @Override 
    public void onPictureTaken(byte[] data, Camera camera) { 

     Log.e("Camrera", "22222222222222222"); 

     Intent intent = new Intent(context, PreviewActivity.class); 
     // intent.putExtra("data", data); 
     Bitmap bitmapPicture = BitmapFactory.decodeByteArray(data, 0, 
       data.length); 
     Matrix matrix = new Matrix(); 
     if (Constant.result == 180) { 
      matrix.postRotate(270); 
     } 
     if (Constant.result == 270) { 
      matrix.postRotate(180); 
     } 
     int height = bitmapPicture.getHeight(); 
     int width = bitmapPicture.getWidth(); 
     Bitmap scaledBitmap = Bitmap.createScaledBitmap(bitmapPicture, 
       height, width, true); 
     Bitmap rotatedBitmap = Bitmap.createBitmap(scaledBitmap, 0, 0, 
       scaledBitmap.getWidth(), scaledBitmap.getHeight(), matrix, 
       true); 

     ByteArrayOutputStream blob = new ByteArrayOutputStream(); 
     rotatedBitmap.compress(CompressFormat.PNG, 0 /*ignored for PNG*/, blob); 
     byte[] bitmapdata = blob.toByteArray(); 
     Constant.imageData = bitmapdata; 
     startActivity(intent); 

    } 
}; 

@Override 
public void surfaceChanged(SurfaceHolder holder, int format, int width, 
     int height) { 
    if (previewing) { 
     camera.stopPreview(); 
     previewing = false; 
    } 

    if (camera != null) { 
     try { 
      camera.setPreviewDisplay(holder); 
      camera.startPreview(); 
      setCameraDisplayOrientation(this,cameraId,camera); 
      previewing = true; 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

public static void setCameraDisplayOrientation(Activity activity, 
     int cameraId, android.hardware.Camera camera) { 
    android.hardware.Camera.CameraInfo info = new android.hardware.Camera.CameraInfo(); 
    android.hardware.Camera.getCameraInfo(cameraId, info); 
    int rotation = activity.getWindowManager().getDefaultDisplay() 
      .getRotation(); 
    int degrees = 0; 
    switch (rotation) { 
    case Surface.ROTATION_0: 
     degrees = 0; 
     Constant.result = 0; 
     break; 
    case Surface.ROTATION_90: 
     degrees = 90; 
     Constant.result = 90; 
     break; 
    case Surface.ROTATION_180: 
     degrees = 180; 
     Constant.result = 180; 
     break; 
    case Surface.ROTATION_270: 
     degrees = 270; 
     Constant.result = 270; 
     break; 
    } 

    int result; 
    if (info.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { 
     result = (info.orientation + degrees) % 360; 
     result = (360 - result) % 360; // compensate the mirror 
    } else { // back-facing 
     result = (info.orientation - degrees + 360) % 360; 
    } 
    camera.setDisplayOrientation(result); 
} 

@Override 
public void surfaceCreated(SurfaceHolder holder) { 
    camera = Camera.open(); 
} 

@Override 
public void surfaceDestroyed(SurfaceHolder holder) { 
    camera.stopPreview(); 
    camera.release(); 
    camera = null; 
    previewing = false; 
} 

@Override 
protected void onStop() { 
    super.onStop(); 

    Log.e("Tab", "Stoping"); 
} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    if (keyCode == KeyEvent.KEYCODE_BACK) { 

     return true; 

    } 
    return super.onKeyDown(keyCode, event); 

} 

}

這裏是我的預覽活動:

public class PreviewActivity extends Activity { 

Context context; 
Button btnRetake, btnOk; 
// byte[] data; 
ImageView imgPreview; 

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

    requestWindowFeature(Window.FEATURE_NO_TITLE); 
    getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, 
      WindowManager.LayoutParams.FLAG_FULLSCREEN); 

    setContentView(R.layout.preview_layout); 

    context = this; 

    setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_SENSOR); 

    btnRetake = (Button) findViewById(R.id.btn1FromPreviw); 
    btnOk = (Button) findViewById(R.id.btn2FromPreviw); 

    imgPreview = (ImageView) findViewById(R.id.imgImagePreview); 

    // Intent myIntent = getIntent(); 

    // data = myIntent.getExtras().getByteArray("data"); 

    Drawable image = null; 
    image = new BitmapDrawable(BitmapFactory.decodeByteArray(
      Constant.imageData, 0, Constant.imageData.length)); 
    imgPreview.setBackgroundDrawable(image); 
    // image = new BitmapDrawable(Constant.imageData); 
    // imgPreview.setBackgroundDrawable(image); 

    btnRetake.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      Constant.isCapturedOk = false; 

      finish(); 
     } 
    }); 

    btnOk.setOnClickListener(new OnClickListener() { 

     @Override 
     public void onClick(View arg0) { 
      // TODO Auto-generated method stub 
      SaveImage(); 
     } 
    }); 

} 

private void SaveImage() { 
    /* 
    * File pictureFile = getOutputMediaFile(); if (pictureFile == null) { 
    * Log.e("Camrera", "nullllllllllllllllll"); return; } 
    */ 
    try { 

     Bitmap bitmap = BitmapFactory.decodeByteArray(Constant.imageData , 0, Constant.imageData.length); 

     ByteArrayOutputStream stream = new ByteArrayOutputStream(); 

     bitmap.compress(Bitmap.CompressFormat.JPEG ,50 , stream); 

     File file = new File(Environment.getExternalStorageDirectory() 
       + File.separator + "Android" + File.separator + "data" 
       + File.separator + context.getPackageName() 
       + File.separator + "files" + File.separator + "image.jpg"); 

     Log.e("pa", file.getPath() + " : " + file.getAbsolutePath()); 
     Log.e("len", stream.size() + ""); 

     file.createNewFile(); 

     /* 
     * Log.e("Camrera", "yesssssssssssssssssss"); Log.e("Camrera", 
     * pictureFile.getAbsolutePath()); 
     */ 
     FileOutputStream fos = new FileOutputStream(file); 
     fos.write(stream.toByteArray()); 
     fos.close(); 

     Log.e("Camrera", "great"); 

     Constant.isCapturedOk = true; 

     Log.e("1 imagePickerStatus", Constant.imagePickerStatus + ""); 

     Constant.imagePickerStatus = 1; 

     Log.e("1 imagePickerStatus", Constant.imagePickerStatus + ""); 

     finish(); 

    } catch (FileNotFoundException e) { 
     Log.e("mPicture FileNotFoundException", e.toString()); 
    } catch (IOException e) { 
     Log.e("mPicture IOException", e.toString()); 
    } 
} 

private File getOutputMediaFile() { 

    File mediaFile = new File(Environment.getExternalStorageDirectory() 
      + File.separator + "Android" + File.separator + "data" 
      + File.separator + context.getPackageName() + File.separator 
      + "files" + File.separator + "image.jpg"); 

    return mediaFile; 
} 

@Override 
protected void onStop() { 
    super.onStop(); 

    Log.e("Tab", "Stoping"); 

} 

@Override 
public boolean onKeyDown(int keyCode, KeyEvent event) { 

    if (keyCode == KeyEvent.KEYCODE_BACK) { 

     return true; 

    } 
    return super.onKeyDown(keyCode, event); 

} 

}

幫助我。

+1

http://developer.android.com/training/displaying-bitmaps/index.html一看 – fasteque

+0

使用可以使用UniversalImageLoader。它爲你做的工作:下載,存儲,緩存,調整大小...等 –

+1

拍攝圖像,處理它,然後將其加載到內存中。嘗試修改您的onPictureTaken方法 –

回答

相關問題