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@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@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