Passing android Bitmap Data within activity using Intent in Android
Solution 1
Convert it to a Byte array before you add it to the intent, send it out, and decode.
//Convert to byte array
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image",byteArray);
Then in Activity 2:
byte[] byteArray = getIntent().getByteArrayExtra("image");
Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
edit
Thought I should update this with best practice:
In your first activity, you should save the Bitmap to disk then load it up in the next activity. Make sure to recycle your bitmap in the first activity to prime it for garbage collection:
Activity 1:
try {
//Write file
String filename = "bitmap.png";
FileOutputStream stream = this.openFileOutput(filename, Context.MODE_PRIVATE);
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
//Cleanup
stream.close();
bmp.recycle();
//Pop intent
Intent in1 = new Intent(this, Activity2.class);
in1.putExtra("image", filename);
startActivity(in1);
} catch (Exception e) {
e.printStackTrace();
}
In Activity 2, load up the bitmap:
Bitmap bmp = null;
String filename = getIntent().getStringExtra("image");
try {
FileInputStream is = this.openFileInput(filename);
bmp = BitmapFactory.decodeStream(is);
is.close();
} catch (Exception e) {
e.printStackTrace();
}
Cheers!
Solution 2
Sometimes, the bitmap might be too large for encode&decode or pass as a byte array in the intent. This can cause either OOM or a bad UI experience.
I suggest to consider putting the bitmap into a static variable of the new activity (the one that uses it) which will carefully be null when you no longer need it (meaning in onDestroy but only if "isChangingConfigurations" returns false).
Solution 3
Simply we can pass only Uri of the Bitmap instead of passing Bitmap object. If Bitmap object is Big, that will cause memory issue.
FirstActivity.
intent.putExtra("uri", Uri);
From SecondActivity we get back bitmap.
Bitmap bitmap = MediaStore.Images.Media.getBitmap(this.getContentResolver(),Uri.parse(uri));
Solution 4
Kotlin Code for send Bitmap to another activity by intent:
1- in First Activity :
val i = Intent(this@Act1, Act2::class.java)
var bStream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.PNG, 50, bStream)
val byteArray = bStream.toByteArray()
i.putExtra("image", byteArray )
startActivity(i)
2- In Activity two (Read the bitmap image) :
var bitmap : Bitmap? =null
if (intent.hasExtra("image")){
//convert to bitmap
val byteArray = intent.getByteArrayExtra("image")
bitmap = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.size)
}
3- if you need to set it as background for a view, like ConstraintLayout or... :
if (bitmap != null) {
//Convert bitmap to BitmapDrawable
var bitmapDrawable = BitmapDrawable( resources , bitmap)
root_constraintLayout.backgroundDrawable = bitmapDrawable
}
Related videos on Youtube
Comments
-
adi.zean almost 2 years
I hava a Bitmap variable named
bmp
in Activity1 , and I want to send the bitmap to Activity2Following is the code I use to pass it with the intent.
Intent in1 = new Intent(this, Activity2.class); in1.putExtra("image",bmp); startActivity(in1);
And in Activity2 I try to access the bitmap using the following code
Bundle ex = getIntent().getExtras(); Bitmap bmp2 = ex.getParceable("image"); ImageView result = (ImageView)findViewById(R.Id.imageView1); result.setImageBitmap(bmp);
The application runs without an exception but it does not give the expected result
-
Christine about 12 yearsThis is not a copy of your code, as I see at least two typo's.
-
adi.zean about 12 years@Christine : this is realy my code hehe,,, but i had it from many tutorial... XP
-
Christine about 12 yearsSo how come you create a Bitmap bmp2, and you set it with setImageBitmap(bmp)? And surely, R.Id.imageView1 does not work. It should be R.id.imageView1.
-
Christine about 12 yearsYou could of course write the bitmap to a file, and read this file in the second activity. You can use the same file to make sure the image remains if the device is rotated.
-
milosmns about 9 yearsBefore posting a question, make sure you understand the code you are posting, a plain copy-paste from StackOverflow to fix a bug is useless.. @Christine - I was about to comment the same thing about typos..
-
AdamHurwitz about 5 yearsPossible duplicate of How can I pass a Bitmap object from one activity to another
-
-
Carnal about 12 yearsBitmap is not serializable!
-
Prashant Mishra about 12 yearsplease check this Link : stackoverflow.com/questions/5871482/…
-
Reinherd about 11 yearsThis solved a issue I had. An exception was thrown because "transactionTooLargeException". When sending over extra a full bitmap.
-
StillLearningToCode over 9 yearsjust wondering how i would use the getIntent() in a Fragment? i have read that it is not possible, but there must be a way.
-
Zaid Daghestani over 9 yearsgetActivity().getIntent()
-
ahmed_khan_89 about 9 yearsthanks for the answer. I don't understand why writing the bitmap to a file and reading it later is better than sending a byteArray?
-
Zaid Daghestani about 9 yearsbytearray = 3 images in memory (bmp first, bytearray, bmp second) file = 2 images in memory (bmp first, file, bmp third)
-
Ahmet K almost 8 yearsYou could just make the byteArray static so the Garbage Collector wouldnt delete it. Dont have to save it locally actually
-
Dilip Poudel about 7 yearsIOexception when I pass image path in uri . What could be the possible reason.
-
Agna JirKon Rx over 6 yearsI highly suggest avoid using byte array because you can reach the 2MB limit and have a leak. I suggest create a temp file and handle its path through the activities
-
Zaid Daghestani about 4 years@Hareesh sweet! open to anything better if you guys find it!
-
CaptainCrunch over 3 yearsGoogle just announced they are stopping Kotlin development due to lack of user adaption