Getting a Result from an Activity

Starting another activity doesn't have to be one-way. You can also start another activity and
receive a result back. To receive a result, call startActivityForResult() (instead of startActivity()).

For example, your app can start a camera app and receive the captured photo as a result. Or, you
might start the People app in order for the user to select a
contact and you'll receive the contact details as a result.

Of course, the activity that responds must be designed to return a result. When it does, it
sends the result as another Intent object. Your activity receives it in
the onActivityResult() callback.

Note: You can use explicit or implicit intents when you call
startActivityForResult(). When starting one of
your own activities to receive a result, you should use an explicit intent to ensure that you
receive the expected result.

Start the Activity

There's nothing special about the Intent object you use when starting
an activity for a result, but you do need to pass an additional integer argument to the startActivityForResult() method.

The integer argument is a "request code" that identifies your request. When you receive the
result Intent, the callback provides the same request code so that your
app can properly identify the result and determine how to handle it.

For example, here's how to start an activity that allows the user to pick a contact:

In this example, the result Intent returned by
Android's Contacts or People app provides a content Uri that identifies the
contact the user selected.

In order to successfully handle the result, you must understand what the format of the result
Intent will be. Doing so is easy when the activity returning a result is
one of your own activities. Apps included with the Android platform offer their own APIs that
you can count on for specific result data. For instance, the People app always returns a result
with the content URI that identifies the selected contact, and the
Camera app returns a Bitmap in the "data" extra (see the class
about Capturing Photos).

Bonus: Read the contact data

The code above showing how to get a result from the People app doesn't go into
details about how to actually read the data from the result, because it requires more advanced
discussion about content
providers. However, if you're curious, here's some more code that shows how to query the
result data to get the phone number from the selected contact:

Kotlin

override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent) {
// Check which request it is that we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == Activity.RESULT_OK) {
// We only need the NUMBER column, because there will be only one row in the result
val projection: Array<String> = arrayOf(Phone.NUMBER)
// Get the URI that points to the selected contact
data.data?.also { contactUri ->
// Perform the query on the contact to get the NUMBER column
// We don't need a selection or sort order (there's only one result for this URI)
// CAUTION: The query() method should be called from a separate thread to avoid
// blocking your app's UI thread. (For simplicity of the sample, this code doesn't
// do that.)
// Consider using <code><a href="/reference/android/content/CursorLoader.html">CursorLoader</a></code> to perform the query.
contentResolver.query(contactUri, projection, null, null, null)?.apply {
moveToFirst()
// Retrieve the phone number from the NUMBER column
val column: Int = getColumnIndex(Phone.NUMBER)
val number: String? = getString(column)
// Do something with the phone number...
}
}
}
}
}

Java

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent resultIntent) {
// Check which request it is that we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// Get the URI that points to the selected contact
Uri contactUri = resultIntent.getData();
// We only need the NUMBER column, because there will be only one row in the result
String[] projection = {Phone.NUMBER};
// Perform the query on the contact to get the NUMBER column
// We don't need a selection or sort order (there's only one result for the given URI)
// CAUTION: The query() method should be called from a separate thread to avoid blocking
// your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
// Consider using <code><a href="/reference/android/content/CursorLoader.html">CursorLoader</a></code> to perform the query.
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst();
// Retrieve the phone number from the NUMBER column
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column);
// Do something with the phone number...
}
}
}

Note: Before Android 2.3 (API level 9), performing a query
on the Contacts Provider (like the one shown
above) requires that your app declare the READ_CONTACTS permission (see Security and Permissions). However,
beginning with Android 2.3, the Contacts/People app grants your app a temporary
permission to read from the Contacts Provider when it returns you a result. The temporary permission
applies only to the specific contact requested, so you cannot query a contact other than the one
specified by the intent's Uri, unless you do declare the READ_CONTACTS permission.

For additional information about the topics on this page, refer to the following
resources: