Android: OutOfMemoryError when trying to select 3 images from camera gallery to compress to a ByteArrayOutputStream please help

  • Replies:1
Mahmoud Hadad
  • Forum posts: 1

Jul 30, 2012, 12:14:21 AM via Website

OutOfMemoryError exception: I've been fighting with lots of code when trying to select three images from gallery to compress to a ByteArrayOutputStream....


private Bitmap getImage(String path) {
Log.i("showImage","loading:"+path);
Bitmap bm = null;
BitmapFactory.Options bfOptions=new BitmapFactory.Options();
bfOptions.inDither=false; //Disable Dithering mode
bfOptions.inPurgeable=true; //Tell to gc that whether it needs free memory, the Bitmap can be cleared
bfOptions.inInputShareable=true; //Which kind of reference will be used to recover the Bitmap data after being clear, when it will be used in the future
bfOptions.inTempStorage=new byte[32 * 1024];


File file=new File(path);
FileInputStream fs=null;
try {
fs = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}

try {
if(fs!=null) bm=BitmapFactory.decodeFileDescriptor(fs.getFD(), null, bfOptions);
} catch (IOException e) {
e.printStackTrace();
} finally{
if(fs!=null) {
try {
fs.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}


return bm;



}


@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);

if (resultCode == Activity.RESULT_OK) {
Uri selectedImage = data.getData();
if (requestCode == 1001) {
try
{
image1.setImageURI(selectedImage);
Bitmap bitmap = null;
getImageBytes(1, selectedImage, bitmap);
}
catch(OutOfMemoryError ex)
{

getImageBytes(1, selectedImage, bitmap);

}
}else if(requestCode == 1002) {
try
{
image2.setImageURI(selectedImage);

Bitmap bitmap = null;
getImageBytes(2, selectedImage, bitmap);
}
catch(OutOfMemoryError ex)
{
image2.setImageURI(selectedImage);
Bitmap bitmap = null;
getImageBytes(2, selectedImage, bitmap);
}
}else if(requestCode == 1003) {
try
{
image3.setImageURI(selectedImage);
Bitmap bitmap = null;
getImageBytes(3, selectedImage, bitmap);
}
catch(OutOfMemoryError ex)
{
image3.setImageURI(selectedImage);

Bitmap bitmap = null;
getImageBytes(3, selectedImage, bitmap);
}
}

}
}




private void getImageBytes(int number, Uri selectedImageUri, Bitmap bmp) {
Bitmap bitmap = null;
byte[] imageData = null;

String[] filePathColumn = {MediaStore.Images.Media.DATA};

Cursor cursor = getContentResolver().query(selectedImageUri, filePathColumn, null, null, null);
cursor.moveToFirst();

int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
String filePath = cursor.getString(columnIndex);
cursor.close();

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap = showImage(filePath);

bitmap.compress(CompressFormat.JPEG, 90, bos);
imageData = bos.toByteArray();
bitmap.recycle();
try {
bos.flush();
} catch (IOException e1) {
e1.printStackTrace();
}
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
switch (number) {
case 1:
image1Data = imageData.clone();
break;
case 2:
image2Data = imageData.clone();
break;
case 3:
image3Data = imageData.clone();
break;

default:
break;
}
}



and the stack trace is




07-30 00:37:18.077: W/dalvikvm(6419): threadid=1: thread exiting with uncaught exception (group=0x40c581f8)
07-30 00:37:18.082: E/AndroidRuntime(6419): FATAL EXCEPTION: main
07-30 00:37:18.082: E/AndroidRuntime(6419): java.lang.OutOfMemoryError
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.graphics.BitmapFactory.nativeDecodeStream(Native Method)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.graphics.BitmapFactory.decodeStream(BitmapFactory.java:587)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.graphics.BitmapFactory.decodeResourceStream(BitmapFactory.java:445)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.graphics.drawable.Drawable.createFromResourceStream(Drawable.java:773)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.graphics.drawable.Drawable.createFromStream(Drawable.java:733)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.ImageView.resolveUri(ImageView.java:562)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.ImageView.onMeasure(ImageView.java:647)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:594)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:376)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1375)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.ScrollView.measureChildWithMargins(ScrollView.java:1399)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.ScrollView.onMeasure(ScrollView.java:367)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1375)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.LinearLayout.measureVertical(LinearLayout.java:660)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.LinearLayout.onMeasure(LinearLayout.java:553)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4698)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.widget.FrameLayout.onMeasure(FrameLayout.java:293)
07-30 00:37:18.082: E/AndroidRuntime(6419): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2265)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.View.measure(View.java:12892)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1240)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.view.ViewRootImpl.handleMessage(ViewRootImpl.java:2628)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.os.Handler.dispatchMessage(Handler.java:99)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.os.Looper.loop(Looper.java:137)
07-30 00:37:18.082: E/AndroidRuntime(6419): at android.app.ActivityThread.main(ActivityThread.java:4507)
07-30 00:37:18.082: E/AndroidRuntime(6419): at java.lang.reflect.Method.invokeNative(Native Method)
07-30 00:37:18.082: E/AndroidRuntime(6419): at java.lang.reflect.Method.invoke(Method.java:511)
07-30 00:37:18.082: E/AndroidRuntime(6419): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:980)
07-30 00:37:18.082: E/AndroidRuntime(6419): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:747)
07-30 00:37:18.082: E/AndroidRuntime(6419): at dalvik.system.NativeStart.main(Native Method)

Reply
Eric McBride
  • Forum posts: 1,790

Aug 14, 2012, 6:14:32 PM via Website

Hey Jeremiah..you around to help him out?

Reply