8

There are similar questions on SO, but none worked for me.

I want to fetch clicked image in Activity1 and display it in Activity2.
I'm fetching image id of clicked image like this:

((ImageView) v).getId()

and passing it through intent to another activity.

In 2nd activity, I use image id as following:

imageView.setImageResource(imgId);

I logged the value og image id in both the activities and it's same.

But I'm getting following exception:

android.content.res.Resources$NotFoundException: Resource is not a Drawable 
(color or path): TypedValue{t=0x12/d=0x0 a=2 r=0x7f050000}

I guess the problem here is getId() is returning Id of ImageView and not of it's source image.
All these images are present in drawable.

Any help appreciated.

GAMA
  • 5,958
  • 14
  • 79
  • 126
  • Exactly it seems that problem: "I guess the problem here is getId() is returning Id of ImageView and not of it's source image." How do you retrive this image? why you can not get the image? is not in drawables? these image is from Internet. If the image is from internet you can try to cache the image on memory or on a file, and retrive it on the next activity by putting the cached – Litus Jul 17 '12 at 09:35
  • so how do I get **RESOURCE ID** ??? – GAMA Jul 17 '12 at 09:36
  • @Andro Selva solutions seems good :) – Litus Jul 17 '12 at 09:39
  • @GAMA Please see my answer and if you have any queries then tell me. – Dipak Keshariya Jul 17 '12 at 09:46
  • see this one [http://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents ](http://stackoverflow.com/questions/2139134/how-to-send-an-object-from-one-android-activity-to-another-using-intents) – NagarjunaReddy Jul 17 '12 at 09:43

5 Answers5

35

There are 3 Solutions to solve this issue.

1) First Convert Image into Byte Array and then pass into Intent and in next activity get byte array from Bundle and Convert into Image(Bitmap) and set into ImageView.

Convert Bitmap to Byte Array:-

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();

Pass byte array into intent:-

Intent intent = new Intent(this, NextActivity.class);
intent.putExtra("picture", byteArray);
startActivity(intent);

Get Byte Array from Bundle and Convert into Bitmap Image:-

Bundle extras = getIntent().getExtras();
byte[] byteArray = extras.getByteArray("picture");

Bitmap bmp = BitmapFactory.decodeByteArray(byteArray, 0, byteArray.length);
ImageView image = (ImageView) findViewById(R.id.imageView1);

image.setImageBitmap(bmp);

2) First Save image into SDCard and in next activity set this image into ImageView.

3) Pass Bitmap into Intent and get bitmap in next activity from bundle, but the problem is if your Bitmap/Image size is big at that time the image is not load in next activity.

Dipak Keshariya
  • 22,193
  • 18
  • 76
  • 128
  • @GAMA if u are directly pass bitmap into intent and if image is big at that time the bitmap is not display in next activity so passing byte array is safe. – Dipak Keshariya Jul 17 '12 at 10:03
  • wait, this line won't work for me as u r giving hard-coded id of the image... `Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);` – GAMA Jul 17 '12 at 10:17
  • i have multiple images in activity 1, i want to ONLY display clicked image in activity2. so i can't give hard-coded image id. – GAMA Jul 17 '12 at 10:18
  • 1
    I SOLVED THE PROBLEM by passing Resource Id of the image, Thnx anyways. – GAMA Jul 17 '12 at 10:20
  • @GAMA If you can post how you solved it by passing Resource ID of the image, it will also be helpful (If you remember it) – Basanth May 17 '17 at 16:17
6

This won't work. You have to try it this way.

Set the DrawingCache of your ImageView to be true and then save the background as a Bitmap and pass it via putExtra.

image.setDrawingCacheEnabled(true);
Bitmap b=image.getDrawingCache();
Intent i = new Intent(this, nextActivity.class);

i.putExtra("Bitmap", b);
startActivity(i);

And in your Next Activity,

Bitmap bitmap = (Bitmap) intent.getParcelableExtra("Bitmap");
imageView.setImageBitmap(bitmap);
PEHLAJ
  • 9,980
  • 9
  • 41
  • 53
Andro Selva
  • 53,910
  • 52
  • 193
  • 240
  • 2
    I'm getting `E/JavaBinder(61): !!! FAILED BINDER TRANSACTION !!!` AND `ANR in com.galley.sample (com.galley.sample/.ViewDetails) ... Reason: keyDispatchingTimedOut` – GAMA Jul 17 '12 at 09:49
0

Define a Drawable static variable in your Application class, and then set image drawable data in the first activity, then in your next activity get data from the static variable you defied in your Application class.

public class G extends Application {
   public static Drawable imageDrawable;

   ...
}

First activity:

G.imageDrawable = imageView.getDrawable();

SecondActivity:

imgCamera.setImageDrawable(G.imageDrawable);

and in onDestroy:

@Override
protected void onDestroy() {
    G.imageDrawable = null;
    super.onDestroy();
}

Note: You have to define your Application class in the manifest:

<application
        android:name=".G"
        ...>

</application>
Homayoon Ahmadi
  • 1,181
  • 1
  • 12
  • 24
0

If you are moving from class like addapter class then use this code.

Bitmap bitImg=listItem.getBitmapImage();
    ByteArrayOutputStream baoS = new ByteArrayOutputStream();
    bitImg.compress(Bitmap.CompressFormat.JPEG, 50, baoS);
    intent.putExtra("bitArray", baoS.toByteArray());
    context.getApplicationContext().startActivity(intent);

and then past this to next activity

if(getIntent().hasExtra("bitArray")) {                
Bitmap bitM = BitmapFactory.decodeByteArray( getIntent().getByteArrayExtra("bitArray"),0,getIntent().getByteArrayExtra("bitArray").length);       
        imgIT = findViewById(R.id.img_detail);
        imgIT.setImageBitmap(bitM);
    }
-1

The perfect way to do this in short. This is the code of sender .class file

Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher;
Intent intent = new Intent();
Intent.setClass(<Sender_Activity>.this, <Receiver_Activity.class);
Intent.putExtra("Bitmap", bitmap);
startActivity(intent);

and this is receiver class file code.

Bitmap bitmap = (Bitmap)this.getIntent().getParcelableExtra("Bitmap");
ImageView viewBitmap = (ImageView)findViewById(R.id.bitmapview);
viewBitmap.setImageBitmap(bitmap);

No need to compress. that's it

Abdul Qadir
  • 492
  • 4
  • 13