| page.title=Receiving Simple Data from Other Apps | |
| parent.title=Sharing Simple Data | |
| parent.link=index.html | |
| trainingnavtop=true | |
| previous.title=Sending Content to Other Apps | |
| previous.link=send.html | |
| next.title=Adding an Easy Share Action | |
| next.link=shareaction.html | |
| @jd:body | |
| <div id="tb-wrapper"> | |
| <div id="tb"> | |
| <!-- table of contents --> | |
| <h2>This lesson teaches you to</h2> | |
| <ol> | |
| <li><a href="#update-manifest">Update Your Manifest</a></li> | |
| <li><a href="#handling-content">Handle the Incoming 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>Just as your application can send data to other applications, so too can it easily receive data | |
| from applications. Think about how users interact with your application, and what data types you | |
| want to receive from other applications. For example, a social networking application would likely | |
| be interested in receiving text content, like an interesting web URL, from another app. The | |
| <a href="https://play.google.com/store/apps/details?id=com.google.android.apps.plus">Google+ Android | |
| application</a> | |
| accepts both text <em>and</em> single or multiple images. With this app, a user can easily start a | |
| new Google+ post with photos from the Android Gallery app.</p> | |
| <h2 id="update-manifest">Update Your Manifest</h2> | |
| <p>Intent filters inform the system what intents an application component is willing to accept. | |
| Similar to how you constructed an intent with action {@link android.content.Intent#ACTION_SEND} in | |
| the <a href="{@docRoot}training/sharing/send.html">Sending Simple Data to Other Apps</a> | |
| lesson, you create intent filters in order to be able to receive intents with this action. You | |
| define an intent filter in your manifest, using the | |
| <code><a | |
| href="{@docRoot}guide/components/intents-filters.html#ifs"><intent-filter></a></code> | |
| element. For example, if your application handles receiving text content, a single image of any | |
| type, or multiple images of any type, your manifest would look like:</p> | |
| <pre> | |
| <activity android:name=".ui.MyActivity" > | |
| <intent-filter> | |
| <action android:name="android.intent.action.SEND" /> | |
| <category android:name="android.intent.category.DEFAULT" /> | |
| <data android:mimeType="image/*" /> | |
| </intent-filter> | |
| <intent-filter> | |
| <action android:name="android.intent.action.SEND" /> | |
| <category android:name="android.intent.category.DEFAULT" /> | |
| <data android:mimeType="text/plain" /> | |
| </intent-filter> | |
| <intent-filter> | |
| <action android:name="android.intent.action.SEND_MULTIPLE" /> | |
| <category android:name="android.intent.category.DEFAULT" /> | |
| <data android:mimeType="image/*" /> | |
| </intent-filter> | |
| </activity> | |
| </pre> | |
| <p class="note"><strong>Note:</strong> For more information on intent filters and intent resolution | |
| please read <a href="{@docRoot}guide/components/intents-filters.html#ifs">Intents and Intent | |
| Filters</a></p> | |
| <p>When another application tries to share any of these things by constructing an intent and passing | |
| it to {@link android.content.Context#startActivity(android.content.Intent) startActivity()}, your | |
| application will be listed as an option in the intent chooser. If the user selects your application, | |
| the corresponding activity (<code>.ui.MyActivity</code> in the example above) will be started. It | |
| is then up to you to handle the content appropriately within your code and UI.</p> | |
| <h2 id="handling-content">Handle the Incoming Content</h2> | |
| <p>To handle the content delivered by an {@link android.content.Intent}, start by calling {@link | |
| android.content.Intent#getIntent(String) getIntent()} | |
| to get {@link android.content.Intent} object. Once you have the object, you can examine its | |
| contents to determine what to do next. Keep in mind that if this activity can be started from other | |
| parts of the system, such as the launcher, then you will need to take this into consideration when | |
| examining the intent.</p> | |
| <pre> | |
| 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 ("text/plain".equals(type)) { | |
| handleSendText(intent); // Handle text being sent | |
| } else 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 | |
| } | |
| } else { | |
| // Handle other intents, such as being started from the home screen | |
| } | |
| ... | |
| } | |
| void handleSendText(Intent intent) { | |
| String sharedText = intent.getStringExtra(Intent.EXTRA_TEXT); | |
| if (sharedText != null) { | |
| // Update UI to reflect text being shared | |
| } | |
| } | |
| 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 | |
| } | |
| } | |
| </pre> | |
| <p class="caution"><strong>Caution:</strong> Take extra care to check the incoming data, you never | |
| know what some other application may send you. For example, the wrong MIME type might be set, or the | |
| image being sent might be extremely large. Also, remember to process binary data in a separate | |
| thread rather than the main ("UI") thread.</p> | |
| <p>Updating the UI can be as simple as populating an {@link android.widget.EditText}, or it can | |
| be more complicated like applying an interesting photo filter to an image. It's really specific | |
| to your application what happens next.</p> | |