page.title=Sending Simple Data to Other Apps
parent.title=Sharing Simple Data
parent.link=index.html

trainingnavtop=true
next.title=Receiving Simple Data from Other Apps
next.link=receive.html

@jd:body

<div id="tb-wrapper">
<div id="tb">

<!-- table of contents -->
<h2>This lesson teaches you to</h2>
<ol>
  <li><a href="#send-text-content">Send Text Content</a></li>
  <li><a href="#send-binary-content">Send Binary Content</a></li>
  <li><a href="#send-multiple-content">Send Multiple Pieces of Content</a></li>
</ol>

<!-- other docs (NOT javadocs) -->
<h2>You should also read</h2>
<ul>
  <li><a href="{@docRoot}guide/components/intents-filters.html">Intents and
Intent Filters</a></li>
</ul>

</div>
</div>

<p>When you construct an intent, you must specify the action you want the intent to "trigger."
Android defines several actions, including {@link android.content.Intent#ACTION_SEND} which, as
you can probably guess, indicates that the intent is sending data from one activity to another,
even across process boundaries. To send data to another activity, all you need to do is specify
the data and its type, the system will identify compatible receiving activities and display them
to the user (if there are multiple options) or immediately start the activity (if there is only
one option). Similarly, you can advertise the data types that your activities support receiving
from other applications by specifying them in your manifest.</p>

<p>Sending and receiving data between applications with intents is most commonly used for social
sharing of content. Intents allow users to share information quickly and easily, using their
favorite applications.</p>

<p><strong>Note:</strong> The best way to add a share action item to an
{@link android.app.ActionBar} is to use {@link android.widget.ShareActionProvider}, which became
available in API level 14. {@link android.widget.ShareActionProvider} is discussed in the lesson
about <a href="shareaction.html">Adding an Easy Share Action</a>.</p>


<h2 id="send-text-content">Send Text Content</h2>

<div class="figure" style="width:220px">
<img src="{@docRoot}images/training/sharing/share-text-screenshot.png" alt="" id="figure1" />
<p class="img-caption">
  <strong>Figure 1.</strong> Screenshot of {@link android.content.Intent#ACTION_SEND} intent chooser
on a handset.
</p>
</div>

<p>The most straightforward and common use of the {@link android.content.Intent#ACTION_SEND}
action is sending text content from one activity to another. For example, the built-in Browser
app can share the URL of the currently-displayed page as text with any application. This is useful
for sharing an article or website with friends via email or social networking. Here is the code to
implement this type of sharing:</p>

<pre>
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, &quot;This is my text to send.&quot;);
sendIntent.setType(&quot;text/plain&quot;);
startActivity(sendIntent);
</pre>

<p>If there's an installed application with a filter that matches
{@link android.content.Intent#ACTION_SEND} and MIME type text/plain, the Android system will run
it; if more than one application matches, the system displays a disambiguation dialog (a "chooser")
that allows the user to choose an app.</p>

<p>However, if you call
{@link android.content.Intent#createChooser(android.content.Intent, CharSequence)
Intent.createChooser()}, passing it your {@link android.content.Intent} object, it returns a version
of your intent that will <strong>always display the chooser</strong>. This has some
advantages:</p>

<ul>
  <li>Even if the user has previously selected a default action for this intent, the chooser will
still be displayed.</li>
  <li>If no applications match, Android displays a system message.</li>
  <li>You can specify a title for the chooser dialog.</li>
</ul>

<p>Here's the updated code:</p>

<pre>
Intent sendIntent = new Intent();
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, &quot;This is my text to send.&quot;);
sendIntent.setType(&quot;text/plain&quot;);
startActivity(<strong>Intent.createChooser(sendIntent, getResources().getText(R.string.send_to))</strong>);
</pre>

<p>The resulting dialog is shown in figure 1.</p>

<p>Optionally, you can set some standard extras for the intent:
{@link android.content.Intent#EXTRA_EMAIL}, {@link android.content.Intent#EXTRA_CC},
{@link android.content.Intent#EXTRA_BCC}, {@link android.content.Intent#EXTRA_SUBJECT}.
If the receiving application is not designed to use them, it simply ignores them.</p>

<p class="note"><strong>Note:</strong> Some e-mail applications, such as Gmail, expect a
{@link java.lang.String String[]} for extras like {@link android.content.Intent#EXTRA_EMAIL} and
{@link android.content.Intent#EXTRA_CC}, use
{@link android.content.Intent#putExtra(String,String[]) putExtra(String, String[])} to add these
to your intent.</p>


<h2 id="send-binary-content">Send Binary Content</h2>

<p>Binary data is shared using the {@link android.content.Intent#ACTION_SEND} action combined with
setting the appropriate MIME type and placing the URI to the data in an extra named {@link
android.content.Intent#EXTRA_STREAM}. This is commonly used to share an image but can be used to
share any type of binary content:</p>

<pre>
Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND);
shareIntent.putExtra(Intent.EXTRA_STREAM, uriToImage);
shareIntent.setType(&quot;image/jpeg&quot;);
startActivity(Intent.createChooser(shareIntent, getResources().getText(R.string.send_to)));
</pre>

<p>Note the following:</p>
<ul>
  <li>You can use a MIME type of {@code "*/*"}, but this will only match activities that are able to
handle generic data streams.</li>
  <li>The receiving application needs permission to access the data the {@link android.net.Uri}
points to. The recommended ways to do this are:
  <ul>
    <li>Store the data in your own {@link android.content.ContentProvider}, making sure that other
apps have the correct permission to access your provider. The preferred mechanism for providing
access is to use <a
href="{@docRoot}guide/topics/security/permissions.html#uri">per-URI permissions</a> which are
temporary and only grant access to the receiving application. An easy way to create a
{@link android.content.ContentProvider} like this is to use the
{@link android.support.v4.content.FileProvider} helper class.</li>
    <li>Use the system {@link android.provider.MediaStore}. The {@link android.provider.MediaStore}
is primarily aimed at video, audio and image MIME types, however beginning with Android 3.0 (API
level 11) it can also store non-media types (see
{@link android.provider.MediaStore.Files MediaStore.Files} for more info). Files can be inserted
into the {@link android.provider.MediaStore} using {@link
android.media.MediaScannerConnection#scanFile(android.content.Context, java.lang.String[],
java.lang.String[], android.media.MediaScannerConnection.OnScanCompletedListener) scanFile()} after
which a {@code content://} style {@link android.net.Uri} suitable for sharing is passed to the
provided {@link android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(
java.lang.String, android.net.Uri) onScanCompleted()} callback. Note that once added to the system
{@link android.provider.MediaStore} the content is accessible to any app on the device.</li>
  </ul>
  </li>
</ul>


<h2 id="send-multiple-content">Send Multiple Pieces of Content</h2>

<p>To share multiple pieces of content, use the {@link android.content.Intent#ACTION_SEND_MULTIPLE}
action together with a list of URIs pointing to the content. The MIME type varies according to the
mix of content you're sharing. For example, if you share 3 JPEG images, the type is still {@code
"image/jpeg"}. For a mixture of image types, it should be {@code "image/*"} to match an activity
that handles any type of image. You should only use {@code "*/*"} if you're sharing out a wide
variety of types. As previously stated, it's up to the receiving application to parse and process
your data. Here's an example:</p>

<pre>
ArrayList&lt;Uri&gt; imageUris = new ArrayList&lt;Uri&gt;();
imageUris.add(imageUri1); // Add your image URIs here
imageUris.add(imageUri2);

Intent shareIntent = new Intent();
shareIntent.setAction(Intent.ACTION_SEND_MULTIPLE);
shareIntent.putParcelableArrayListExtra(Intent.EXTRA_STREAM, imageUris);
shareIntent.setType(&quot;image/*&quot;);
startActivity(Intent.createChooser(shareIntent, &quot;Share images to..&quot;));
</pre>

<p>As before, make sure the provided {@link android.net.Uri URIs} point to data that a receiving
application can access.</p>

