I'm trying to share an image I have previously saved on disk, sending an Intent.ACTION_SEND
. The problem is that I can't find a way to be compatible with different apps, official Gmail app and TweetDeck in my case.
The image I want to share is contained in a File
:
File agendaFile;
// its path using getAbsolutePath() -> /data/data/com.mypackage/files/agenda.jpg
Option A) using Uri.fromFile
Uri agendaUri = Uri.fromFile(agendaFile);
// the value -> file:///data/data/com.mypackage/files/agenda.jpg
Results
- Gmail, is the image attatched to the email? NO
- Tweetdeck, is the image added to the tweet message? YES
Option B) using Uri.parse
Uri agendaUri = Uri.parse(agendaFile.toURI().toString());
// the value -> file:/data/data/com.mypackage/files/agenda.jpg
Results
- Gmail, is the image attatched to the email? YES
- Tweetdeck, is the image added to the tweet message? NO
Finally
In both cases I send the intent like this:
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/jpg");
intent.putExtra(android.content.Intent.EXTRA_STREAM, agendaUri);
startActivity(Intent.createChooser(intent, "title"));
So, is there any other options to share an image? How is it the best way to share an image being compatible with most apps as possible?
Thanks!
try
intent.setType("image/*");
for me it works for twitter, whatsapp, bluetooth....
EDIT: full code:
Intent intent = new Intent();
intent.setAction(Intent.ACTION_SEND);
intent.setType("image/*");
intent.putExtra(android.content.Intent.EXTRA_SUBJECT, title);
intent.putExtra(android.content.Intent.EXTRA_TEXT, R.string.visita);
Uri uri = Uri
.parse("android.resource://com.package.xname/drawable/"
+ i);
intent.putExtra(Intent.EXTRA_STREAM, uri);
I finally solved the problem storing the image at the MediaStore. Instead of using the URI of the File what I do is:
String agendaFilename = agendaFile.getAbsolutePath();
final ContentValues values = new ContentValues(2);
values.put(MediaStore.Images.Media.MIME_TYPE, "image/jpeg");
values.put(MediaStore.Images.Media.DATA, agendaFilename);
final Uri contentUriFile = getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
And finally I use contentUriFile
:
final Intent intent = new Intent(android.content.Intent.ACTION_SEND);
intent.setType("image/jpg");
intent.putExtra(android.content.Intent.EXTRA_STREAM, contentUriFile);
startActivity(Intent.createChooser(intent, "title"));
this code is more easy
Intent intent = new Intent(Intent.ACTION_SEND);
intent.setData(Uri.parse("mailto:"));
intent.putExtra(intent.EXTRA_EMAIL,"XXXXX@XXXX.com");
intent.putExtra(intent.EXTRA_SUBJECT, "XXXXX");
intent.putExtra(Intent.EXTRA_TEXT, "XXXXX");
intent.setType("message/rfc822");
chosser = Intent.createChooser(intent, "Enviar Email");
intent.putExtra(intent.EXTRA_STREAM, uri);
startActivity(chosser);
For me using FileProvider worked out. I had it set up for taking photos with built-in camera and used it for sharing (see below).
final Uri uri = FileProvider.getUriForFile(mActivity, "com.paeuba.paragonik.fileprovider", photoFile);
Intent intent = ShareCompat.IntentBuilder.from(mActivity).setType("image/jpeg").setStream(uri).createChooserIntent();
mActivity.startActivity(intent);