Passing android Bitmap Data within activity using Intent in Android

107,625

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
   }
Share:
107,625

Related videos on Youtube

adi.zean
Author by

adi.zean

just ask it yourself to me..!!!

Updated on July 05, 2022

Comments

  • adi.zean
    adi.zean almost 2 years

    I hava a Bitmap variable named bmp in Activity1 , and I want to send the bitmap to Activity2

    Following 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
      Christine about 12 years
      This is not a copy of your code, as I see at least two typo's.
    • adi.zean
      adi.zean about 12 years
      @Christine : this is realy my code hehe,,, but i had it from many tutorial... XP
    • Christine
      Christine about 12 years
      So 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
      Christine about 12 years
      You 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
      milosmns about 9 years
      Before 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
      AdamHurwitz about 5 years
  • Carnal
    Carnal about 12 years
    Bitmap is not serializable!
  • Prashant Mishra
    Prashant Mishra about 12 years
    please check this Link : stackoverflow.com/questions/5871482/…
  • Reinherd
    Reinherd about 11 years
    This solved a issue I had. An exception was thrown because "transactionTooLargeException". When sending over extra a full bitmap.
  • StillLearningToCode
    StillLearningToCode over 9 years
    just 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
    Zaid Daghestani over 9 years
    getActivity().getIntent()
  • ahmed_khan_89
    ahmed_khan_89 about 9 years
    thanks 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
    Zaid Daghestani about 9 years
    bytearray = 3 images in memory (bmp first, bytearray, bmp second) file = 2 images in memory (bmp first, file, bmp third)
  • Ahmet K
    Ahmet K almost 8 years
    You could just make the byteArray static so the Garbage Collector wouldnt delete it. Dont have to save it locally actually
  • Dilip Poudel
    Dilip Poudel about 7 years
    IOexception when I pass image path in uri . What could be the possible reason.
  • Agna JirKon Rx
    Agna JirKon Rx over 6 years
    I 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
    Zaid Daghestani about 4 years
    @Hareesh sweet! open to anything better if you guys find it!
  • CaptainCrunch
    CaptainCrunch over 3 years
    Google just announced they are stopping Kotlin development due to lack of user adaption