我遇到以下代码有两个问题。它只是使用相机android的意图拍摄照片“onclick”,它在ImageView上显示图像。
我想在内部存储上保存图片而不是外部存储,但我不明白该怎么做因为我尝试了几个教程并且卡住了相机!
公共类HandScryActivity扩展了Activity {
private static int TAKE_PICTURE = 1;
private MtgMatch myMatch;
private File handFile;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.handscry);
// Disable screen saver
getWindow().addFlags(LayoutParams.FLAG_KEEP_SCREEN_ON);
// Load match
myMatch = MtgMatch.getSingletonMtgMatch();
handFile = new File(Environment.getExternalStorageDirectory(), "test.jpg");
if (myMatch.getHandUri() != null) { loadPicture(); }
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
loadPicture();
}
// Handles onGame clicked buttons
public void btnHandClick(View v) {
Button clickedButton = (Button) v;
// according to clicked button
switch (clickedButton.getId()) {
case R.id.btnBackToGame:
this.finish();
break;
case R.id.btnTakePicture:
myMatch.setHandUri(Uri.fromFile(handFile));
Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, myMatch.getHandUri());
startActivityForResult(intent, TAKE_PICTURE);
break;
default:
break;
}
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == TAKE_PICTURE) {
// Display image
if (resultCode == RESULT_OK) {
loadPicture();
} else if (resultCode == RESULT_CANCELED) {
// User cancelled the image capture
} else {
// Image capture failed, advise user
}
}
}
// Put the photo inside frame
private void loadPicture() {
ImageView img = (ImageView) findViewById(R.id.imgHand);
img.setImageURI(myMatch.getHandUri());
}
}
答案 0 :(得分:3)
你有内存泄漏。旋转屏幕导致内存耗尽的原因是因为屏幕旋转会自动销毁活动并重建它。您可以通过重写onPause和onStart方法并在其中放置调试语句来证明这一点,然后旋转屏幕并看到它们被调用。你需要了解android Activity Lifecycle。
您有内存泄漏,因为您在内存中保留对这些图像的引用。您需要跟踪内存使用情况。当您倾斜屏幕时,旧活动会在内存中粘附,并创建一个新活动。为了让垃圾收集器收集不必要的对象,您必须确保代码中没有任何引用。有一些工具可以绘制应用程序的内存使用情况,以便找出内存泄漏的位置:
按照本页中的说明让MAT告诉您内存泄漏的位置:
答案 1 :(得分:0)
要修复您遇到的高内存使用情况,您可能需要获取相机返回的文件,将其加载到位图,并使用位图工厂选项,设置选项以使用示例尺寸。 (这会缩小图像,但很可能您不需要在640x480屏幕上显示2560x1900图像)查看本教程:http://tutorials-android.blogspot.co.il/2011/11/outofmemory-exception-when-decoding.html
答案 2 :(得分:0)
试试这个,
在图像视图上设置图像之前解码从onActivityResult获得的位图。
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 8;
Bitmap preview_bitmap = BitmapFactory.decodeStream(is, null, options);
在图像视图上设置解码后。