| 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> | |