If you are running on pre 3.0 hardware, the memory value you see will not include the memory used by Bitmaps, so that's a possible reason for the behavior you described.
As a rule of thumb, you should always check the dimension of an image that your app retrieve dynamically (either from user selection or from the net), and scale it to the size that makes sense for your app. For example, for a Gallery app it should rescale a picture the phone takes to the dimension of the screen. Below is code sample for decoding a scaled Bitmap:
private Bitmap decodeFile(File f, int width_tmp, int height_tmp, int maxSize) {
try {
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
InputStream in = new FileInputStream(f);
BitmapFactory.decodeStream(in, null, o);
try {
in.close();
} catch (IOException e1) {
}
// Find the correct scale value. It should be the power of 2.
int scale = 1;
while (maxSize > 0) {
if (width_tmp / 2 < maxSize
|| height_tmp / 2 < maxSize) {
break;
}
width_tmp /= 2;
height_tmp /= 2;
scale++;
}
// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
in = new FileInputStream(f);
Bitmap bm = BitmapFactory.decodeStream(in, null, o2);
try {
in.close();
} catch (IOException e1) {
}
return bm;
} catch (FileNotFoundException e) {
e.printStackTrace();
}
return null;
}