Skip to content

Most visited

Recently visited

navigation

Получение результата операции

Запуск другой операции не обязательно должен быть односторонним действием. Вы можете запустить другую операцию и получить от нее результат. Для получения результата нужно вызвать метод startActivityForResult() (вместо startActivity()).

Например, ваше приложение может запустить приложение для камеры и получить в качестве результата фотографию. Также вы можете запустить приложение "Люди", чтобы пользователь выбрал в нем контакт, и получить контактные данные в качестве результата.

Разумеется, отвечающая операция должна быть способной возвратить результат. При возврате результат отправляется как другой объект Intent. Ваша операция получает его в обратном вызове onActivityResult().

Примечание. Вы можете использовать явные и неявные результаты при вызове startActivityForResult(). При запуске собственной операции для получения результата вы должны использовать явные результаты, чтобы получить именно ожидаемый результат.

Запуск операции

В объекте Intent, используемом для запуска операции для получения результата, нет ничего особенного, однако нужно передать дополнительный целочисленный аргумент методы startActivityForResult().

Этот целочисленный аргумент представляет собой "код запроса", определяющий ваш запрос. Когда вы получите результат Intent, обратный вызов использует тот же самый код результата, чтобы ваше приложение могло правильно определить результат и понять, как его нужно обработать.

Например, вот так можно запустить операцию, позволяющую пользователю выбрать контакт:

static final int PICK_CONTACT_REQUEST = 1;  // The request code
...
private void pickContact() {
    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}

Получение результата

Когда пользователь завершит последующую операцию и вернется, система вызовет метод вашей операции onActivityResult(). Этот метод содержит три аргумента:

Например, результаты для намерения "Выбрать контакт" могут обрабатываться следующим образом:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // Check which request we're responding to
    if (requestCode == PICK_CONTACT_REQUEST) {
        // Make sure the request was successful
        if (resultCode == RESULT_OK) {
            // The user picked a contact.
            // The Intent's data Uri identifies which contact was selected.

            // Do something with the contact here (bigger example below)
        }
    }
}

В этом примере результаты, Intent возвращаемые приложениями Android Контакты или Люди, предоставляют контент Uri, который идентифицирует выбранный пользователем контакт.

Для успешной обработки результатов необходимо понимать, каким будет формат этих результатов Intent. Это просто, если результат возвращается одной из ваших собственных операций. Приложения, входящие в состав платформы Android, имеют собственные прикладные интерфейсы, так что вы можете рассчитывать на получение определенных результатов. Например, приложение "Люди" (приложение "Контакты" в старых версиях) всегда возвращает результат с URI контента, идентифицирующий выбранный контакт, а приложение "Камера" возвращает Bitmap в дополнительном "data" (см. урок Съемка фотографий).

Бонус: Чтение контактных данных

Приведенный выше код, показывающий как получить результаты из приложения "Люди", не описывает детально чтение данных результатов, потому что для этого нужно более подробно рассказать о поставщиках контента. Если вам все-таки интересно, вот еще код, показывающий как запрашивать данные результатов для получения номера телефона выбранного контакта:

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    // 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 = data.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 CursorLoader 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...
        }
    }
}

Примечание. До выхода версии Android 2.3 (API-интерфейс уровня 9) для выполнения запроса Contacts Provider (как показанный выше) ваше приложение должно было декларировать разрешение READ_CONTACTS (см. Безопасность и разрешения). Однако, начиная с версии Android 2.3, приложение "Контакты/Люди" дает вашему приложению временное разрешение на чтение данных Поставщика контактов при выводе результата. Это временное разрешение действует только в отношении конкретного запрошенного контакта, так что нельзя запрашивать другой контакт, кроме указанного объектом Intent Uri, если вы не хотите декларировать разрешение READ_CONTACTS.

This site uses cookies to store your preferences for site-specific language and display options.

Get the latest Android developer news and tips that will help you find success on Google Play.

* Required Fields

Hooray!

Следите за новостями от Google Developers в WeChat

Browse this site in ?

You requested a page in , but your language preference for this site is .

Would you like to change your language preference and browse this site in ? If you want to change your language preference later, use the language menu at the bottom of each page.

This class requires API level or higher

This doc is hidden because your selected API level for the documentation is . You can change the documentation API level with the selector above the left navigation.

For more information about specifying the API level your app requires, read Supporting Different Platform Versions.

Take a short survey?
Help us improve the Android developer experience. (Dec 2017 Android Platform & Tools Survey)