我有自定义相机应用程序。捕获图像时,应用程序崩溃。它应该看起来像捕获然后图像将在屏幕上预览但它崩溃(内存不足错误)。有两个活动(一个是带有两个按钮的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);
}
}
帮助我。
答案 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);