1 page.title=Obtendo resultados de uma atividade 2 page.tags=intenes 3 helpoutsWidget=true 4 5 trainingnavtop=true 6 7 @jd:body 8 9 <div id="tb-wrapper"> 10 <div id="tb"> 11 12 <h2>Esta lio ensina a</h2> 13 <ol> 14 <li><a href="#StartActivity">Iniciar a atividade</a></li> 15 <li><a href="#ReceiveResult">Receber o resultado</a></li> 16 </ol> 17 18 <h2>Leia tambm</h2> 19 <ul> 20 <li><a href="{@docRoot}training/sharing/index.html">Compartilhando dados simples</a></li> 21 <li><a href="{@docRoot}training/secure-file-sharing/index.html">Compartilhando arquivos</a> 22 </ul> 23 24 </div> 25 </div> 26 27 <p>Iniciar outra atividade no precisa ser a nica forma. Pode-se tambm iniciar outra atividade e 28 receber um resultado de volta. Para receber um resultado, chame {@link android.app.Activity#startActivityForResult 29 startActivityForResult()} (em vez de {@link android.app.Activity#startActivity 30 startActivity()}).</p> 31 32 <p>Por exemplo, o aplicativo pode iniciar um aplicativo de cmera e receber a foto capturada como resultado. Ou, 33 ao iniciar o aplicativo Pessoas para que o usurio selecione um 34 contato, voc receber os detalhes do contato como resultado.</p> 35 36 <p>Evidentemente a atividade que responde deve ser projetada para retornar um resultado. Quando isso acontecer, ela 37 enviar o resultado para outro objeto {@link android.content.Intent}. A atividade recebe o resultado no 38 retorno de chamada {@link android.app.Activity#onActivityResult onActivityResult()}.</p> 39 40 <p class="note"><strong>Observao:</strong> pode-se usar intenes explcitas ou implcitas ao chamar 41 {@link android.app.Activity#startActivityForResult startActivityForResult()}. Ao iniciar uma de 42 suas prprias atividades que recebem um resultado, use uma inteno explcita para garantir que o 43 resultado esperado ser recebido.</p> 44 45 46 <h2 id="StartActivity">Iniciar a atividade</h2> 47 48 <p>No h nada especial no objeto {@link android.content.Intent} utilizado para iniciar 49 uma atividade para um resultado, mas preciso transmitir um argumento de nmero inteiro adicional ao mtodo {@link 50 android.app.Activity#startActivityForResult startActivityForResult()}.</p> 51 52 <p>O argumento de nmero inteiro um cdigo de pedido que identifica o pedido. Quando voc recebe o 53 resultado {@link android.content.Intent}, o retorno de chamada fornece o mesmo cdigo de pedido para que o 54 aplicativo possa identificar adequadamente o resultado e determinar como responder a ele.</p> 55 56 <p>Essa uma forma de iniciar uma atividade que permite ao usurio escolher um contato:</p> 57 58 <pre> 59 static final int PICK_CONTACT_REQUEST = 1; // The request code 60 ... 61 private 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">Receber o resultado</h2> 70 71 <p>Quando o usurio termina a atividade subsequente e retorna, o sistema chama o mtodo 72 {@link android.app.Activity#onActivityResult onActivityResult()} da atividade. Esse mtodo inclui trs 73 argumentos:</p> 74 75 <ul> 76 <li>O cdigo de pedido passado para {@link 77 android.app.Activity#startActivityForResult startActivityForResult()}.</li> 78 <li>Um cdigo de resultado especificado pela segunda atividade. Se a operao for bem sucedida, ser {@link 79 android.app.Activity#RESULT_OK} ou {@link 80 android.app.Activity#RESULT_CANCELED} se o usurio tiver desistido ou a operao tiver falhado por algum 81 motivo.</li> 82 <li>Um {@link android.content.Intent} que transporta os dados do resultado.</li> 83 </ul> 84 85 <p>Esta uma forma de responder ao resultado para a inteno escolher um contato:</p> 86 87 <pre> 88 @Override 89 protected 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>Nesse exemplo, o resultado {@link android.content.Intent} retornado pelos 104 aplicativos Contatos ou Pessoas do Android fornece um contedo {@link android.net.Uri} que identifica o 105 contato escolhido pelo usurio.</p> 106 107 <p>Para que o resultado seja tratado de forma adequada, preciso saber o formato do resultado 108 {@link android.content.Intent}. Isso fcil quando umas das suas atividades 109 retorna o resultado. Os aplicativos includos na plataforma Android oferecem suas prprias APIs que 110 podem ser usadas para dados de resultado especficos. Por exemplo, o aplicativo Pessoas (Contatos em algumas verses mais 111 antigas) sempre retorna um resultado com URI de contedo que identifica o contato escolhido e o aplicativo 112 Cmera retorna um {@link android.graphics.Bitmap} no {@code "data"} extra (consulte a lio 113 <a href="{@docRoot}training/camera/index.html">Capturando fotografias</a>).</p> 114 115 116 <h4>Bnus: Ler os dados do contato</h4> 117 118 <p>O cdigo acima que mostra como obter um resultado pelo aplicativo Pessoas no 119 traz muitos detalhes sobre como exatamente ler os dados do resultado porque exige uma discusso mais avanada 120 sobre <a href="{@docRoot}guide/topics/providers/content-providers.html">provedores 121 de contedo</a>. No entanto, se voc desejar saber mais, aqui esto alguns cdigos que mostram como consultar os 122 dados de resultado para obter o nmero de telefone do contato selecionado:</p> 123 124 <pre> 125 @Override 126 protected 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>Observao:</strong> antes do Android 2.3 (API nvel 9), executar uma consulta 156 no {@link android.provider.ContactsContract.Contacts Contacts Provider} (como mostrado 157 acima) exige que o aplicativo declare a permisso {@link 158 android.Manifest.permission#READ_CONTACTS} (consulte <a href="{@docRoot}guide/topics/security/security.html">Segurana e permisses</a>). Contudo, 159 iniciar com Android 2.3, o aplicativo Contatos/Pessoas d ao aplicativo permisso 160 temporria para ler no Provedor de Contatos quando retornar um resultado. A permisso temporria 161 aplica-se apenas a pedidos de contato especficos, portanto, no possvel consultar um contato diferente daquele 162 especificado pelo {@link android.net.Uri} da inteno, a menos que voc declare a permisso {@link 163 android.Manifest.permission#READ_CONTACTS}.</p> 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179