60

I've seen the "share via" dialogs that are in apps like TFLN (texts from last night). Looks like this: share dialog http://garr.me/wp-content/uploads/2009/12/sharevia.jpg

I am looking to share text. Can someone point me in the right direction? Is this done with intents?

Waynn Lue
  • 11,344
  • 8
  • 51
  • 76
Realn0whereman
  • 1,176
  • 2
  • 13
  • 17

4 Answers4

118

This is indeed done with Intents.

For sharing an image, like in the example picture, it would be something like this:

Intent share = new Intent(Intent.ACTION_SEND);
share.setType("image/jpeg");

share.putExtra(Intent.EXTRA_STREAM,
  Uri.parse("file:///sdcard/DCIM/Camera/myPic.jpg"));

startActivity(Intent.createChooser(share, "Share Image"));

For text you would use something like:

Intent share = new Intent(Intent.ACTION_SEND);
share.setType("text/plain");
share.putExtra(Intent.EXTRA_TEXT, "I'm being sent!!");
startActivity(Intent.createChooser(share, "Share Text"));
Ehxor
  • 1,776
  • 1
  • 12
  • 7
  • 7
    Is it possible to share image pointed by http url: share.putExtra(Intent.EXTRA_STREAM, Uri.parse("http://helios.gsfc.nasa.gov/image_mag_stamp.jpg")); ? I can't get this working. – sinek Jul 12 '11 at 11:18
  • @Second Does the text version display more options off the emulator? I tried what you suggested and it immediately proceeds to the built-in sms application. I'd rather see something more explicitly like the picture mentioned in the question. – thegrinner Jul 20 '11 at 18:35
7

I was having issues with the accepted answer. What worked for me was creating a file from the path, then parsing the URI of the file, like:

Uri.fromFile(new File(filePath));

instead of

Uri.parse(filePath)

Just in case anyone is having the same issue.

DiscDev
  • 38,652
  • 20
  • 117
  • 133
  • 3
    Your solution solved my problem as well rather than the accepted one. Do you know why the accepted answer doesn't work? – RestInPeace Jun 14 '14 at 17:05
  • 1
    @RestInPeace it probably depends where your file resides on the file system. In the example they gave a string like file:///... if your path was not in that same format, using Uri.parse would fail. – DiscDev Jun 16 '14 at 20:51
  • Actually for me `Uri.parse(filePath)` worked in some apps, (Whatsapp sharing for instance, and Dropbox) but failed with Instagram, Gmail and Facebook for example. `Uri.fromFile(new File(filePath))` works like a charm, except in Gmail, which still fails but I get to compose the email and I can see the file is correctly attached. – Olaia Jan 01 '15 at 02:06
4

Yes. You need to provide an Activity with an intent filter that can handle objects of the MIME Type image/jpeg (say, if you wanted to support sharing JPEG images), and and action of presumably ACTION_SEND.

Many of the built-in Android apps are open-source, you can check the manifest file of the Messaging app to see what intent filters it is using.

EboMike
  • 76,846
  • 14
  • 164
  • 167
  • Actually, I don't believe that all the built-in Android apps are open-source, just the operating system. – Waynn Lue Apr 04 '12 at 08:06
  • 2
    Definitely not the ones using Google services (Gmail, Maps, etc) - I was referring to the more basic ones, the one that come with the emulator. I'll rephrase. – EboMike Apr 04 '12 at 16:48
0

Refer : Receiving simple data from other apps

Update your manifest

<activity android:name=".ui.MyActivity" >
//To receive single image
<intent-filter>
    <action android:name="android.intent.action.SEND" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="image/*" />
</intent-filter>
//To receive multiple images
<intent-filter>
    <action android:name="android.intent.action.SEND_MULTIPLE" />
    <category android:name="android.intent.category.DEFAULT" />
    <data android:mimeType="image/*" />
</intent-filter>

Handle the incoming content

public class MyActivity extends AppCompactActivity {

    void onCreate(Bundle savedInstanceState) {
        // Get intent, action and MIME type
        Intent intent = getIntent();
        String action = intent.getAction();
        String type = intent.getType();

        if (Intent.ACTION_SEND.equals(action) && type != null) {
            if (type.startsWith("image/")) {
                handleSendImage(intent); // Handle single image being sent
            }
        } else if (Intent.ACTION_SEND_MULTIPLE.equals(action) && type != null) {
            if (type.startsWith("image/")) {
                handleSendMultipleImages(intent); // Handle multiple images being sent
            }
        }
    }

    void handleSendImage(Intent intent) {
        Uri imageUri = (Uri) intent.getParcelableExtra(Intent.EXTRA_STREAM);
        if (imageUri != null) {
            // Update UI to reflect image being shared
        }
    }

    void handleSendMultipleImages(Intent intent) {
        ArrayList<Uri> imageUris = intent.getParcelableArrayListExtra(Intent.EXTRA_STREAM);
        if (imageUris != null) {
            // Update UI to reflect multiple images being shared
        }
    }
}
Velayutham M
  • 1,119
  • 14
  • 18