• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Получение результата операции
2page.tags=объекты Intent
3helpoutsWidget=true
4
5trainingnavtop=true
6
7@jd:body
8
9<div id="tb-wrapper">
10  <div id="tb">
11
12<h2>Содержание этого урока</h2>
13<ol>
14  <li><a href="#StartActivity">Запуск операции</a></li>
15  <li><a href="#ReceiveResult">Получение результата</a></li>
16</ol>
17
18<h2>См. также:</h2>
19<ul>
20    <li><a href="{@docRoot}training/sharing/index.html">Общий доступ к простым данным</a></li>
21    <li><a href="{@docRoot}training/secure-file-sharing/index.html">Общий доступ к файлам</a>
22</ul>
23
24  </div>
25</div>
26
27<p>Запуск другой операции не обязательно должен быть односторонним действием. Вы можете запустить другую операцию и
28получить от нее результат. Для получения результата нужно вызвать метод {@link android.app.Activity#startActivityForResult
29startActivityForResult()} (вместо {@link android.app.Activity#startActivity
30startActivity()}).</p>
31
32<p>Например, ваше приложение может запустить приложение для камеры и получить в качестве результата фотографию. Также вы
33можете запустить приложение "Люди", чтобы пользователь выбрал в нем
34контакт, и получить контактные данные в качестве результата.</p>
35
36<p>Разумеется, отвечающая операция должна быть способной возвратить результат. При возврате
37результат отправляется как другой объект {@link android.content.Intent}. Ваша операция получает
38его в обратном вызове {@link android.app.Activity#onActivityResult onActivityResult()}.</p>
39
40<p class="note"><strong>Примечание.</strong> Вы можете использовать явные и неявные результаты при вызове
41{@link android.app.Activity#startActivityForResult startActivityForResult()}. При запуске собственной
42операции для получения результата вы должны использовать явные результаты, чтобы получить
43именно ожидаемый результат.</p>
44
45
46<h2 id="StartActivity">Запуск операции</h2>
47
48<p>В объекте {@link android.content.Intent}, используемом для запуска операции
49для получения результата, нет ничего особенного, однако нужно передать дополнительный целочисленный аргумент методы {@link
50android.app.Activity#startActivityForResult startActivityForResult()}.</p>
51
52<p>Этот целочисленный аргумент представляет собой "код запроса", определяющий ваш запрос. Когда вы получите
53результат {@link android.content.Intent}, обратный вызов использует тот же самый код результата,
54чтобы ваше приложение могло правильно определить результат и понять, как его нужно обработать.</p>
55
56<p>Например, вот так можно запустить операцию, позволяющую пользователю выбрать контакт:</p>
57
58<pre>
59static final int PICK_CONTACT_REQUEST = 1;  // The request code
60...
61private void pickContact() {
62    Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
63    pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
64    startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
65}
66</pre>
67
68
69<h2 id="ReceiveResult">Получение результата</h2>
70
71<p>Когда пользователь завершит последующую операцию и вернется, система вызовет метод вашей операции
72{@link android.app.Activity#onActivityResult onActivityResult()}. Этот метод содержит три
73аргумента:</p>
74
75<ul>
76  <li>Код запроса, переданный вами {@link
77android.app.Activity#startActivityForResult startActivityForResult()}.</li>
78  <li>Полученный в качестве результата код, указанный второй операцией. Или {@link
79android.app.Activity#RESULT_OK}, если операция была успешной, или {@link
80android.app.Activity#RESULT_CANCELED}, если пользователь отказался или операцию не удалось выполнить по какой-либо
81причине.</li>
82  <li>{@link android.content.Intent}, переносящий полученные данные.</li>
83</ul>
84
85<p>Например, результаты для намерения "Выбрать контакт" могут обрабатываться следующим образом:</p>
86
87<pre>
88&#64;Override
89protected void onActivityResult(int requestCode, int resultCode, Intent data) {
90    // Check which request we're responding to
91    if (requestCode == PICK_CONTACT_REQUEST) {
92        // Make sure the request was successful
93        if (resultCode == RESULT_OK) {
94            // The user picked a contact.
95            // The Intent's data Uri identifies which contact was selected.
96
97            // Do something with the contact here (bigger example below)
98        }
99    }
100}
101</pre>
102
103<p>В этом примере результаты, {@link android.content.Intent} возвращаемые приложениями
104Android Контакты или Люди, предоставляют контент {@link android.net.Uri}, который идентифицирует
105выбранный пользователем контакт.</p>
106
107<p>Для успешной обработки результатов необходимо понимать, каким будет формат этих результатов
108{@link android.content.Intent}. Это просто, если результат возвращается одной из ваших
109собственных операций. Приложения, входящие в состав платформы Android, имеют собственные прикладные интерфейсы, так что
110вы можете рассчитывать на получение определенных результатов. Например, приложение "Люди" (приложение "Контакты" в старых
111версиях) всегда возвращает результат с URI контента, идентифицирующий выбранный контакт, а приложение
112"Камера" возвращает {@link android.graphics.Bitmap} в дополнительном {@code "data"} (см. урок
113<a href="{@docRoot}training/camera/index.html">Съемка фотографий</a>).</p>
114
115
116<h4>Бонус: Чтение контактных данных</h4>
117
118<p>Приведенный выше код, показывающий как получить результаты из приложения "Люди", не описывает
119детально чтение данных результатов, потому что для этого нужно более
120подробно рассказать о <a href="{@docRoot}guide/topics/providers/content-providers.html">поставщиках
121контента</a>. Если вам все-таки интересно, вот еще код, показывающий как запрашивать
122данные результатов для получения номера телефона выбранного контакта:</p>
123
124<pre>
125&#64;Override
126protected void onActivityResult(int requestCode, int resultCode, Intent data) {
127    // Check which request it is that we're responding to
128    if (requestCode == PICK_CONTACT_REQUEST) {
129        // Make sure the request was successful
130        if (resultCode == RESULT_OK) {
131            // Get the URI that points to the selected contact
132            Uri contactUri = data.getData();
133            // We only need the NUMBER column, because there will be only one row in the result
134            String[] projection = {Phone.NUMBER};
135
136            // Perform the query on the contact to get the NUMBER column
137            // We don't need a selection or sort order (there's only one result for the given URI)
138            // CAUTION: The query() method should be called from a separate thread to avoid blocking
139            // your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
140            // Consider using {@link android.content.CursorLoader} to perform the query.
141            Cursor cursor = getContentResolver()
142                    .query(contactUri, projection, null, null, null);
143            cursor.moveToFirst();
144
145            // Retrieve the phone number from the NUMBER column
146            int column = cursor.getColumnIndex(Phone.NUMBER);
147            String number = cursor.getString(column);
148
149            // Do something with the phone number...
150        }
151    }
152}
153</pre>
154
155<p class="note"><strong>Примечание.</strong> До выхода версии Android 2.3 (API-интерфейс уровня 9) для выполнения
156запроса {@link android.provider.ContactsContract.Contacts Contacts Provider} (как
157показанный выше) ваше приложение должно было декларировать разрешение {@link
158android.Manifest.permission#READ_CONTACTS} (см. <a href="{@docRoot}guide/topics/security/security.html">Безопасность и разрешения</a>). Однако,
159начиная с версии Android 2.3, приложение "Контакты/Люди" дает вашему приложению временное
160разрешение на чтение данных Поставщика контактов при выводе результата. Это временное разрешение
161действует только в отношении конкретного запрошенного контакта, так что нельзя запрашивать другой контакт,
162кроме указанного объектом Intent {@link android.net.Uri}, если вы не хотите декларировать разрешение {@link
163android.Manifest.permission#READ_CONTACTS}.</p>
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179