android - OutOfMemory Error when trying to rescale a Bitmap -


im trying scale bitmap make fit because device wont show images > 2048.

i found solution app crashes when choose/take pic.

that piece of code: (inside onactivityresult)

currimageuri = data.getdata();                 path=(getrealpathfromuri(currimageuri));                  drawable d = drawable.createfrompath(path);                 image.setvisibility(view.visible);                 mphoto=drawabletobitmap(d);                 bitmap sized = mphoto;                 if(mphoto.getheight()>=2048||mphoto.getwidth()>=2048){                 sized = bitmap.createscaledbitmap(mphoto, (int)(mphoto.getwidth()*0.8), (int)(mphoto.getheight()*0.8), false);                 }                  image.setimagebitmap(sized); 

logcat:

08-28 22:48:14.873: e/androidruntime(12047): fatal exception: main 08-28 22:48:14.873: e/androidruntime(12047): java.lang.outofmemoryerror 08-28 22:48:14.873: e/androidruntime(12047):    @ android.graphics.bitmap.nativecreate(native method) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.graphics.bitmap.createbitmap(bitmap.java:640) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.graphics.bitmap.createbitmap(bitmap.java:586) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.graphics.bitmap.createscaledbitmap(bitmap.java:466) 08-28 22:48:14.873: e/androidruntime(12047):    @ com.example.free.add.onactivityresult(add.java:149) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.app.activity.dispatchactivityresult(activity.java:5231) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.app.activitythread.deliverresults(activitythread.java:3172) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.app.activitythread.handlesendresult(activitythread.java:3219) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.app.activitythread.access$1200(activitythread.java:134) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.app.activitythread$h.handlemessage(activitythread.java:1265) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.os.handler.dispatchmessage(handler.java:99) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.os.looper.loop(looper.java:137) 08-28 22:48:14.873: e/androidruntime(12047):    @ android.app.activitythread.main(activitythread.java:4856) 08-28 22:48:14.873: e/androidruntime(12047):    @ java.lang.reflect.method.invokenative(native method) 08-28 22:48:14.873: e/androidruntime(12047):    @ java.lang.reflect.method.invoke(method.java:511) 08-28 22:48:14.873: e/androidruntime(12047):    @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1007) 08-28 22:48:14.873: e/androidruntime(12047):    @ com.android.internal.os.zygoteinit.main(zygoteinit.java:774) 08-28 22:48:14.873: e/androidruntime(12047):    @ dalvik.system.nativestart.main(native method) 

line 149 is:

sized = bitmap.createscaledbitmap(mphoto, (int)(mphoto.getwidth()*0.8), (int)(mphoto.getheight()*0.8), false); 

could tell me can prevent crashing? thanks!

update:

app still crashes:

08-28 23:24:20.219: w/dalvikvm(16289): threadid=1: thread exiting uncaught exception (group=0x412552a0)    08-28 23:18:59.917: e/androidruntime(15286): fatal exception: main     08-28 23:18:59.917: e/androidruntime(15286): java.lang.outofmemoryerror     08-28 23:18:59.917: e/androidruntime(15286):    @ android.graphics.bitmap.nativecreate(native method)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.graphics.bitmap.createbitmap(bitmap.java:640)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.graphics.bitmap.createbitmap(bitmap.java:586)     08-28 23:18:59.917: e/androidruntime(15286):    @ com.example.free.add.getresizedbitmap(add.java:335)     08-28 23:18:59.917: e/androidruntime(15286):    @ com.example.free.add.onactivityresult(add.java:150)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.app.activity.dispatchactivityresult(activity.java:5231)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.app.activitythread.deliverresults(activitythread.java:3172)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.app.activitythread.handlesendresult(activitythread.java:3219)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.app.activitythread.access$1200(activitythread.java:134)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.app.activitythread$h.handlemessage(activitythread.java:1265)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.os.handler.dispatchmessage(handler.java:99)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.os.looper.loop(looper.java:137)     08-28 23:18:59.917: e/androidruntime(15286):    @ android.app.activitythread.main(activitythread.java:4856)     08-28 23:18:59.917: e/androidruntime(15286):    @ java.lang.reflect.method.invokenative(native method)     08-28 23:18:59.917: e/androidruntime(15286):    @ java.lang.reflect.method.invoke(method.java:511)     08-28 23:18:59.917: e/androidruntime(15286):    @ com.android.internal.os.zygoteinit$methodandargscaller.run(zygoteinit.java:1007)     08-28 23:18:59.917: e/androidruntime(15286):    @ com.android.internal.os.zygoteinit.main(zygoteinit.java:774)     08-28 23:18:59.917: e/androidruntime(15286):    @ dalvik.system.nativestart.main(native method) 

code:

currimageuri = data.getdata();                 path=(getrealpathfromuri(currimageuri));                  drawable d = drawable.createfrompath(path);                 image.setvisibility(view.visible);                 mphoto=drawabletobitmap(d);                 bitmap sized = mphoto;                 if(mphoto.getheight()>=2048||mphoto.getwidth()>=2048){                     sized=getresizedbitmap(mphoto,(int)(mphoto.getheight()*0.8),(int)(mphoto.getwidth()*0.8));                 }                  image.setimagebitmap(sized);          

please have @ related question:

high resolution image - outofmemoryerror

i recommend put image drawables folder. there, load appropriate size using code below. reduce memory usage of app , use memory needed.

make sure have 1 instance of bitmap in memory. after displaying it, call recycle() , set reference null.

this how load images:

public  bitmap scaledownbitmap(bitmap photo, int newheight) {       final float densitymultiplier = getresources().getdisplaymetrics().density;       int h= (int) (newheight*densitymultiplier);      int w= (int) (h * photo.getwidth()/((double) photo.getheight()));       photo = bitmap.createscaledbitmap(photo, w, h, true);       return photo; } 

use this:

imageview.setimagebitmap(scaledownbitmap(youroldbitmap, 300)); 

be aware not use high value newheight , keep in mind densitymultiplier.

taken from: failed binder transaction when putting bitmap dynamically in widget


Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -