• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Getting a Result from an Activity
2parent.title=Interacting with Other Apps
3parent.link=index.html
4
5trainingnavtop=true
6previous.title=Sending the User to Another App
7previous.link=sending.html
8next.title=Allowing Other Apps to Start Your Activity
9next.link=filters.html
10
11@jd:body
12
13<div id="tb-wrapper">
14  <div id="tb">
15
16<h2>This lesson teaches you to</h2>
17<ol>
18  <li><a href="#StartActivity">Start the Activity</a></li>
19  <li><a href="#ReceiveResult">Receive the Result</a></li>
20</ol>
21
22<h2>You should also read</h2>
23<ul>
24    <li><a href="{@docRoot}training/sharing/index.html">Sharing Simple Data</a></li>
25    <li><a href="{@docRoot}training/secure-file-sharing/index.html">Sharing Files</a>
26</ul>
27
28  </div>
29</div>
30
31<p>Starting another activity doesn't have to be one-way. You can also start another activity and
32receive a result back. To receive a result, call {@link android.app.Activity#startActivityForResult
33startActivityForResult()} (instead of {@link android.app.Activity#startActivity
34startActivity()}).</p>
35
36<p>For example, your app can start a camera app and receive the captured photo as a result. Or, you
37might start the People app in order for the user to select a
38contact and you'll receive the contact details as a result.</p>
39
40<p>Of course, the activity that responds must be designed to return a result. When it does, it
41sends the result as another {@link android.content.Intent} object. Your activity receives it in
42the {@link android.app.Activity#onActivityResult onActivityResult()} callback.</p>
43
44<p class="note"><strong>Note:</strong> You can use explicit or implicit intents when you call
45{@link android.app.Activity#startActivityForResult startActivityForResult()}. When starting one of
46your own activities to receive a result, you should use an explicit intent to ensure that you
47receive the expected result.</p>
48
49
50<h2 id="StartActivity">Start the Activity</h2>
51
52<p>There's nothing special about the {@link android.content.Intent} object you use when starting
53an activity for a result, but you do need to pass an additional integer argument to the {@link
54android.app.Activity#startActivityForResult startActivityForResult()} method.</p>
55
56<p>The integer argument is a "request code" that identifies your request. When you receive the
57result {@link android.content.Intent}, the callback provides the same request code so that your
58app can properly identify the result and determine how to handle it.</p>
59
60<p>For example, here's how to start an activity that allows the user to pick a contact:</p>
61
62<pre>
63static final int PICK_CONTACT_REQUEST = 1;  // The request code
64...
65private void pickContact() {
66    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
67    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
68    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
69}
70</pre>
71
72
73<h2 id="ReceiveResult">Receive the Result</h2>
74
75<p>When the user is done with the subsequent activity and returns, the system calls your activity's
76{@link android.app.Activity#onActivityResult onActivityResult()} method. This method includes three
77arguments:</p>
78
79<ul>
80  <li>The request code you passed to {@link
81android.app.Activity#startActivityForResult startActivityForResult()}.</li>
82  <li>A result code specified by the second activity. This is either {@link
83android.app.Activity#RESULT_OK} if the operation was successful or {@link
84android.app.Activity#RESULT_CANCELED} if the user backed out or the operation failed for some
85reason.</li>
86  <li>An {@link android.content.Intent} that carries the result data.</li>
87</ul>
88
89<p>For example, here's how you can handle the result for the "pick a contact" intent:</p>
90
91<pre>
92&#64;Override
93protected void onActivityResult(int requestCode, int resultCode, Intent data) {
94    // Check which request we're responding to
95    if (requestCode == PICK_CONTACT_REQUEST) {
96        // Make sure the request was successful
97        if (resultCode == RESULT_OK) {
98            // The user picked a contact.
99            // The Intent's data Uri identifies which contact was selected.
100
101            // Do something with the contact here (bigger example below)
102        }
103    }
104}
105</pre>
106
107<p>In this example, the result {@link android.content.Intent} returned by
108Android's Contacts or People app provides a content {@link android.net.Uri} that identifies the
109contact the user selected.</p>
110
111<p>In order to successfully handle the result, you must understand what the format of the result
112{@link android.content.Intent} will be. Doing so is easy when the activity returning a result is
113one of your own activities. Apps included with the Android platform offer their own APIs that
114you can count on for specific result data. For instance, the People app (Contacts app on some older
115versions) always returns a result with the content URI that identifies the selected contact, and the
116Camera app returns a {@link android.graphics.Bitmap} in the {@code "data"} extra (see the class
117about <a href="{@docRoot}training/camera/index.html">Capturing Photos</a>).</p>
118
119
120<h4>Bonus: Read the contact data</h4>
121
122<p>The code above showing how to get a result from the People app doesn't go into
123details about how to actually read the data from the result, because it requires more advanced
124discussion about <a href="{@docRoot}guide/topics/providers/content-providers.html">content
125providers</a>. However, if you're curious, here's some more code that shows how to query the
126result data to get the phone number from the selected contact:</p>
127
128<pre>
129&#64;Override
130protected void onActivityResult(int requestCode, int resultCode, Intent data) {
131    // Check which request it is that we're responding to
132    if (requestCode == PICK_CONTACT_REQUEST) {
133        // Make sure the request was successful
134        if (resultCode == RESULT_OK) {
135            // Get the URI that points to the selected contact
136            Uri contactUri = data.getData();
137            // We only need the NUMBER column, because there will be only one row in the result
138            String[] projection = {Phone.NUMBER};
139
140            // Perform the query on the contact to get the NUMBER column
141            // We don't need a selection or sort order (there's only one result for the given URI)
142            // CAUTION: The query() method should be called from a separate thread to avoid blocking
143            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
144            // Consider using {@link android.content.CursorLoader} to perform the query.
145            Cursor cursor = getContentResolver()
146                    .query(contactUri, projection, null, null, null);
147            cursor.moveToFirst();
148
149            // Retrieve the phone number from the NUMBER column
150            int column = cursor.getColumnIndex(Phone.NUMBER);
151            String number = cursor.getString(column);
152
153            // Do something with the phone number...
154        }
155    }
156}
157</pre>
158
159<p class="note"><strong>Note:</strong> Before Android 2.3 (API level 9), performing a query
160on the {@link android.provider.ContactsContract.Contacts Contacts Provider} (like the one shown
161above) requires that your app declare the {@link
162android.Manifest.permission#READ_CONTACTS} permission (see <a
163href="{@docRoot}guide/topics/security/security.html">Security and Permissions</a>). However,
164beginning with Android 2.3, the Contacts/People app grants your app a temporary
165permission to read from the Contacts Provider when it returns you a result. The temporary permission
166applies only to the specific contact requested, so you cannot query a contact other than the one
167specified by the intent's {@link android.net.Uri}, unless you do declare the {@link
168android.Manifest.permission#READ_CONTACTS} permission.</p>
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184