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
Post a Comment