Mahmoud Hadad
- Forum posts: 1
Jul 30, 2012, 12:14:21 AM via Website
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)
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)
Recommended editorial content
With your consent, external content is loaded here.
By clicking on the button above, you agree that external content may be displayed to you. Personal data may be transmitted to third-party providers in the process. You can find more information about this in our Privacy Policy.