简体   繁体   English

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

[英]Out of memory Error when previewing image in android

I have a custom camera application. 我有一个自定义相机应用程序。 When capture a image the application crashes. 捕获图像时,应用程序崩溃。 It should look like when capture then the image will preview on the screen but it crashes(Out of memory error). 看起来像是在捕获时,然后图像将在屏幕上预览,但是崩溃(内存不足错误)。 There are two activity (one is CustomCamera activity with two buttons and Preview activity with two buttons). 有两个活动(一个是具有两个按钮的CustomCamera活动和具有两个按钮的预览活动)。

Here is my CustomCameraActivity: 这是我的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);

}

} }

Here is my Preview Activity: 这是我的预览活动:

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

}

} }

Help me. 帮我。

Can have a look on this http://developer.android.com/training/displaying-bitmaps/index.html 可以看看这个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);

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM