在Android中预览图像时出现内存不足错误

时间:2013-10-21 09:26:42

标签: android

我有自定义相机应用程序。捕获图像时,应用程序崩溃。它应该看起来像捕获然后图像将在屏幕上预览但它崩溃(内存不足错误)。有两个活动(一个是带有两个按钮的CustomCamera活动和带有两个按钮的预览活动)。

这是我的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 个答案:

答案 0 :(得分:0)

可以看看这个 http://developer.android.com/training/displaying-bitmaps/index.html

Strange out of memory issue while loading an image to a Bitmap object

BitmapFactory.Options options=new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap=BitmapFactory.decodeStream(is,null,options);