1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
|
page.title=Obtendo resultados de uma atividade
page.tags=intenções
helpoutsWidget=true
trainingnavtop=true
@jd:body
<div id="tb-wrapper">
<div id="tb">
<h2>Esta lição ensina a</h2>
<ol>
<li><a href="#StartActivity">Iniciar a atividade</a></li>
<li><a href="#ReceiveResult">Receber o resultado</a></li>
</ol>
<h2>Leia também</h2>
<ul>
<li><a href="{@docRoot}training/sharing/index.html">Compartilhando dados simples</a></li>
<li><a href="{@docRoot}training/secure-file-sharing/index.html">Compartilhando arquivos</a>
</ul>
</div>
</div>
<p>Iniciar outra atividade não precisa ser a única forma. Pode-se também iniciar outra atividade e
receber um resultado de volta. Para receber um resultado, chame {@link android.app.Activity#startActivityForResult
startActivityForResult()} (em vez de {@link android.app.Activity#startActivity
startActivity()}).</p>
<p>Por exemplo, o aplicativo pode iniciar um aplicativo de câmera e receber a foto capturada como resultado. Ou,
ao iniciar o aplicativo Pessoas para que o usuário selecione um
contato, você receberá os detalhes do contato como resultado.</p>
<p>Evidentemente a atividade que responde deve ser projetada para retornar um resultado. Quando isso acontecer, ela
enviará o resultado para outro objeto {@link android.content.Intent}. A atividade recebe o resultado no
retorno de chamada {@link android.app.Activity#onActivityResult onActivityResult()}.</p>
<p class="note"><strong>Observação:</strong> pode-se usar intenções explícitas ou implícitas ao chamar
{@link android.app.Activity#startActivityForResult startActivityForResult()}. Ao iniciar uma de
suas próprias atividades que recebem um resultado, use uma intenção explícita para garantir que o
resultado esperado será recebido.</p>
<h2 id="StartActivity">Iniciar a atividade</h2>
<p>Não há nada especial no objeto {@link android.content.Intent} utilizado para iniciar
uma atividade para um resultado, mas é preciso transmitir um argumento de número inteiro adicional ao método {@link
android.app.Activity#startActivityForResult startActivityForResult()}.</p>
<p>O argumento de número inteiro é um “código de pedido” que identifica o pedido. Quando você recebe o
resultado {@link android.content.Intent}, o retorno de chamada fornece o mesmo código de pedido para que o
aplicativo possa identificar adequadamente o resultado e determinar como responder a ele.</p>
<p>Essa é uma forma de iniciar uma atividade que permite ao usuário escolher um contato:</p>
<pre>
static final int PICK_CONTACT_REQUEST = 1; // The request code
...
private void pickContact() {
Intent pickContactIntent = new Intent(Intent.ACTION_PICK, Uri.parse("content://contacts"));
pickContactIntent.setType(Phone.CONTENT_TYPE); // Show user only contacts w/ phone numbers
startActivityForResult(pickContactIntent, PICK_CONTACT_REQUEST);
}
</pre>
<h2 id="ReceiveResult">Receber o resultado</h2>
<p>Quando o usuário termina a atividade subsequente e retorna, o sistema chama o método
{@link android.app.Activity#onActivityResult onActivityResult()} da atividade. Esse método inclui três
argumentos:</p>
<ul>
<li>O código de pedido passado para {@link
android.app.Activity#startActivityForResult startActivityForResult()}.</li>
<li>Um código de resultado especificado pela segunda atividade. Se a operação for bem sucedida, será {@link
android.app.Activity#RESULT_OK} ou {@link
android.app.Activity#RESULT_CANCELED} se o usuário tiver desistido ou a operação tiver falhado por algum
motivo.</li>
<li>Um {@link android.content.Intent} que transporta os dados do resultado.</li>
</ul>
<p>Esta é uma forma de responder ao resultado para a intenção “escolher um contato”:</p>
<pre>
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// The user picked a contact.
// The Intent's data Uri identifies which contact was selected.
// Do something with the contact here (bigger example below)
}
}
}
</pre>
<p>Nesse exemplo, o resultado {@link android.content.Intent} retornado pelos
aplicativos Contatos ou Pessoas do Android fornece um conteúdo {@link android.net.Uri} que identifica o
contato escolhido pelo usuário.</p>
<p>Para que o resultado seja tratado de forma adequada, é preciso saber o formato do resultado
{@link android.content.Intent}. Isso é fácil quando umas das suas atividades
retorna o resultado. Os aplicativos incluídos na plataforma Android oferecem suas próprias APIs que
podem ser usadas para dados de resultado específicos. Por exemplo, o aplicativo Pessoas (Contatos em algumas versões mais
antigas) sempre retorna um resultado com URI de conteúdo que identifica o contato escolhido e o aplicativo
Câmera retorna um {@link android.graphics.Bitmap} no {@code "data"} extra (consulte a lição
<a href="{@docRoot}training/camera/index.html">Capturando fotografias</a>).</p>
<h4>Bônus: Ler os dados do contato</h4>
<p>O código acima que mostra como obter um resultado pelo aplicativo Pessoas não
traz muitos detalhes sobre como exatamente ler os dados do resultado porque exige uma discussão mais avançada
sobre <a href="{@docRoot}guide/topics/providers/content-providers.html">provedores
de conteúdo</a>. No entanto, se você desejar saber mais, aqui estão alguns códigos que mostram como consultar os
dados de resultado para obter o número de telefone do contato selecionado:</p>
<pre>
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
// Check which request it is that we're responding to
if (requestCode == PICK_CONTACT_REQUEST) {
// Make sure the request was successful
if (resultCode == RESULT_OK) {
// Get the URI that points to the selected contact
Uri contactUri = data.getData();
// We only need the NUMBER column, because there will be only one row in the result
String[] projection = {Phone.NUMBER};
// Perform the query on the contact to get the NUMBER column
// We don't need a selection or sort order (there's only one result for the given URI)
// CAUTION: The query() method should be called from a separate thread to avoid blocking
// your app's UI thread. (For simplicity of the sample, this code doesn't do that.)
// Consider using {@link android.content.CursorLoader} to perform the query.
Cursor cursor = getContentResolver()
.query(contactUri, projection, null, null, null);
cursor.moveToFirst();
// Retrieve the phone number from the NUMBER column
int column = cursor.getColumnIndex(Phone.NUMBER);
String number = cursor.getString(column);
// Do something with the phone number...
}
}
}
</pre>
<p class="note"><strong>Observação:</strong> antes do Android 2.3 (API nível 9), executar uma consulta
no {@link android.provider.ContactsContract.Contacts Contacts Provider} (como mostrado
acima) exige que o aplicativo declare a permissão {@link
android.Manifest.permission#READ_CONTACTS} (consulte <a href="{@docRoot}guide/topics/security/security.html">Segurança e permissões</a>). Contudo,
iniciar com Android 2.3, o aplicativo Contatos/Pessoas dá ao aplicativo permissão
temporária para ler no Provedor de Contatos quando retornar um resultado. A permissão temporária
aplica-se apenas a pedidos de contato específicos, portanto, não é possível consultar um contato diferente daquele
especificado pelo {@link android.net.Uri} da intenção, a menos que você declare a permissão {@link
android.Manifest.permission#READ_CONTACTS}.</p>
|