gpt4 book ai didi

java - 使用 Android 相机拍照( Intent )内存不足错误

转载 作者:搜寻专家 更新时间:2023-11-01 09:08:23 25 4
gpt4 key购买 nike

我在使用以下代码时遇到了两个问题。它只是使用相机 android 的 Intent “点击”拍照,并将图像显示在 ImageView 上。

  1. 在不离开 Activity 的情况下拍摄两三张图片后,当我旋转显示器时,它经常崩溃并出现内存不足错误。
  2. 当我第一次拍照时,它会刷新 ImageView ,但是当我第二次或第三次拍照时...它不会刷新图片,直到我旋转屏幕
  3. 我想将图片保存在内部存储而不是外部存储上,但我不知道该怎么做,因为我尝试了几个教程,但它卡住了相机!

    公共(public)类 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());
    }

    }

最佳答案

你有内存泄漏。旋转屏幕导致内存耗尽的原因是因为屏幕旋转会自动销毁 Activity 并重建它。您可以通过覆盖 onPause 和 onStart 方法并在其中放置调试语句来证明这一点,然后旋转屏幕,您会看到它们被调用。您需要了解 android Activity 生命周期。

你有内存泄漏,因为你在内存中保留对这些图像的引用。您需要跟踪内存使用情况。当你倾斜屏幕时,旧的 Activity 会留在内存中,并创建一个新的 Activity。为了让垃圾收集器收集不需要的对象,您必须确保代码中没有留下对它们的引用。有一些工具可以绘制应用程序的内存使用情况图表,这样您就可以找出内存泄漏的位置:

按照本页中的说明让 MAT 告诉您内存泄漏的位置:

Memory Analyzer Tool in android?

关于java - 使用 Android 相机拍照( Intent )内存不足错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10163071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com