• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1page.title=Enviando o usuário para outro aplicativo
2page.tags=intenções
3helpoutsWidget=true
4
5trainingnavtop=true
6
7@jd:body
8
9
10<div id="tb-wrapper">
11  <div id="tb">
12
13<h2>Esta lição ensina a</h2>
14<ol>
15  <li><a href="#Build">Criar uma intenção implícita</a></li>
16  <li><a href="#Verify">Confirmar se há um aplicativo para receber a intenção</a></li>
17  <li><a href="#StartActivity">Iniciar uma atividade com uma intenção</a></li>
18  <li><a href="#AppChooser">Mostrar um selecionador de aplicativo</a></li>
19</ol>
20
21<h2>Leia também</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 características mais importantes do Android é a habilidade do aplicativo enviar o usuário para outro aplicativo
30com base em uma “ação” que gostaria de executar. Por exemplo, se
31o aplicativo tiver o endereço de um negócio que você gostaria de mostrar em um mapa, não é necessário criar
32uma atividade no aplicativo que mostre um mapa. Em vez disso, é possível criar uma solicitação para exibir o endereço
33usando {@link android.content.Intent}. O sistema Android inicia um aplicativo que possa mostrar
34o endereço em um mapa.</p>
35
36<p>Como explicado na primeira lição, <a href="{@docRoot}training/basics/firstapp/index.html">Criando
37seu primeiro aplicativo</a>, use intenções para navegar entre atividades no aplicativo. Geralmente
38isso é feito com <em>intenções explícitas</em>, que define o nome exato da classe do
39componente que deseja iniciar. No entanto, quando desejar que outro aplicativo execute uma ação, como
40“visualizar um mapa”, use uma <em>intenção implícita</em>.</p>
41
42<p>Esta lição mostra como criar uma intenção implícita para uma ação específica e como utilizá-la
43para iniciar uma atividade que executa a ação em outro aplicativo.</p>
44
45
46
47<h2 id="Build">Criar uma intenção implícita</h2>
48
49<p>Intenções implícitas não declaram o nome da classe do componente a iniciar, mas declaram uma
50ação a executar. A ação especifica o que deve ser feito, como <em>visualizar</em>,
51<em>editar</em>, <em>enviar</em> ou <em>obter</em> algo. Geralmente, as intenções incluem dados associados
52à ação, como o endereço que deseja visualizar ou a mensagem de email a ser enviada.
53Dependendo da intenção que deseja criar, os dados podem ser {@link android.net.Uri},
54um dos outros tipos de dados ou a intenção pode não precisar de dado algum.</p>
55
56<p>Se seu dados forem um {@link android.net.Uri}, há um simples construtor {@link
57android.content.Intent#Intent(String,Uri) Intent()} que pode ser usado para definir a ação e
58os dados.</p>
59
60<p>Este é um exemplo de como criar uma intenção para iniciar uma chamada telefônica usando os dados {@link
61android.net.Uri} para especificar o número de telefone:</p>
62
63<pre>
64Uri number = Uri.parse("tel:5551234");
65Intent callIntent = new Intent(Intent.ACTION_DIAL, number);
66</pre>
67
68<p>Quando o aplicativo invoca a intenção chamando {@link android.app.Activity#startActivity
69startActivity()}, o aplicativo Telefone inicia uma chamada para o número especificado.</p>
70
71<p>Estas são algumas outras intenções e suas ações 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
78Uri 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
81Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
82</pre>
83  </li>
84  <li>Visualizar uma página da Web:
85<pre>
86Uri webpage = Uri.parse("http://www.android.com");
87Intent webIntent = new Intent(Intent.ACTION_VIEW, webpage);
88</pre>
89  </li>
90</ul>
91
92<p>Outros tipos de intenções implícitas exigem dados “extras” que fornecem diferentes tipos de dados,
93como uma cadeia de caracteres. É possível adicionar um ou mais dados extras utilizando vários métodos {@link
94android.content.Intent#putExtra(String,String) putExtra()}.</p>
95
96<p>Por padrão, o sistema determina o tipo MIME adequado que uma intenção exige com base nos dados
97{@link android.net.Uri} incluídos. Se você não incluir um {@link android.net.Uri} na
98intenção, sempre utilize {@link android.content.Intent#setType setType()} para especificar o tipo
99de dado associado à intenção. Definir o tipo de MIME especifica melhor que tipos de
100atividades receberão a intenção.</p>
101
102<p>Estas são mais algumas intenções que adicionam dados extra para especificar a intenção desejada:</p>
103
104<ul>
105  <li>Enviar um email com um anexo:
106<pre>
107Intent emailIntent = new Intent(Intent.ACTION_SEND);
108// The intent does not have a URI, so declare the "text/plain" MIME type
109emailIntent.setType(HTTP.PLAIN_TEXT_TYPE);
110emailIntent.putExtra(Intent.EXTRA_EMAIL, new String[] {"jon@example.com"}); // recipients
111emailIntent.putExtra(Intent.EXTRA_SUBJECT, "Email subject");
112emailIntent.putExtra(Intent.EXTRA_TEXT, "Email message text");
113emailIntent.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 calendário:
118<pre>
119Intent calendarIntent = new Intent(Intent.ACTION_INSERT, Events.CONTENT_URI);
120Calendar beginTime = Calendar.getInstance().set(2012, 0, 19, 7, 30);
121Calendar endTime = Calendar.getInstance().set(2012, 0, 19, 10, 30);
122calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_BEGIN_TIME, beginTime.getTimeInMillis());
123calendarIntent.putExtra(CalendarContract.EXTRA_EVENT_END_TIME, endTime.getTimeInMillis());
124calendarIntent.putExtra(Events.TITLE, "Ninja class");
125calendarIntent.putExtra(Events.EVENT_LOCATION, "Secret dojo");
126</pre>
127<p class="note"><strong>Observação:</strong> esta intenção para evento de calendário é suportada apenas com nível de API
12814 e superior.</p>
129  </li>
130</ul>
131
132<p class="note"><strong>Observação:</strong> é importante definir seu {@link
133android.content.Intent} para ser o mais específico possível. Por exemplo, se você deseja exibir uma imagem
134usando a intenção {@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
136acionado pela intenção.</p>
137
138
139
140<h2 id="Verify">Confirmar se há um aplicativo para receber a intenção</h2>
141
142<p>Embora a plataforma do Android garanta que determinadas intenções sejam resolvidas com um dos
143 aplicativos embutidos (como aplicativo de Telefone, Email ou Agenda), sempre inclua uma
144etapa de confirmação antes de chamar uma intenção.</p>
145
146<p class="caution"><strong>Cuidado:</strong> se você invocar uma intenção e não houver aplicativo
147disponível no dispositivo para tratar a intenção, o aplicativo falhará.</p>
148
149<p>Para confirmar se há atividade disponível para responder à intenção, chame {@link
150android.content.pm.PackageManager#queryIntentActivities queryIntentActivities()} para obter uma lista
151de atividades que podem tratar a {@link android.content.Intent}. Se o {@link
152java.util.List} retornado não estiver vazio, a intenção poderá ser usada com segurança. Por exemplo:</p>
153
154<pre>
155PackageManager packageManager = {@link android.content.Context#getPackageManager()};
156List<ResolveInfo> activities = packageManager.queryIntentActivities(intent,
157        PackageManager.MATCH_DEFAULT_ONLY);
158boolean isIntentSafe = activities.size() > 0;
159</pre>
160
161<p>Se <code>isIntentSafe</code> for <code>true</code>, pelo menos um aplicativo responderá à
162intenção. Se for <code>false</code>, não há aplicativos disponíveis para responder à intenção.</p>
163
164<p class="note"><strong>Observação:</strong> faça essa verificação quando a atividade
165iniciar, caso seja necessário desabilitar a funcionalidade que usa a intenção antes do usuário tentar utilizá-
166la. Caso conheça um aplicativo específico que possa lidar com a intenção, forneça um link para que o
167usuário baixe o aplicativo (veja como <a href="{@docRoot}distribute/tools/promote/linking.html">vincular para seus produtos no Google
168Play</a>).</p>
169
170
171<h2 id="StartActivity">Iniciar uma atividade com uma intenção</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 diálogo de seleção que aparece
176quando mais de um aplicativo pode tratar uma intenção.</p>
177</div>
178
179<p>Quando tiver criado sua {@link android.content.Intent} e definido as informações extras, chame {@link
180android.app.Activity#startActivity startActivity()} para enviá-la ao sistema. Se o sistema
181identificar mais de uma atividade que pode tratar a intenção, um diálogo exibirá para que o usuário
182selecione qual aplicativo usar, como mostrado na figura 1. Se houver apenas uma atividade para tratar a
183intenção, o sistema a iniciará imediatamente.</p>
184
185<pre>
186startActivity(intent);
187</pre>
188
189<p>Este é um exemplo completo que mostra como criar uma intenção para exibir um mapa, confirmar se há
190um aplicativo para tratar a intenção e iniciar:</p>
191
192<pre>
193// Build the intent
194Uri location = Uri.parse("geo:0,0?q=1600+Amphitheatre+Parkway,+Mountain+View,+California");
195Intent mapIntent = new Intent(Intent.ACTION_VIEW, location);
196
197// Verify it resolves
198PackageManager packageManager = {@link android.content.Context#getPackageManager()};
199List&lt;ResolveInfo> activities = packageManager.queryIntentActivities(mapIntent, 0);
200boolean isIntentSafe = activities.size() > 0;
201
202// Start an activity if it's safe
203if (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 diálogo seletor.</p>
215</div>
216
217<p>Observe que ao iniciar uma atividade passando seu {@link android.content.Intent} para {@link
218android.app.Activity#startActivity startActivity()} e quando há mais de um aplicativo que responde à
219intenção, o usuário pode selecionar qual aplicativo usar por padrão (marcando uma caixa de seleção na parte inferior
220do diálogo, veja a figura 1). Isto é bom quando se executa uma ação para qual o usuário
221deseja usar o mesmo aplicativo todas as vezes, como quando abre uma página da Web (o usuário
222geralmente usa apenas um navegador) ou para tirar fotos (o usuário prefere uma câmera).</p>
223
224<p>Contudo, se a ação a ser executada puder ser tratada por vários aplicativos e o usuário
225preferir um aplicativo diferente a cada vez, como a ação “compartilhar” onde os usuários podem ter vários
226aplicativos para compartilhar um item, você deve exibir explicitamente um diálogo seletor
227conforme mostrado na figura 2. O diálogo seletor
228força o usuário a selecionar qual aplicativo usar para a ação todas as vezes (o usuário não pode selecionar
229um aplicativo padrão para a ação).</p>
230
231<p>Para exibir o seletor, crie uma {@link android.content.Intent} usando {@link
232android.content.Intent#createChooser createChooser()} e transmita para {@link
233android.app.Activity#startActivity startActivity()}. Por exemplo:</p>
234
235<pre>
236Intent 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"
241String title = getResources().getString(R.string.chooser_title);
242// Create intent to show chooser
243Intent chooser = Intent.createChooser(intent, title);
244
245// Verify the intent will resolve to at least one activity
246if (intent.resolveActivity(getPackageManager()) != null) {
247    startActivity(chooser);
248}
249</pre>
250
251<p>Isso exibe um diálogo com uma lista de aplicativos que respondem à intenção transmitida ao método {@link
252android.content.Intent#createChooser createChooser()} e utiliza o texto fornecido como
253título do diálogo.</p>
254
255
256
257