user3445240
user3445240

Reputation:

when converting image into base 64 encoded String android gives Out of memory on a 7967328-byte allocation. Exception

I want to send images to the server for that I have to convert images into base 64 encoded String but gives me the Out of memory on a 7967328-byte allocation. exception not always but most of the time Maybe it happens because of large image size but i don't find a way to solve this problem here is my code which converts an image into base 64 String

public class ConvertImage1 {
    public static String convert(String path){
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream(path);

        byte[] bytes;
        byte[] buffer = new byte[8192];
        int bytesRead;
        ByteArrayOutputStream output = new ByteArrayOutputStream();
        try {
            while ((bytesRead = inputStream.read(buffer)) != -1) {
            output.write(buffer, 0, bytesRead);
            output.flush();
        }
        } catch (IOException e) {
        e.printStackTrace();
        }
        bytes = output.toByteArray();
        String encodedString = Base64.encodeToString(bytes, Base64.DEFAULT);
        return TextUtils.htmlEncode(encodedString);
        } catch (FileNotFoundException e1) {

            e1.printStackTrace();
        }
        finally{
            try {
                inputStream.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   }
        return null;
        }

}

Here is the Logcat

06-01 18:04:02.518: E/dalvikvm-heap(14027): Out of memory on a 7967328-byte allocation.
06-01 18:04:02.518: I/dalvikvm(14027): "AsyncTask #1" prio=5 tid=11 RUNNABLE
06-01 18:04:02.518: I/dalvikvm(14027):   | group="main" sCount=0 dsCount=0 obj=0x419dd708 self=0x4f7fab30
06-01 18:04:02.518: I/dalvikvm(14027):   | sysTid=14314 nice=10 sched=0/0 cgrp=apps/bg_non_interactive handle=1333784720
06-01 18:04:02.518: I/dalvikvm(14027):   | schedstat=( 0 0 0 ) utm=386 stm=11 core=0
06-01 18:04:02.518: I/dalvikvm(14027):   at java.lang.String.<init>(String.java:~432)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.lang.StringBuilder.toString(StringBuilder.java:663)
06-01 18:04:02.518: I/dalvikvm(14027):   at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:170)
06-01 18:04:02.518: I/dalvikvm(14027):   at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:71)
06-01 18:04:02.518: I/dalvikvm(14027):   at com.example.gallreylogs.GallreyObserver1$rest.doInBackground(GallreyObserver1.java:221)
06-01 18:04:02.518: I/dalvikvm(14027):   at com.example.gallreylogs.GallreyObserver1$rest.doInBackground(GallreyObserver1.java:1)
06-01 18:04:02.518: I/dalvikvm(14027):   at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-01 18:04:02.518: I/dalvikvm(14027):   at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-01 18:04:02.518: I/dalvikvm(14027):   at java.lang.Thread.run(Thread.java:856)
06-01 18:04:02.518: W/dalvikvm(14027): threadid=11: thread exiting with uncaught exception (group=0x4102d2a0)
06-01 18:04:02.528: E/AndroidRuntime(14027): FATAL EXCEPTION: AsyncTask #1
06-01 18:04:02.528: E/AndroidRuntime(14027): java.lang.RuntimeException: An error occured while executing doInBackground()
06-01 18:04:02.528: E/AndroidRuntime(14027):    at android.os.AsyncTask$3.done(AsyncTask.java:299)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.FutureTask.run(FutureTask.java:137)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:230)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.lang.Thread.run(Thread.java:856)
06-01 18:04:02.528: E/AndroidRuntime(14027): Caused by: java.lang.OutOfMemoryError
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.lang.String.<init>(String.java:432)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.lang.AbstractStringBuilder.toString(AbstractStringBuilder.java:642)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.lang.StringBuilder.toString(StringBuilder.java:663)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at org.apache.http.client.utils.URLEncodedUtils.format(URLEncodedUtils.java:170)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at org.apache.http.client.entity.UrlEncodedFormEntity.<init>(UrlEncodedFormEntity.java:71)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at com.example.gallreylogs.GallreyObserver1$rest.doInBackground(GallreyObserver1.java:221)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at com.example.gallreylogs.GallreyObserver1$rest.doInBackground(GallreyObserver1.java:1)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at android.os.AsyncTask$2.call(AsyncTask.java:287)
06-01 18:04:02.528: E/AndroidRuntime(14027):    at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)
06-01 18:04:02.528: E/AndroidRuntime(14027):    ... 5 more

Upvotes: 1

Views: 426

Answers (1)

SohailAziz
SohailAziz

Reputation: 8034

This is because after converting to base64 image size become very large. Tryout small size image and you will understand this.

Upvotes: 0

Related Questions