| 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, "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.</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, "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}. |
| 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("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. 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<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> |
| |