Home | History | Annotate | Download | only in intents
      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 &#64;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 &#64;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