Home | History | Annotate | Download | only in intents
      1 page.title=Enviando o usurio para outro aplicativo
      2 page.tags=intenes
      3 helpoutsWidget=true
      4 
      5 trainingnavtop=true
      6 
      7 @jd:body
      8 
      9 
     10 <div id="tb-wrapper">
     11   <div id="tb">
     12 
     13 <h2>Esta lio ensina a</h2>
     14 <ol>
     15   <li><a href="#Build">Criar uma inteno implcita</a></li>
     16   <li><a href="#Verify">Confirmar se h um aplicativo para receber a inteno</a></li>
     17   <li><a href="#StartActivity">Iniciar uma atividade com uma inteno</a></li>
     18   <li><a href="#AppChooser">Mostrar um selecionador de aplicativo</a></li>
     19 </ol>
     20 
     21 <h2>Leia tambm</h2>
     22 <ul>
     23     <li><a href="{@docRoot}training/sharing/index.html">Compartilhando dados simples</a></li>
     24 </ul>
     25 
     26   </div>
     27 </div>
     28 
     29 <p>Uma das caractersticas mais importantes do Android  a habilidade do aplicativo enviar o usurio para outro aplicativo
     30 com base em uma ao que gostaria de executar. Por exemplo, se
     31 o aplicativo tiver o endereo de um negcio que voc gostaria de mostrar em um mapa, no  necessrio criar
     32 uma atividade no aplicativo que mostre um mapa. Em vez disso,  possvel criar uma solicitao para exibir o endereo
     33 usando {@link android.content.Intent}. O sistema Android inicia um aplicativo que possa mostrar
     34 o endereo em um mapa.</p>
     35 
     36 <p>Como explicado na primeira lio, <a href="{@docRoot}training/basics/firstapp/index.html">Criando
     37 seu primeiro aplicativo</a>, use intenes para navegar entre atividades no aplicativo. Geralmente
     38 isso  feito com <em>intenes explcitas</em>, que define o nome exato da classe do
     39 componente que deseja iniciar. No entanto, quando desejar que outro aplicativo execute uma ao, como
     40 visualizar um mapa, use uma <em>inteno implcita</em>.</p>
     41 
     42 <p>Esta lio mostra como criar uma inteno implcita para uma ao especfica e como utiliz-la
     43 para iniciar uma atividade que executa a ao em outro aplicativo.</p>
     44 
     45 
     46 
     47 <h2 id="Build">Criar uma inteno implcita</h2>
     48 
     49 <p>Intenes implcitas no declaram o nome da classe do componente a iniciar, mas declaram uma
     50 ao a executar. A ao especifica o que deve ser feito, como <em>visualizar</em>,
     51 <em>editar</em>, <em>enviar</em> ou <em>obter</em> algo. Geralmente, as intenes incluem dados associados
     52  ao, como o endereo que deseja visualizar ou a mensagem de email a ser enviada.
     53 Dependendo da inteno que deseja criar, os dados podem ser {@link android.net.Uri},
     54 um dos outros tipos de dados ou a inteno pode no precisar de dado algum.</p>
     55 
     56 <p>Se seu dados forem um {@link android.net.Uri}, h um simples construtor {@link
     57 android.content.Intent#Intent(String,Uri) Intent()} que pode ser usado para definir a ao e
     58 os dados.</p>
     59 
     60 <p>Este  um exemplo de como criar uma inteno para iniciar uma chamada telefnica usando os dados {@link
     61 android.net.Uri} para especificar o nmero de telefone:</p>
     62 
     63 <pre>
     64 Uri number = Uri.parse("tel:5551234");
     65 Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
     66 </pre>
     67 
     68 <p>Quando o aplicativo invoca a inteno chamando {@link android.app.Activity#startActivity
     69 startActivity()}, o aplicativo Telefone inicia uma chamada para o nmero especificado.</p>
     70 
     71 <p>Estas so algumas outras intenes e suas aes e pares de dados {@link android.net.Uri}
     72 :</p>
     73 
     74 <ul>
     75   <li>Visualizar um mapa:
     76 <pre>
     77 // Map point based on address
     78 Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
     79 // Or map point based on latitude/longitude
     80 // Uri location = Uri.parse("geo:37.422219,-122.08364?z=14"); // z param is zoom level
     81 Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
     82 </pre>
     83   </li>
     84   <li>Visualizar uma pgina da Web:
     85 <pre>
     86 Uri webpage = Uri.parse("http://www.android.com");
     87 Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
     88 </pre>
     89   </li>
     90 </ul>
     91 
     92 <p>Outros tipos de intenes implcitas exigem dados extras que fornecem diferentes tipos de dados,
     93 como uma cadeia de caracteres.  possvel adicionar um ou mais dados extras utilizando vrios mtodos {@link
     94 android.content.Intent#putExtra(String,String) putExtra()}.</p>
     95 
     96 <p>Por padro, o sistema determina o tipo MIME adequado que uma inteno exige com base nos dados
     97 {@link android.net.Uri} includos. Se voc no incluir um {@link android.net.Uri} na
     98 inteno, sempre utilize {@link android.content.Intent#setType setType()} para especificar o tipo
     99 de dado associado  inteno. Definir o tipo de MIME especifica melhor que tipos de
    100 atividades recebero a inteno.</p>
    101 
    102 <p>Estas so mais algumas intenes que adicionam dados extra para especificar a inteno desejada:</p>
    103 
    104 <ul>
    105   <li>Enviar um email com um anexo:
    106 <pre>
    107 Intent emailIntent = new Intent(Intent.ACTION_SEND);
    108 // The intent does not have a URI, so declare the "text/plain" MIME type
    109 emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
    110 emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon (a] example.com"}); // recipients
    111 emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
    112 emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
    113 emailIntent.putExtra(Intent.EXTRA_STREAM, Uri.parse("content://path/to/email/attachment"));
    114 // You can also attach multiple items by passing an ArrayList of Uris
    115 </pre>
    116   </li>
    117   <li>Criar um evento de calendrio:
    118 <pre>
    119 Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
    120 Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
    121 Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
    122 calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
    123 calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
    124 calendarIntent.putExtra(Events.TITLE, "Ninja class");
    125 calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
    126 </pre>
    127 <p class="note"><strong>Observao:</strong> esta inteno para evento de calendrio  suportada apenas com nvel de API
    128 14 e superior.</p>
    129   </li>
    130 </ul>
    131 
    132 <p class="note"><strong>Observao:</strong>  importante definir seu {@link
    133 android.content.Intent} para ser o mais especfico possvel. Por exemplo, se voc deseja exibir uma imagem
    134 usando a inteno {@link android.content.Intent#ACTION_VIEW}, especifique o tipo de MIME do
    135 {@code image/*}. Isto evita que aplicativos que podem exibir outros tipos de dados (como um aplicativo de mapas) seja
    136 acionado pela inteno.</p>
    137 
    138 
    139 
    140 <h2 id="Verify">Confirmar se h um aplicativo para receber a inteno</h2>
    141 
    142 <p>Embora a plataforma do Android garanta que determinadas intenes sejam resolvidas com um dos
    143  aplicativos embutidos (como aplicativo de Telefone, Email ou Agenda), sempre inclua uma
    144 etapa de confirmao antes de chamar uma inteno.</p>
    145 
    146 <p class="caution"><strong>Cuidado:</strong> se voc invocar uma inteno e no houver aplicativo
    147 disponvel no dispositivo para tratar a inteno, o aplicativo falhar.</p>
    148 
    149 <p>Para confirmar se h atividade disponvel para responder  inteno, chame {@link
    150 android.content.pm.PackageManager#queryIntentActivities queryIntentActivities()} para obter uma lista
    151 de atividades que podem tratar a {@link android.content.Intent}. Se o {@link
    152 java.util.List} retornado no estiver vazio, a inteno poder ser usada com segurana. Por exemplo:</p>
    153 
    154 <pre>
    155 PackageManager packageManager = {@link android.content.Context#getPackageManager()};
    156 List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
    157         PackageManager.MATCH_DEFAULT_ONLY);
    158 boolean isIntentSafe = activities.size() > 0;
    159 </pre>
    160 
    161 <p>Se <code>isIntentSafe</code> for <code>true</code>, pelo menos um aplicativo responder 
    162 inteno. Se for <code>false</code>, no h aplicativos disponveis para responder  inteno.</p>
    163 
    164 <p class="note"><strong>Observao:</strong> faa essa verificao quando a atividade
    165 iniciar, caso seja necessrio desabilitar a funcionalidade que usa a inteno antes do usurio tentar utiliz-
    166 la. Caso conhea um aplicativo especfico que possa lidar com a inteno, fornea um link para que o
    167 usurio baixe o aplicativo (veja como <a href="{@docRoot}distribute/tools/promote/linking.html">vincular para seus produtos no Google
    168 Play</a>).</p>
    169 
    170 
    171 <h2 id="StartActivity">Iniciar uma atividade com uma inteno</h2>
    172 
    173 <div class="figure" style="width:200px;margin-top:-10px">
    174   <img src="{@docRoot}images/training/basics/intents-choice.png" alt="" />
    175   <p class="img-caption"><strong>Figura 1.</strong> Exemplo de dilogo de seleo que aparece
    176 quando mais de um aplicativo pode tratar uma inteno.</p>
    177 </div>
    178 
    179 <p>Quando tiver criado sua {@link android.content.Intent} e definido as informaes extras, chame {@link
    180 android.app.Activity#startActivity startActivity()} para envi-la ao sistema. Se o sistema
    181 identificar mais de uma atividade que pode tratar a inteno, um dilogo exibir para que o usurio
    182 selecione qual aplicativo usar, como mostrado na figura 1. Se houver apenas uma atividade para tratar a
    183 inteno, o sistema a iniciar imediatamente.</p>
    184 
    185 <pre>
    186 startActivity(intent);
    187 </pre>
    188 
    189 <p>Este  um exemplo completo que mostra como criar uma inteno para exibir um mapa, confirmar se h
    190 um aplicativo para tratar a inteno e iniciar:</p>
    191 
    192 <pre>
    193 // Build the intent
    194 Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
    195 Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
    196 
    197 // Verify it resolves
    198 PackageManager packageManager = {@link android.content.Context#getPackageManager()};
    199 List&lt;ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
    200 boolean isIntentSafe = activities.size() > 0;
    201 
    202 // Start an activity if it's safe
    203 if (isIntentSafe) {
    204     startActivity(mapIntent);
    205 }
    206 </pre>
    207 
    208 
    209 
    210 <h2 id="AppChooser">Mostrar um selecionador de aplicativo</h2>
    211 
    212 <div class="figure" style="width:200px;margin-top:-10px">
    213   <img src="{@docRoot}images/training/basics/intent-chooser.png" alt="" />
    214   <p class="img-caption"><strong>Figura 2.</strong> Um dilogo seletor.</p>
    215 </div>
    216 
    217 <p>Observe que ao iniciar uma atividade passando seu {@link android.content.Intent} para {@link
    218 android.app.Activity#startActivity startActivity()} e quando h mais de um aplicativo que responde 
    219 inteno, o usurio pode selecionar qual aplicativo usar por padro (marcando uma caixa de seleo na parte inferior
    220 do dilogo, veja a figura 1). Isto  bom quando se executa uma ao para qual o usurio
    221 deseja usar o mesmo aplicativo todas as vezes, como quando abre uma pgina da Web (o usurio
    222 geralmente usa apenas um navegador) ou para tirar fotos (o usurio prefere uma cmera).</p>
    223 
    224 <p>Contudo, se a ao a ser executada puder ser tratada por vrios aplicativos e o usurio
    225 preferir um aplicativo diferente a cada vez, como a ao compartilhar onde os usurios podem ter vrios
    226 aplicativos para compartilhar um item, voc deve exibir explicitamente um dilogo seletor
    227 conforme mostrado na figura 2. O dilogo seletor
    228 fora o usurio a selecionar qual aplicativo usar para a ao todas as vezes (o usurio no pode selecionar
    229 um aplicativo padro para a ao).</p>
    230 
    231 <p>Para exibir o seletor, crie uma {@link android.content.Intent} usando {@link
    232 android.content.Intent#createChooser createChooser()} e transmita para {@link
    233 android.app.Activity#startActivity startActivity()}. Por exemplo:</p>
    234 
    235 <pre>
    236 Intent intent = new Intent(Intent.ACTION_SEND);
    237 ...
    238 
    239 // Always use string resources for UI text.
    240 // This says something like "Share this photo with"
    241 String title = getResources().getString(R.string.chooser_title);
    242 // Create intent to show chooser
    243 Intent chooser = Intent.createChooser(intent, title);
    244 
    245 // Verify the intent will resolve to at least one activity
    246 if (intent.resolveActivity(getPackageManager()) != null) {
    247     startActivity(chooser);
    248 }
    249 </pre>
    250 
    251 <p>Isso exibe um dilogo com uma lista de aplicativos que respondem  inteno transmitida ao mtodo {@link
    252 android.content.Intent#createChooser createChooser()} e utiliza o texto fornecido como
    253 ttulo do dilogo.</p>
    254 
    255 
    256 
    257