195 lines
9.3 KiB
Plaintext
195 lines
9.3 KiB
Plaintext
page.title=Sending Content to Other Apps
|
|
parent.title=Sharing Content
|
|
parent.link=index.html
|
|
|
|
trainingnavtop=true
|
|
next.title=Receiving Content 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, "This is my text to send.");
|
|
sendIntent.setType("text/plain");
|
|
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. If you call
|
|
{@link android.content.Intent#createChooser(android.content.Intent, CharSequence)
|
|
Intent.createChooser()}
|
|
for the intent, Android will <strong>always</strong> display the chooser. 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, "This is my text to send.");
|
|
sendIntent.setType("text/plain");
|
|
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}. However,
|
|
if the receiving application is not designed to use them, nothing will happen. You can use
|
|
custom extras as well, but there's no effect unless the receiving application understands them.
|
|
Typically, you'd use custom extras defined by the receiving application itself.</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("image/jpeg");
|
|
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. There are a number of ways to handle this:
|
|
<ul>
|
|
<li>Write the data to a file on external/shared storage (such as the SD card), which all apps
|
|
can read. Use {@link android.net.Uri#fromFile(java.io.File) Uri.fromFile()} to create the
|
|
{@link android.net.Uri} that can be passed to the share intent. However, keep in mind that not
|
|
all applications process a {@code file://} style {@link android.net.Uri}.</li>
|
|
<li>Write the data to a file in your own application directory using {@link
|
|
android.content.Context#openFileOutput(java.lang.String, int) openFileOutput()} with mode {@link
|
|
android.content.Context#MODE_WORLD_READABLE} after which {@link
|
|
android.content.Context#getFileStreamPath(java.lang.String) getFileStreamPath()} can be used to
|
|
return a {@link java.io.File}. As with the previous option, {@link
|
|
android.net.Uri#fromFile(java.io.File) Uri.fromFile()} will create a {@code file://} style {@link
|
|
android.net.Uri} for your share intent.</li>
|
|
<li>Media files like images, videos and audio can be scanned and added to the system {@link
|
|
android.provider.MediaStore} using {@link
|
|
android.media.MediaScannerConnection#scanFile(android.content.Context, java.lang.String[],
|
|
java.lang.String[], android.media.MediaScannerConnection.OnScanCompletedListener) scanFile()}. The
|
|
{@link
|
|
android.media.MediaScannerConnection.OnScanCompletedListener#onScanCompleted(java.lang.String,
|
|
android.net.Uri) onScanCompleted()} callback returns a {@code content://} style {@link
|
|
android.net.Uri} suitable for including in your share intent.</li>
|
|
<li>Images can be inserted into the system {@link android.provider.MediaStore} using {@link
|
|
android.provider.MediaStore.Images.Media#insertImage(android.content.ContentResolver,
|
|
android.graphics.Bitmap, java.lang.String, java.lang.String) insertImage()} which will return a
|
|
{@code content://} style {@link android.net.Uri} suitable for including in a share intent.</li>
|
|
<li>Store the data in your own {@link android.content.ContentProvider}, make sure that other
|
|
apps have the correct permission to access your provider (or use <a
|
|
href="{@docRoot}guide/topics/security/security.html#uri">per-URI permissions</a>).</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<Uri> imageUris = new ArrayList<Uri>();
|
|
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("image/*");
|
|
startActivity(Intent.createChooser(shareIntent, "Share images to.."));
|
|
</pre>
|
|
|
|
<p>As before, make sure the provided {@link android.net.Uri URIs} point to data that a receiving
|
|
application can access.</p>
|
|
|