4d7bc65538
Change-Id: I823812a4fd24021bec906ad856479c92a8d2a759
150 lines
6.2 KiB
Plaintext
150 lines
6.2 KiB
Plaintext
page.title=Receiving Content from Other Apps
|
|
parent.title=Sharing Content
|
|
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/topics/intents/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/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">Send Content to Other Apps Using Intents</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/topics/intents/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/topics/intents/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>
|
|
|