如何正确提取文件(内存不足)?

时间:2016-06-01 13:48:32

标签: android

在启动我的应用程序时,我想将我的图像(如果它们不存在)从可绘制文件夹提取到内部应用程序文件夹,以便稍后使用FileProvider。图像尺寸为2000 * 2000,平均尺寸为380kb,格式为png 不显示那些图像(较小的图像用于显示)。它们仅用于文件共享,我必须保持原始大小 我打电话给

时记忆犹新
Bitmap bm = BitmapFactory.decodeResource(getResources(), imageResID);

代码

private void extractImages() {
    TypedArray imgs = getResources().obtainTypedArray(R.array.smile_list_share);
    File imagePath = new File(getFilesDir(), "images");
    File checkImage;
    for (int i = 0; i < imgs.length(); i++) {
      int imageResID = imgs.getResourceId(i, 0);
      if (imageResID > 0) {
        String name = getResources().getResourceEntryName(imageResID);
        checkImage = new File(imagePath, name + ".png");

        if (!checkImage.exists()) {
          Bitmap bm = BitmapFactory.decodeResource(getResources(), imageResID);
          boolean b = saveBitmapToFile(imagePath, name + ".png", bm, Bitmap.CompressFormat.PNG, 100);

          Log.e("mcheck","saved "+b+", file "+name);
          Log.e("mcheck", "file does not exists " + name);
        } else {
          Log.e("mcheck", "file exists " + name);
        }
      } else {
        Log.e("mcheck", "ERROR " + i);
      }
    }
    imgs.recycle();
  }

  public boolean saveBitmapToFile(File dir, String fileName, Bitmap bm,
      Bitmap.CompressFormat format, int quality) {

    File imageFile = new File(dir, fileName);

    FileOutputStream fos = null;
    try {
      fos = new FileOutputStream(imageFile);

      bm.compress(format, quality, fos);
      bm.recycle();
      fos.close();

      return true;
    } catch (IOException e) {
      Log.e("app", e.getMessage());
      if (fos != null) {
        try {
          fos.close();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }
    }
    return false;
  }

2 个答案:

答案 0 :(得分:0)

每次完成后,都必须在位图对象上调用recycle。 这是一个很好的指导如何有效地操作位图 https://developer.android.com/training/displaying-bitmaps/load-bitmap.html

答案 1 :(得分:0)

我发现我根本不需要创建位图对象。可以直接从getResourses获取输入流。

public boolean saveBitmapToFile(File dir, String fileName, int imageResourse) {

    File imageFile = new File(dir, fileName);

    FileOutputStream fos = null;
    InputStream inputStream = null;
    try {
      fos = new FileOutputStream(imageFile);
      inputStream = getResources().openRawResource(imageResourse);
      int bufferSize = 1024;
      byte[] buffer = new byte[bufferSize];
      int len = 0;
      while ((len = inputStream.read(buffer)) != -1) {
        fos.write(buffer, 0, len);
      }
      inputStream.close();
      fos.close();

      return true;
    } catch (IOException e) {
      Log.e("app", e.getMessage());
      if (fos != null) {
        try {
          fos.close();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }
      if (inputStream != null) {
        try {
          inputStream.close();
        } catch (IOException e1) {
          e1.printStackTrace();
        }
      }
    }
    return false;
  }