user1915881
user1915881

Reputation: 23

MemoryOutOfBounds exception occuring while passing the base 64 string to SOAP

My app run successfully on a Sony Experia (2.3), but I'm getting an exception while running it on a Samsung Galaxy Tab (4.1). My problem is that after recording video and converting it in base64 string, I'm getting an error while parsing it into soap.

This is my code for capturing video (passing intent):

Intent videoIntent = new Intent(MediaStore.ACTION_VIDEO_CAPTURE);

videoIntent.putExtra(MediaStore.EXTRA_DURATION_LIMIT, 10);

videoIntent.putExtra(MediaStore.EXTRA_VIDEO_QUALITY, 0);

startActivityForResult(videoIntent, ACTION_TAKE_VIDEO);

On Activity result method:

public void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if ((requestCode == ACTION_TAKE_VIDEO && resultCode == RESULT_OK)) {
System.out.println("capturing video");
Uri selectedImage = data.getData();
String videoPath = getRealPathFromURI(selectedImage);

Bitmap bm = ThumbnailUtils.createVideoThumbnail(videoPath, MediaStore.Images.Thumbnails.MINI_KIND);
videoview.setImageBitmap(bm);
System.out.println("videobitmap=="+bm);

bytes[]datas = null;
String dataPath = videoPath;
InputStream is = null;

try {
is = new FileInputStream(dataPath);
datas = readBytes(is);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}

String encodedImage = Base64.encodeToString(datas, Base64.DEFAULT);
isInternetPresent = cd.isConnectingToInternet();

if (isInternetPresent) {
new BufferingVideo().execute(encodedImage);
} else {
Toast.makeText(getApplicationContext(), "Sorry, we couldn't connect to server, please check your 
internet connection", Toast.LENGTH_LONG).show();
}
}
}

public byte[] readBytes(InputStream inputStream) throws IOException {
ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
int bufferSize = 1024;
byte[] buffer = new byte[bufferSize];
int len = 0;

while ((len = inputStream.read(buffer)) != -1) {
byteBuffer.write(buffer, 0, len);
}

return byteBuffer.toByteArray();
}

public String getRealPathFromURI(Uri contentUri) {
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
return cursor.getString(column_index);
}

Now passing base64 string to Webservice:

protected String doInBackground(String... params) {
String st = params[0];
System.out.println("st==== " + st);

SoapObject request = new SoapObject(NAMESPACE, METHOD_NAME4);

System.err.println("Request  = " + request);
request.addProperty("VideoBuffer", st);
request.addProperty("VideoName", "VideoCar");
request.addProperty("ModuleName", modulename);
}

My Logcat error is:

FATAL EXCEPTION: AsyncTask #5
java.lang.RuntimeException: An error occured while executing doInBackground()
  at android.os.AsyncTask$3.done(AsyncTask.java:299)
  at java.util.concurrent.FutureTask$Sync.innerSetException(FutureTask.java:273)
  at java.util.concurrent.FutureTask.setException(FutureTask.java:124)
  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:307)
  at java.util.concurrent.FutureTask.run(FutureTask.java:137)
  at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1076)
  at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:569)
  at java.lang.Thread.run(Thread.java:856)
  Caused by: java.lang.OutOfMemoryError
  at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:94)
  at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:145)
  at java.lang.StringBuffer.append(StringBuffer.java:219)
  at org.ksoap2.serialization.SoapObject.toString(SoapObject.java:456)
  at java.lang.StringBuilder.append(StringBuilder.java:202)
  at web.org.HouseRentInsertAds$BufferingVideo.doInBackground(HouseRentInsertAds.java:897)
  at web.org.HouseRentInsertAds$BufferingVideo.doInBackground(HouseRentInsertAds.java:1)
  at android.os.AsyncTask$2.call(AsyncTask.java:287)
  at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:305)

Kindly give me a solution please.

Upvotes: 0

Views: 1041

Answers (1)

Chintan Khetiya
Chintan Khetiya

Reputation: 16142

You have to compress the image befor sending whole image to server.

set public

String String_Image; 
Bitmap bitmap;

Here process of decoding the image and send compressed image to server

File image_file = new File(path);
decodeFile(image_file);         
ByteArrayOutputStream bao = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bao);
byte[] ba = bao.toByteArray();
String_Image = Base64.encodeBytes(ba);

decodeFile() Function will decode your file.

private Bitmap decodeFile(File f)
    {
        try
        {
            // Decodes image size
            BitmapFactory.Options o = new BitmapFactory.Options();
            o.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(new FileInputStream(f), null, o);

            // The new size to scale to
            final int REQUIRED_SIZE = 70;

            // Finds the correct scale value which should be the power of 2.
            int scale = 1;
            while (o.outWidth / scale / 2 >= REQUIRED_SIZE
                    && o.outHeight / scale / 2 >= REQUIRED_SIZE)
                scale *= 2;

            // Decodes with inSampleSize
            BitmapFactory.Options o2 = new BitmapFactory.Options();
            o2.inSampleSize = scale;
            bitmap = BitmapFactory.decodeStream(new FileInputStream(f), null,
                    o2);
            return bitmap;
        } catch (FileNotFoundException e)
        {
        }
        return null;
    }

Send String_Image to server.

This code is for image But same way you can do for other also. Try it with some changes.

Hope it will work.

Upvotes: 1

Related Questions