user6586661
user6586661

Reputation: 452

Android | give image with intent

I want to pass my image from one Activity to another. At first I tried to do this with a base64 String of my image. But this only works for small pictures. It worked with 400 kb but not with 600 kb. Is there a better way to do this? By the way, I don't save the image locally, I get the image from a server, so I don't have a real Drawable.

Upvotes: 3

Views: 8077

Answers (3)

Mukul Kanojia
Mukul Kanojia

Reputation: 11

Also, you can use third-party libraries like Picasso or Glide. I personally like Glide as it is better in performance than any other.

Upvotes: 0

Ricardo Vieira
Ricardo Vieira

Reputation: 1818

Even though it is a bit discouraged to pass large "blocks" of data through intents in android (use a singleton or store the image on the internal memory, etc), you can achieve it by doing :

1 - On your Sender Activity

Intent yourIntent = new Intent(YourActivity.this, DestinationActivity.class);
Bitmap bmp; // store the image in your bitmap 
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 50, baos);
yourIntent.putExtra("yourImage", baos.toByteArray());
startActivity(yourIntent);

2 - On your Receiver Activity

// parse the intent onCreate()
if(getIntent().hasExtra("yourImage")) {
    ImageView iv = new ImageView(this);
    Bitmap bmp = BitmapFactory.decodeByteArray(getIntent().getByteArrayExtra("yourImage"), 0, getIntent().getByteArrayExtra("yourImage").length);        
    iv.setImageBitmap(bmp);
}

It is strongly discouraged that you do it this way because :

1 - There is a memory limit to the passing of data through an intent. The maximum amount of data you can transfer using an Intent is 500KB (tested on API 10, 16, 19 and 23). check this external reference

Sometimes, the bitmap might be too large for processing, thus leading to OOM (I have experienced this in the past) or cause a bad UI experience.

2 - If your activity crashes by any reason, thus leading to a crash on the application, you will lose the image because it is stored in temporary memory. If you save it internally, you can persist the image even if the application crashes.

General the best practice is to process the image when you need it, store it on a device folder (can be internal or external memory) and later when you need it retrieve it again for more processing. This way you avoid unnecessary memory allocation throughout the application.

Upvotes: 3

manfcas
manfcas

Reputation: 1953

If you only have the remote URL, then you can directly share it, otherwise you can save the image in the local media store and then share its local URL. Something like:

Bitmap bitmap = ...
String path = MediaStore.Images.Media.insertImage(getContentResolver(), bitmap, "Image Description", null);
Uri uri = Uri.parse(path);
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setType("image/jpeg");
intent.putExtra(Intent.EXTRA_STREAM, uri);
startActivity(Intent.createChooser(intent, "Share Image"));

Upvotes: 5

Related Questions