Question

Friends,

I am using this function to decode my bitmap

public String BitMapToString(Bitmap bitmap){
            ByteArrayOutputStream baos=new  ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG,100, baos);
            byte [] b=baos.toByteArray();
            String temp=null;
            try{
            System.gc();
            temp=Base64.encodeToString(b, Base64.DEFAULT);
            }catch(Exception e){
                e.printStackTrace();
            }catch(OutOfMemoryError e){
                baos=new  ByteArrayOutputStream();
                bitmap.compress(Bitmap.CompressFormat.JPEG,50, baos);
                b=baos.toByteArray();
                temp=Base64.encodeToString(b, Base64.DEFAULT);
                Log.e("EWN", "Out of memory error catched");
            }
            return temp;
      }

I got this from a post on SO long back. This is working fine on Nexus, but crashing on Samsung phones...I call this in an async task but still its givign me a crash...here is the trace of the exception:

java.lang.RuntimeException: An error occured while executing doInBackground()
at android.os.AsyncTask$3.done in AsyncTask.java on Line 278
at java.util.concurrent.FutureTask$Sync.innerSetException in FutureTask.java on Line 273
at java.util.concurrent.FutureTask.setException in FutureTask.java on Line 124
at java.util.concurrent.FutureTask$Sync.innerRun in FutureTask.java on Line 307
at java.util.concurrent.FutureTask.run in FutureTask.java on Line 137
at android.os.AsyncTask$SerialExecutor$1.run in AsyncTask.java on Line 208
at java.util.concurrent.ThreadPoolExecutor.runWorker in ThreadPoolExecutor.java on Line 1076
at java.util.concurrent.ThreadPoolExecutor$Worker.run in ThreadPoolExecutor.java on Line 569
at java.lang.Thread.run in Thread.java on Line 856
Caused by: java.lang.OutOfMemoryError
at java.lang.String.<init> in String.java on Line 375
at java.lang.String.<init> in String.java on Line 238
at android.util.Base64.encodeToString in Base64.java on Line 456
at com.xxx.xxxx.activity.XXXActivity$SubmitData.BitMapToString in XXXActivity.java on Line 530
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 339
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 1
at android.os.AsyncTask$2.call in AsyncTask.java on Line 264
at java.util.concurrent.FutureTask$Sync.innerRun in FutureTask.java on Line 305
... 5 more
java.lang.OutOfMemoryError
at java.lang.String.<init> in String.java on Line 375
at java.lang.String.<init> in String.java on Line 238
at android.util.Base64.encodeToString in Base64.java on Line 456
at com.xxx.xxxx.activity.XXXActivity$SubmitData.BitMapToString in XXXActivity.java on Line 530
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 339
at com.xxx.xxxx.activity.XXXActivity$SubmitData.doInBackground in XXXActivity.java on Line 1
at android.os.AsyncTask$2.call in AsyncTask.java on Line 264
at java.util.concurrent.FutureTask$Sync.innerRun in FutureTask.java on Line 305
at java.util.concurrent.FutureTask.run in FutureTask.java on Line 137
at android.os.AsyncTask$SerialExecutor$1.run in AsyncTask.java on Line 208
at java.util.concurrent.ThreadPoolExecutor.runWorker in ThreadPoolExecutor.java on Line 1076
at java.util.concurrent.ThreadPoolExecutor$Worker.run in ThreadPoolExecutor.java on Line 569
at java.lang.Thread.run in Thread.java on Line 856
Was it helpful?

Solution

I would take a look at Androids Developer documentation on loading large bitmaps and scaling them down before saving them into memory. It may not be the solution you need but i'm sure it can help point you in the right direction.

http://developer.android.com/training/displaying-bitmaps/load-bitmap.html

Good Luck!

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top