java.lang.OutOfMemoryError:Android

时间:2016-07-09 15:47:10

标签: java android bitmap android-logcat

我在使用cropper库进行的一项活动中遇到了加载位图图像的问题。如果图像大小超过5 MB,我会出现内存错误...我已经尝试了

android:largeHeap="true"

但它没有帮助我解决问题。我的java代码和logcat如下所示

logcat的:

  

07-09 21:10:47.482:E / art(4870):抛出错误的错误"失败了   分配6391674字节分配6004224个空闲字节和5MB   直到OOM"       07-09 21:10:47.482:D / AndroidRuntime(4870):关闭VM       07-09 21:10:47.522:E / AndroidRuntime(4870):致命异常:主要       07-09 21:10:47.522:E / AndroidRuntime(4870):进程:com.karopass.status2017,PID:4870       07-09 21:10:47.522:E / AndroidRuntime(4870):java.lang.OutOfMemoryError:无法分配6391674字节   分配6004224个空闲字节和5MB直到OOM       07-09 21:10:47.522:E / AndroidRuntime(4870):at java.io.ByteArrayOutputStream.toByteArray(ByteArrayOutputStream.java:122)       07-09 21:10:47.522:E / AndroidRuntime(4870):at com.karopass.status2017.material.ImageLoader.addToDiskCache(ImageLoader.java:238)       07-09 21:10:47.522:E / AndroidRuntime(4870):at com.karopass.status2017.material.ImageLoader.saveTempImage(ImageLoader.java:271)

以及我的java代码如下所示

public File addToDiskCache(String imageName, Bitmap inImage) {

    Log.e("Add to Disk",imageName);

    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    inImage.compress(Bitmap.CompressFormat.JPEG, 100, bytes);

    if(!mCacheDir.exists()){
        mCacheDir.mkdirs();
    }

    File filePath=new File(mCacheDir.getPath()+File.separator+imageName);
    if(!filePath.exists()) {
        try {
            filePath.createNewFile();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    OutputStream os=null;
    try {
           os= new FileOutputStream(filePath.getPath());
            os.write(bytes.toByteArray());
            os.flush();
        } catch (IOException e) {
            Log.e("Write err",filePath.toString());
        }finally {
        try {
            os.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    Log.e("storage path",filePath.toString());

    return filePath;
}

请帮我解决问题。

由于

1 个答案:

答案 0 :(得分:1)

压缩无效

使用文件中的位图

时尝试此操作
 private Bitmap sampleImage(Bitmap bitmap, int reqWidth, int reqHight) {


        //first decode
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile("FILE_PATH",options);
        //seconde deconde
        options.inSampleSize = caculateSampleSize(options,reqWidth,reqHight);
        options.inJustDecodeBounds = false;


        bitmap = BitmapFactory.decodeFile("FILE_PATH",options);
         return bitmap;

    }

private int caculateSampleSize(BitmapFactory.Options options, int reqWidth, int reqHight) {
    int screenWidth;
    int screenHight;
    screenWidth = (reqWidth == 0 ? this.getResources().getDisplayMetrics().widthPixels : reqWidth);
    screenHight = (reqHight == 0 ? this.getResources().getDisplayMetrics().heightPixels : reqHight);
    int sampleWith = options.outWidth / screenWidth;
    int sampleHight = options.outHeight / screenHight;
    //use max
    return  sampleWith > sampleHight ? sampleWith : sampleHight;
}