Professional Documents
Culture Documents
4 (KitKat)
Liuri Loami Ruyz Jorge liuri.usp@gmail.com
2 de janeiro de 2014
SUMARIO
Sumario
1
Requisitos
Introduca o
2.1 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
4
5
5
6
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
6
6
7
7
8
9
9
10
11
12
13
Usando Intents
5.1 Usando o Intent com Activities . .
5.2 Intent - Exemplo 1 . . . . . . . . . .
5.3 Usando Intents para passar dados
5.4 Intent - Exemplo 2 . . . . . . . . . .
5.5 Abrindo outros aplicativos . . . . .
5.6 Intent - Exemplo 3 . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
14
14
14
16
17
19
19
Persistencia de dados
6.1 Usando o SharedPreferences
6.2 Persistencia - Exemplo 1 . .
6.3 Usando o SQLite . . . . . .
6.4 SQLite - Exemplo 1 . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
21
21
22
24
25
HTTP e JSON
7.1 HTTP . . . . . . . . . . . .
7.2 JSON . . . . . . . . . . . .
7.3 HTTP e JSON - Exemplo 1
7.4 HTTP e JSON - Exemplo 2
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
30
30
30
30
33
Threads e AsyncTasks
8.1 Threads e Handlers . . . . . . . .
8.2 Threads e Handlers - Exemplo 1 .
8.3 Threads e Handlers - Exemplo 2 .
8.4 AsyncTasks . . . . . . . . . . . .
8.5 AskyncTasks - Exemplo 1 . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
34
34
35
36
37
37
Services e BroadCastReceivers
9.1 Servicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.2 Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
9.3 Classe Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
39
39
40
40
.
.
.
.
SUMARIO
10 Notificacoes
10.1 Dialogs . . . . . . . . . . .
10.2 Dialogs - Exemplo 1 . . . .
10.3 Notifications . . . . . . . .
10.4 Notifications - Exemplo 1
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
42
42
42
45
45
11 Mapas e GPS
11.1 Utilizando o GPS . .
11.2 GPS - Exemplo 1 . . .
11.3 Usando o MapView .
11.4 MapView - Examplo
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
47
47
50
50
12 Multimedia
12.1 Reproduca o de Mdia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
12.2 Utilizando o MediaPlayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
53
53
53
.
.
.
.
.
.
.
.
.
.
.
.
INTRODUC
AO
Requisitos
Antes do incio dos estudos para desenvolvimento Android, e necessario que o estudante tenha uma base
solida
em Java e em XML.
Introduca o
Android e um sistema operacional (SO) baseado em Linux para dispositivos moveis;
ANDROID
PROJETO DE APLICAC
AO
2.1
Arquitetura
um arquivo, nomeDaActivity.java;
gen: Pasta onde ficam os arquivos gerados automaticamente pelo Eclipse. Nao deve ser feito
nenhum tipo de alteraca o manual dentro dessa pasta;
assets: Pasta onde ficam os arquivos de mdia usados pela aplicaca o. Pode ser quaisquer tipos como
vdeos, sons, imagens, etc;
bin: Pasta onde ficam os arquivos compilados pelo Eclipse. Em geral, nao deve se mexer nessa
pasta tambem;
res: Abreviaca o de resources, esta pasta e dividida em varias outras, com propositos
diferentes.
As pastas que comecam com o sufixo drawable sao destinadas a armazenar imagens que sao
usadas na aplicaca o, como cones, por exemplo;
A pasta layout se destina a armazenar os arquivos XML que representam o layout das telas da
aplicaca o;
A pasta values tambem se destina a armazenar XMLs que serao usados na aplicaca o.
AndroidManifest.xml: E o arquivo que guarda a configuraca o de um aplicativo Android.
3.1
4.1
Activities
4.2
Layouts em XML
As interfaces da aplicaca o sao definidas em arquivos XML que ficam na pasta res/layout. Todos os
arquivos de layout devem ficar nesta pasta, voce nao pode agrupa-los em outra pasta;
A ligaca o entre a interface em XML e seus elementos com o codigo
Java da activity e feita atraves
de um arquivo especial, com o nome apenas de R.java que fica na pasta gen. Esse arquivo e gerado
automaticamente, e voce nao deve fazer alteracoes
manuais nele. O nome R e como uma abreviaca o
para resources;
@Override
public void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState ) ;
setContentView ( R. layout .main ) ;
}
No exemplo acima, o metodo setContentView serve para definir qual sera o conteudo
da activity. Ao
Uma coisa em comum entre todos os elementos XML e que eles precisam obrigatoriamente dos atributos
layout width e layout height para indicar a largura e altura do elemento, respectivamente;
Em vez de valores absolutos (em pixels) e comum ver os valores match parent para indicar que deve
ter o mesmo tamanho do elemento que o contem ou wrap content para indicar que deve ter o mesmo
tamanho do conteudo
do elemento;
Entre os containers temos:
4.3
LinearLayout - Possui um atributo orientation que pode receber o valor vertical ou horizontal que
indica que os elementos filhos devem ser agrupados na vertical ou horizontal;
RelativeLayout - E um layout que permite posicionar os elementos filhos de maneira relativa, um
em relaca o ao outro;
FrameLayout - E um tipo de layout bem simples, que permite adicionar apenas um elemento. Se
adicionar mais elementos, eles irao ser desenhados sobre os outros, parcialmente ou totalmente;
TableLayout - Como o nome sugere, serve para criar tabelas. Voce deve adicionar elementos do
tipo TableRow, e nestes elementos adicionar as celulas que deseja mostrar.
Entre os diversos widgets temos:
TextView - Usado para mostrar textos na tela;
EditText - Usado para que o usuario digite alguma entrada;
Button - Usado para que o usuario execute acoes
atraves de cliques;
Checkbox - Usado para que o usuario marque opcoes;
RadioButton - O mesmo que acima, mas permite marcar apenas uma opca o;
Spinner - Usado para que o usuario selecione uma opca o (combo box).
ImageView - Usado para mostrar imagens na tela.
Liuri Loami Ruyz Jorge liuri.usp@gmail.com
4.4
Layouts - Exemplo 1
Crie um novo projeto com o nome testes1. O nome do pacote deve ser com.projeto3.android.testes1
(costuma-se usar o inverso do endereco do site mais alguns nomes na frente) e o nome da activity
MainLayout;
Na pasta res/layouts delete qualquer arquivo que existir e crie um arquivo chamado linear.xml com o
seguinte conteudo:
No incio de todos os arquivos xml deve haver essa primeira linha especificando a sua codificaca o
e a versao utilizada;
Deve-se respeitar os padroes
de identaca o para tabulaca o;
No exemplo apresentado, foram inseridos os widgets de tipo TextView, EditText e Button dentro de um container do tipo LinearLayout, onde todos os elementos sao inseridos em sequencia
verticalmente;
O atributo android:text define o texto a ser mostrado;
O atributo android:orientation serve para definir a orientaca o (vertical ou horizontal) do container
(layout) LinearLayout;
O atributo xmlns e utilizado para definir algum namespace no arquivo. Usado, nesse caso, para
obter os tipos de containers e widgets disponveis para Android juntamente com os seus atributos.
A seguir, edite o arquivo MainActivity.java para que ele fique com o seguinte conteudo:
Apos
isso, rode e teste a aplicaca o.
4.5
Layouts - Exemplo 2
<EditText
android:layout_width =" match_parent "
android:layout_height =" wrap_content " />
<Button
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:text =" @string / see_message " />
O arquivo strings.xml armazena textos (strings) que sao utilizadas pela aplicaca o;
Nao e recomendavel que os textos a serem mostrados na tela fiquem em outros arquivos;
Para utilizar essas strings armazenadas deve-se utilizar @string/nomeDaString;
Alem das strings utilizadas, o arquivo deve conter uma string chamada app name contendo o nome
do aplicativo.
4.6
Layouts - Exemplo 3
Agora crie um novo arquivo de layout chamado relative.xml com o seguinte conteudo:
android:inputType ="text"
android:layout_toRightOf ="@id/ name_label_text " />
<Button
android:id ="@+id/ see_message_buttom "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:layout_alignParentRight ="true"
android:layout_below ="@id/ name_edit_text "
android:text =" @string / see_message " />
</ RelativeLayout >
4.7
Layouts - Exemplo 4
10
Por isso, torna-se difcil a inserca o de mais do que um elemento dentro desse tipo de container sem
que eles se sobreponham;
O atributo android:textStyle e utilizado para tornar um texto negrito (bold) e/ou italico (italic);
Para um texto negrito e italico usa-se como valor para esse atributo: bold | italic (sem aspas);
O atributo android:textSize especifica o tamanho da fonte. Sendo que o valor pode ser especificado
usando as mais diferentes unidades existentes (cm, px, dp, ..)
O atributo android:src usado no widget de tipo ImageView (para a visualizaca o da imagem) deve
conter o nome da imagem png na forma @drawable/nomeDaImagem.
Acrescente a seguinte linha ao arquivo strings.xml:
<string name=" image_label ">Teste com Imagem </ string >
Execute o projeto.
4.8
Layouts - Exemplo 5
11
de colunas ocupadas por um elemento deve ser especificado com o atributo android:layout column;
O atributo android:padding especifica o espacamento do elemento entre o restante da tela.
Edite o arquivo MainActivity.java para utilizar o layout recem-criado e teste a aplicaca o.
4.9
Listeners de Eventos
Sempre deve-se fazer um cast para o elemento que queremos, pois o metodo retorna objetos do tipo
View;
O parametro recebido se refere ao id que foi dado ao elemento no XML. (Lembre-se que o arquivo R.java
faz a ligaca o entre o XML e o codigo
Java);
Entre os principais metodos que podem ser utilizados nesses listeners estao o getEditableText().getString()
(para obter o texto contido no elemento) ou setText(String str) (para alterar o texto do elemento);
Apos
a obtenca o do objeto, podemos adicionar listeners, como no exemplo abaixo:
Button button = ( Button ) findViewById (R.id. see_message_buttom );
button . setOnClickListener (new OnClickListener () {
@Override
public void onClick (View arg0) {
// Faz alguma coisa
}
});
Dessa maneira, sempre que o botao for clicado, o metodo onClick sera chamado;
Existem varios tipos de listeners, todos sempre comecando com o sufixo on indicando depois qual tipo de
evento eles estarao escutando.
12
4.10
Listeners - Exemplo
Crie um novo projeto Android, da mesma forma que o item anterior. Use como nome para o projeto
Testes1Parte2. O nome do pacote deve ser com.projeto3.android.testes1parte2 e o nome da activity deve
ser MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<LinearLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
android:layout_width =" match_parent "
android:layout_height =" match_parent "
android:orientation =" vertical ">
<TextView
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:text =" @string / name_label " />
<EditText
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:id ="@+id/ name_edit_text " />
<Button
android:id ="@+id/ see_message_buttom "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:text =" @string / see_message " />
<TextView
android:id ="@+id/ show_message_text "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:layout_gravity =" center "
android:layout_marginTop ="20 dp"
android:text =" @string / hello_message "
android:textSize ="24 dp"
android:textStyle ="bold"
android:visibility =" invisible " />
</ LinearLayout >
O atributo android:visibility e utilizado para se ocultar um elemento. Seus possveis valores sao
visible (visvel), invisible (invisvel, mas ocupando espaco no layout) e gone (invisvel, mas nao
ocupando espaco).
Edite o arquivo strings.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<resources >
<string name=" app_name ">Exemplo </ string >
<string name=" name_label ">Nome :</ string >
<string name=" see_message ">Ver mensagem </ string >
<string name=" hello_message ">Ol
a , %1$s!</ string >
</ resources >
O valor %1$s para strings e utilizado para realizar a sua substituica o por alguma outra no decorrer
da execuca o.
Edite o arquivo MainActivity.java:
package com. projeto3 . android . testes1parte2 ;
import android .app. Activity ;
import android .os. Bundle ;
13
USANDO INTENTS
@Override
public void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView (R. layout . linear );
final EditText nameEditText =
( EditText ) findViewById (R.id. name_edit_text );
Button seeMessageButton =
( Button ) findViewById (R.id. see_message_buttom );
final TextView showMessageText =
( TextView ) findViewById (R.id. show_message_text );
seeMessageButton . setOnClickListener (new View. OnClickListener () {
@Override
public void onClick (View view) {
String name = nameEditText . getEditableText (). toString ();
showMessageText . setText ( getString (R. string . hello_message , name ));
showMessageText . setVisibility (View. VISIBLE );
}
});
}
}
Usando Intents
Intents sao objetos responsaveis por passar informacoes,
5.1
Para iniciar uma nova Activity e necessario usar o metodo startActivity() presente no objeto Context, ou
na Activity;
Intent intent = new Intent (this , NewActivity .class );
startActivity ( intent );
5.2
Intent - Exemplo 1
Crie um novo projeto Android, da mesma forma que no captulo anterior. Use como nome para o
projeto Testes2. O nome do pacote deve ser com.projeto3.android.testes2 e o nome da activity deve ser
MainActivity;
Liuri Loami Ruyz Jorge liuri.usp@gmail.com
14
USANDO INTENTS
15
USANDO INTENTS
Crie uma nova classe chamada SecondActivity que herda Activity (para definir uma nova activity):
package com. projeto3 . android . testes2 ;
import android .app. Activity ;
import android .os. Bundle ;
import android . widget . EditText ;
public class SecondActivity extends Activity {
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView (R. layout . second );
}
}
Os nomes das activities devem ser adicionados no arquivo AndroidManifest.xml, para isso adicione a
seguinte tag dentro da tag application:
<activity android:name =". SecondActivity " />
Apos
isso, rode a aplicaca o e veja o resultado.
5.3
No exerccio anterior, foi instanciada uma nova Activity, mas nao foi passada nenhuma informaca o para
ela. Isso pode ser feito utilizando o metodo putExtra do Intent.
Intent intent = new Intent (this , NewActivity . class );
intent . putExtra (" curso ", " Android ");
intent . putExtra (" total ", 25);
Um Bundle e um mapeamento de varios valores de tipos diferentes atraves de strings como chaves.
16
USANDO INTENTS
5.4
Intent - Exemplo 2
17
USANDO INTENTS
Crie uma nova classe chamada ThirdActivity que herda Activity e possui o conteudo
abaixo:
18
USANDO INTENTS
Apos
isso rode a aplicaca o e faca alguns testes.
5.5
E possvel abrir outros aplicativos utilizando intents. Para isso, e necessario passar uma flag que chamamos de action;
Dependendo do tipo de action que passarmos, um novo aplicativo sera aberto para executar a aca o;
Este tipo de intent e chamado de implcito, porque nao e especificado qual a activity que sera aberta;
Apenas passamos uma aca o e o sistema decidira qual activity devera ser utilizada em cada caso.
5.6
Intent - Exemplo 3
Crie um novo projeto Android, da mesma forma que no captulo anterior. Use como nome para o projeto
Testes2Parte2. O nome do pacote deve ser com.projeto3.android.testes2parte2 e o nome da activity deve
ser MainActivity;
Na paste res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<LinearLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
xmlns:tools =" http: // schemas . android .com/ tools "
android:layout_width =" match_parent "
android:layout_height =" match_parent "
android:orientation =" vertical " >
<Button
android:id ="@+id/ view_site_button "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:text =" @string / view_site_label " />
<Button
android:id ="@+id/ send_email_button "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:text =" @string / send_email_label " />
<Button
android:id ="@+id/ make_call_button "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:text =" @string / make_call_label " />
</ LinearLayout >
19
USANDO INTENTS
20
PERSISTENCIA
DE DADOS
Apos
isso, adicione a seguinte linha dentro da tag <manifest> e fora da tag <application>, para permitir
que a aplicaca o realize chamadas:
<uses - permission android:name =" android . permission . CALL_PHONE " />
Persistencia de dados
A API do Android oferece diferentes opcoes
quando se trata de salvar dados para serem usados posteriormente;
Qual a opca o e mais apropriada depende do tipo de informaca o que sera salva e da disponibilidade que
queremos que ela tenha;
Existem 4 tipos de armazenamento possveis:
Shared Preferences:
E um tipo de armazenamento que utiliza chave/valor;
Indicado principalmente para configuracoes
e dados isolados;
SQLite:
Banco de dados privado que pode ser utilizado pelo seu aplicativo;
E o mais indicado quando temos varias informacoes
com a mesma estrutura, que podem ser
organizadas em tabelas e serem consultadas;
Internal Storage:
Armazena os dados na memoria
interna do aparelho;
Os dados armazenados sao privados da sua aplicaca o e nao podem ser acessados por outros
aplicativos ou pelo usuario;
External Storage:
Armazena em um SD, que pode ser externo ou interno do aparelho;
Os arquivos armazenados no SD sao visveis para todos;
O usuario pode alterar os arquivos quando conecta o USB a um computador.
6.1
Usando o SharedPreferences
Voce obtem o SharedPreferences chamando o metodo getSharedPreferences, passando para ele uma string,
que sera a chave para indicar o SharedPreferences da sua aplicaca o;
O modo indica a permissao do SharedPreferences. Se passar 0, indica modo privado;
Para ler os dados, e so chamar o metodo get correspondente ao tipo de informaca o desejada. O segundo
parametro do metodo e o valor a ser retornado se a chave nao for encontrada;
O SharedPreferences so armazena tipos primitivos e Strings;
O segundo parametro do metodo get indica o valor a ser retornado caso a chave nao seja encontrada;
Para salvar os dados no SharedPreferences e necessario usar um editor. Veja o exemplo abaixo:
21
PERSISTENCIA
DE DADOS
6.2
Persistencia - Exemplo 1
Crie um novo projeto Android. Use como o nome do projeto Testes3. O nome do pacote deve ser
com.projeto3.android.testes3 e o nome da activity deve ser MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<RelativeLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
xmlns:tools =" http: // schemas . android .com/ tools "
android:layout_width =" match_parent "
android:layout_height =" match_parent " >
<TextView
android:id ="@+id/ welcome_message "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:layout_centerHorizontal ="true"
android:layout_centerVertical ="true" />
<Button
android:id ="@+id/ add_name_button "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:layout_below ="@id/ welcome_message "
android:layout_centerHorizontal ="true" />
</ RelativeLayout >
22
PERSISTENCIA
DE DADOS
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView (R. layout .main );
}
@Override
protected void onResume () {
super . onResume ();
SharedPreferences prefs = getSharedPreferences (APP_PREFS , MODE_PRIVATE );
String username = prefs . getString ( USERNAME_KEY , null );
TextView message = ( TextView ) findViewById (R.id. welcome_message );
Button addNameButton = ( Button ) findViewById (R.id. add_name_button );
if ( username != null) {
message . setText ("Bem vindo , " + username + "!");
addNameButton . setText (" Trocar de Nome");
} else {
message . setText ("Voc
e n
a o cadastrou seu nome ..");
addNameButton . setText (" Adicionar nome");
}
addNameButton . setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
Intent intent = new Intent ( MainActivity .this , AddNameActivity . class );
startActivity ( intent );
}
});
}
}
O atributo android:inputType especifica qual o tipo de entrada que o campo de texto aceitara. O
valor textCapWords e um texto normal com a inicial de todas as palavras maiusculas.
Crie uma nova classe chamada AddNameActivity que herda Activity e possui o conteudo
abaixo:
23
PERSISTENCIA
DE DADOS
6.3
Usando o SQLite
O SQLite e um banco de dados bem simples que consome poucos recursos, bastante usado em dispositivos
embarcados;
Para utilizar o SQLite, e necessario que voce crie uma subclasse de SQLiteOpenHelper;
Em seguida e necessario sobrescrever os metodos OnCreate() e OnUpgrade();
O metodo OnCreate() e chamado quando ainda nao existe um banco de dados, nele voce deve incluir os
comandos para criar tabelas e inicializar qualquer tipo de dados, se preciso;
O metodo OnUpgrade() e chamado quando a versao da base de dados e alterada, e nele voce deve incluir
quaisquer comandos relacionados a` alteraca o do esquema, como alteracoes
em tabelas e colunas;
O SQLiteOpenHelper oferece dois metodos que serao muito usados, o getWritableDatabase() e getReadableDatabase();
Estes metodos retornam uma instancia de SQLiteDatabase, que e utilizada para fazer consultas aos
dados;
Liuri Loami Ruyz Jorge liuri.usp@gmail.com
24
PERSISTENCIA
DE DADOS
Os metodos que sao usados para as consultas aos dados sao insert(), update() e delete();
Tambem sao usados os metodos query() e rawQuery(). O primeiro oferece uma interface para criar
consultas, enquanto o segundo permite utilizar SQL diretamente;
O resultado de uma consulta e um objeto do tipo Cursor, que permite iterar sobre os dados.
6.4
SQLite - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes4. O nome do pacote deve ser
com.projeto3.android.testes4 e o nome da activity deve ser MainActivity;
Na pasta res/layouts crie um arquivo main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<LinearLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
android:layout_width =" match_parent "
android:layout_height =" match_parent "
android:orientation =" vertical ">
<ListView
android:id =" @android:id /list"
android:layout_width =" match_parent "
android:layout_height =" wrap_content " />
<TextView
android:id =" @android:id / empty "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:text =" @string / no_notes " />
</ LinearLayout >
25
PERSISTENCIA
DE DADOS
26
PERSISTENCIA
DE DADOS
Edite o arquivo res/menu/main.xml (ou crie um, se nao existir). Deixe-o com o conteudo
abaixo:
27
PERSISTENCIA
DE DADOS
28
PERSISTENCIA
DE DADOS
29
HTTP E JSON
HTTP e JSON
E muito comum um aplicativo fazer requisicoes
HTTP para fazer consultas a webservices;
Dessa forma, um aplicativo pode integrar ate diferentes servicos em uma unica
interface.
7.1
HTTP
7.2
JSON
para lidar com um objeto em JSON, enquanto a segunda e usada em arrays de objetos JSON.
JSONObject json = new JSONObject ( jsonString );
try {
String campo1 = json. getString (" campoObrigatorio ");
String campo2 = json. optString (" campoOpcional ", null );
JSONObject objeto = json. getJSONObject (" objetoAninhado ");
} catch ( JSONException e) {
e. printStackTrace ();
}
7.3
Crie um novo projeto Android. Use como nome para o projeto Testes5. O nome do pacote deve ser
com.projeto3.android.testes5, e o nome da activity deve ser MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml. Ele deve conter o seguinte conteudo:
30
HTTP E JSON
<TextView
android:id ="@+id/ name_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textSize ="20 dp"
android:textColor ="#064 E83"
android:paddingBottom ="8dp"
android:textStyle ="bold" />
<TextView
android:id ="@+id/ address_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor ="#6 C6C6C " />
<TextView
android:id ="@+id/ city_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor ="#6 C6C6C " />
<TextView
android:id ="@+id/ phone_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor ="#6 C6C6C " />
<TextView
android:id ="@+id/ likes_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor ="#6 C6C6C " />
</ LinearLayout >
java.io. BufferedReader ;
java.io. IOException ;
java.io. InputStream ;
java.io. InputStreamReader ;
java.net. HttpURLConnection ;
java.net.URL;
31
HTTP E JSON
32
HTTP E JSON
} catch ( IOException e) {
e. printStackTrace ();
}
}
}
return builder . toString ();
}
}
OBS: Se ocorrer algum erro com as linhas iniciadas por StrictMode.., a versao mnima do SDK devera
ser alterada para uma mais recente (mnimo SDK 9);
Adicione permissao para internet no AndroidManifest.xml adicionando a seguinte linha:
<uses - permission android:name =" android . permission . INTERNET "/>
7.4
33
THREADS E ASYNCTASKS
<TextView
android:id ="@+id/ city_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor =" @color /gray" />
<TextView
android:id ="@+id/ phone_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor =" @color /gray" />
<TextView
android:id ="@+id/ likes_label "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:textColor =" @color /gray" />
Threads e AsyncTasks
No Android, existe uma thread principal que e responsavel por desenhar a tela e lidar com os eventos
de toque na tela;
Esta thread e conhecida como UI thread (User Interface Thread), ou tambem como main thread;
Se o desenvolvedor nao utilizar nenhum tipo de concorrencia, todo o codigo
que escrever ira rodar nesta
thread principal;
Isso se torna um problema para tarefas que levam muito tempo a serem executadas, pois enquanto a
tarefa esta sendo executada, a interface para de responder a eventos, como toques feito pelo usuario;
Se houver qualquer processamento que ocupe a UI thread por mais de 5 segundos, a aplicaca o ira receber
automaticamente um ANR (Application not responding), e o sistema ira fechar a aplicaca o;
Por isso, qualquer processamento mais lento deve ser feito em outras threads para nao ocupar a UI thread.
8.1
Threads e Handlers
background;
Apenas a UI thread e que pode alterar a UI;
Para contornar esse problema podemos utilizar Handlers;
Um Handler e um objeto que possui o metodo post(Runnable). O Runnable que e passado ao metodo
post e executado posteriormente dentro da main thread e por isso pode realizar alteracoes
na interface
da aplicaca o;
Outra alternativa que nao envolve criar um Handler e utilizar o metodo runOnUiThread(Runnable), que
pertence a Activity. O Runnable que e passado a este metodo tambem e executado dentro da main thread.
34
THREADS E ASYNCTASKS
8.2
Crie um novo projeto Android. Use como nome para o projeto Testes6. O nome do pacote deve ser
com.projeto3.android.testes6 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<RelativeLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
android:layout_width =" match_parent "
android:layout_height =" match_parent " >
<ProgressBar
android:id ="@+id/ progress_bar "
style ="? android:attr / progressBarStyleHorizontal "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:layout_centerInParent ="true"
android:indeterminate =" false "
android:max ="10"
android:padding ="8dp" />
<Button
android:id ="@+id/ start_button "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:layout_below ="@id/ progress_bar "
android:layout_centerHorizontal ="true"
android:text =" @string / start " />
</ RelativeLayout >
35
THREADS E ASYNCTASKS
@Override
public void run () {
for (int i = 1; i <= 10; i++) {
final int value = i;
try {
Thread . sleep (1000);
} catch ( InterruptedException e) {
e. printStackTrace ();
}
handler .post(new Runnable () {
@Override
public void run () {
progress . setProgress ( value );
}
}
}
new Thread ( runnable ). start ();
}
});
}
}
Apos
isso rode a aplicaca o e veja o resultado.
8.3
36
THREADS E ASYNCTASKS
8.4
AsyncTasks
8.5
AskyncTasks - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes7. O nome do pacote deve ser
com.projeto3.android.testes7 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<LinearLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:orientation =" vertical " >
<Button
android:id ="@+id/ start_button "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:onClick =" downloadPicture "
android:text =" @string / start_image_download " />
<ImageView
android:id ="@+id/ image_view "
android:layout_width =" match_parent "
android:layout_height =" match_parent " />
</ LinearLayout >
37
THREADS E ASYNCTASKS
java.io. IOException ;
java.io. InputStream ;
java.net. HttpURLConnection ;
java.net. MalformedURLException ;
java.net.URL;
import
import
import
import
import
import
import
import
import
import
ProgressDialog dialog ;
Button startButton ;
ImageView imageView ;
DownloadImageTask task;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView (R. layout .main );
imageView = ( ImageView ) findViewById (R.id. image_view );
startButton = ( Button ) findViewById (R.id. start_button );
startButton . setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
dialog = ProgressDialog .show( MainActivity .this ,
getString (R. string . download ), getString (R. string . downloading ));
task = new DownloadImageTask ();
task. execute (" https :// www. google .com/ images /srpr/ logo11w .png");
}
});
}
@Override
protected void onDestroy () {
if ( dialog != null && dialog . isShowing ()) {
dialog . dismiss ();
dialog = null;
}
if (task != null) {
task. cancel (true );
}
super . onDestroy ();
}
private class DownloadImageTask extends AsyncTask <String , Void , Bitmap > {
@Override
protected Bitmap doInBackground ( String ... params ) {
try {
return downloadBitmap ( params [0]);
} catch( IOException e) {
e. printStackTrace ();
}
38
SERVICES E BROADCASTRECEIVERS
return null;
}
@Override
protected void onPreExecute () {
super. onPreExecute ();
dialog .show ();
}
@Override
protected void onPostExecute ( Bitmap result ) {
super. onPostExecute ( result );
dialog . dismiss ();
if ( result != null) {
imageView . setImageBitmap ( result );
}
}
private Bitmap downloadBitmap ( String url) throws IOException {
URL imageUrl = null;
try {
imageUrl = new URL(url );
} catch ( MalformedURLException e) {
e. printStackTrace ();
return null;
}
Bitmap bitmapImage = null;
try {
HttpURLConnection conn = ( HttpURLConnection ) imageUrl . openConnection ();
conn. setDoInput (true );
conn. connect ();
InputStream is = conn. getInputStream ();
bitmapImage = BitmapFactory . decodeStream (is );
} catch ( IOException e) {
e. printStackTrace ();
}
return bitmapImage ;
}
}
}
Services e BroadCastReceivers
9.1
Servicos
39
SERVICES E BROADCASTRECEIVERS
9.2
Manifest
9.3
Classe Service
Para criar um servico e preciso implementar uma extensao da classe Service e sobreescrever alguns
metodos de callback:
onStartCommand() - Metodo que inicia um servico indefinidamente. O servico apenas termina
quando o metodo stopSelf() e executado a partir do proprio
servico ou quando o metodo stopSer
vice() e executado a partir de outra aplicaca o;
onBind() - Metodo que e chamado pelo sistema para associar o servico a uma aplicaca o. Ele
deve prover uma interface de comunicaca o entre ambos. Este metodo deve ser implementado
obrigatoriamente, logo, se o servico nao for desenhado para suportar Bind entao o metodo onBind
deve devolver null;
onCreate() - Metodo chamado pelo sistema no momento da criaca o do servico e pode ser utilizado
para realizar pre configuracoes;
onDestroy() - Metodo chamado pelo sistema quando o servico for destruido e pode ser utilizado
para liberar recursos utilizados.
Abaixo temos uma implementaca o simples de um servico:
public class ExampleService extends Service {
@Override
public void onCreate () {
// Metodo executado no momento em que o servic
o
e criado
}
@Override
public int onStartCommand ( Intent intent , int flags , int startId ) {
// Execuc
a o do servic
o ;
return START_STICKY ;
}
@Override
public IBinder onBind ( Intent intent ) {
// Sem suporte a bindind
40
SERVICES E BROADCASTRECEIVERS
return null;
}
@Override
public void onDestroy () {
// Metodo executado no momento em que o servic
o
e destruido
}
}
O metodo onStartCommand() devolve um inteiro. Este valor indica como o sistema deve continuar o
servico caso o sitema o mate. Existem 3 valores possveis:
START NOT STICKY - Nao reinicia o servico a menos que hajam Intents a serem entregues;
START STICKY - Reinicia o servico, mas nao continua a partir do Intent que estava em execuca o
mas apenas para os que estavam pendentes;
START REDELIVER INTENT - Reinicia o servico retomando a partir do Intent que estava em
execuca o.
A thread que executa o servico e a thread principal da aplicaca o host;
Caso o servico ocupe muito processamento e preciso que o servico utilize uma nova thread evitando
assim travamentos na interface;
No exemplo abaixo, a classe do servico foi modificada para executar sua tarefa em uma thread separada.
public class ExampleService extends Service {
private Looper mServiceLooper ;
private ServiceHandler mServiceHandler ;
// Handler que executa de fato a tarefa do servic
o em uma thread separada
private final class ServiceHandler extends Handler {
public ServiceHandler ( Looper looper ) {
super( looper );
}
@Override
public void handleMessage ( Message msg) {
// Implementac
a o da tarefa do servic
o
..
// Parando explicitamente o servic
o
stopSelf (msg.arg1 );
}
}
@Override
public void onCreate () {
// Criando a thread respons
a vel pela execuc
a o da tarefa
HandlerThread thread = new HandlerThread (" ServiceStartArguments ", Process . THREAD_PRIORITY_BACKGROUND );
thread . start ();
// Obtendo o Looper da thread e passando como par
a metro para o Handler
mServiceLooper = thread . getLooper ();
mServiceHandler = new ServiceHandler ( mServiceLooper );
}
@Override
public int onStartCommand ( Intent intent , int flags , int startId ) {
Toast . makeText (this , " service starting ", Toast . LENGTH_SHORT ). show ();
// Para cada chamada ao servic
o enfileiramos uma tarefa no Handler
Message msg = mServiceHandler . obtainMessage ();
msg.arg1 = startId ;
mServiceHandler . sendMessage (msg );
41
10
NOTIFICAC
OES
// Se o servic
o morrer a partir deste ponto , reinicializar
return START_STICKY ;
}
@Override
public IBinder onBind ( Intent intent ) {
// Sem suporte a Binding
return null;
}
@Override
public void onDestroy () {
Toast . makeText (this , " service done", Toast . LENGTH_SHORT ). show ();
}
}
10
Notificacoes
10.1
Dialogs
10.2
Dialogs - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes8. O nome do pacote deve ser
com.projeto3.android.testes8 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<LinearLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
xmlns:tools =" http: // schemas . android .com/ tools "
android:layout_width =" match_parent "
android:layout_height =" match_parent "
android:orientation =" vertical " >
<Button
android:id ="@+id/ show_progress_dialog_button "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:padding ="5dp"
android:layout_margin ="8dp"
android:text =" @string / show_progress_dialog " />
<Button
android:id ="@+id/ show_alert_dialog_button "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
android:padding ="5dp"
android:layout_margin ="8dp"
android:text =" @string / show_alert_dialog " />
<Button
android:id ="@+id/ show_custom_dialog_button "
android:layout_width =" match_parent "
android:layout_height =" wrap_content "
42
10
NOTIFICAC
OES
android:padding ="5dp"
android:layout_margin ="8dp"
android:text =" @string / show_custom_dialog " />
</ LinearLayout >
43
10
NOTIFICAC
OES
@Override
public void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView (R. layout .main );
Button progressButton = ( Button ) findViewById (R.id. show_progress_dialog_button );
Button alertButton = ( Button ) findViewById (R.id. show_alert_dialog_button );
Button customButton = ( Button ) findViewById (R.id. show_custom_dialog_button );
progressButton . setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
DialogFragment dialog = ProgressDialogFragment . newInstance ();
dialog .show( getFragmentManager (), " progress ");
}
});
alertButton . setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
DialogFragment dialog = AlertDialogFragment . newInstance ();
dialog .show( getFragmentManager (), " alert ");
}
});
customButton . setOnClickListener (new OnClickListener () {
@Override
public void onClick (View v) {
DialogFragment dialog = CustomDialogFragment . newInstance ();
dialog .show( getFragmentManager (), " custom ");
}
});
}
public static class AlertDialogFragment extends DialogFragment {
public static AlertDialogFragment newInstance () {
AlertDialogFragment frag = new AlertDialogFragment ();
return frag;
}
@Override
public Dialog onCreateDialog ( Bundle savedInstanceState ) {
AlertDialog dialog = new AlertDialog . Builder ( getActivity ()). create ();
dialog . setTitle ( getActivity (). getString (R. string . attention ));
dialog . setMessage ( getActivity (). getString (R. string . which_button_gonna_press ));
dialog . setButtom ( DialogInterface . BUTTON_POSITIVE ,
getActivity (). getString (R. string .yes), new DialogInterface . OnClickListener () {
@Override
public void onClick ( DialogInterface dialog , int which ) {
Toast . makeText ( getActivity (), R. string . pressed_yes ,
Toast . LENGTH_SHORT ). show ();
}
});
dialog . setButtom ( DialogInterface . BUTTON_NEGATIVE ,
getActivity (). getString (R. string .no), new DialogInterface . OnClickListener () {
@Override
public void onClick ( DialogInterface dialog , int which ) {
Toast . makeText ( getActivity (), R. string . pressed_no ,
Toast . LENGTH_SHORT ). show ();
}
});
return dialog ;
}
}
public static class ProgressDialogFragment extends DialogFragment {
44
10
NOTIFICAC
OES
10.3
Notifications
Outro tipo de notificaca o e conhecido como Status Bar Notifications, que sao aqueles alertas que aparecem
na barra de status;
Existem diversos tipos de alertas que podem ser criados, mas em todos os casos deve-se utilizar a classe
NotificationManager para enviar as notificacoes
para o sistema;
Para construir uma notificaca o, e utilizado o Notification.Builder() que possui diferentes metodos que
customizam o conteudo
e a aparencia da notificaca o.
10.4
Notifications - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes9. O nome do pacote deve ser
com.projeto3.android.testes9 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
<?xml version ="1.0" encoding ="utf -8" ?>
<RelativeLayout xmlns:android =" http: // schemas . android .com/apk/res/ android "
android:layout_width =" match_parent "
android:layout_height =" match_parent " >
<Button
android:id ="@+id/ create_notification_button "
android:layout_width =" wrap_content "
android:layout_height =" wrap_content "
android:text =" @string / create_notification "
45
10
NOTIFICAC
OES
<resources >
<string name=" app_name ">Notificac
46
11
MAPAS E GPS
Apos
isso rode a aplicaca o e veja o resultado.
11
Mapas e GPS
Uma das vantagens para o desenvolvimento de aplicativos para dispositivos moveis
e a possibilidade de
11.1
Utilizando o GPS
11.2
GPS - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes10. O nome do pacote deve ser
com.projeto3.android.testes10 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
Liuri Loami Ruyz Jorge liuri.usp@gmail.com
47
11
MAPAS E GPS
48
11
MAPAS E GPS
<application
android:icon =" @drawable / ic_launcher "
android:label =" @string / app_name "
android:theme =" @style / AppTheme " >
<activity
android:name =". MainActivity
android:label =" @string / app_name " >
<intent -filter >
<action android:name =" android . intent . action .MAIN" />
<category android:name =" android . intent . category . LAUNCHER " />
</intent -filter >
</activity >
</ application >
</manifest >
<resources >
<string name=" app_name ">LocationApi </ string >
<string name=" point_label ">%.4f</ string >
<string name=" location_not_available ">Local n
a o dispon
vel </ string >
<string name=" latitude_label ">Latitude: </ string >
<string name=" longitude_label ">Longitude: </ string >
<string name=" unknown ">desconhecido </ string >
</ resources >
TextView latituteText ;
TextView longituteText ;
LocationManager locationManager ;
String provider ;
@Override
public void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView (R. layout .main );
latituteText = ( TextView ) findViewById (R.id. latitude_text );
longituteText = ( TextView ) findViewById (R.id. longitude_text );
locationManager = ( LocationManager ) getSystemService ( Context . LOCATION_SERVICE );
Criteria criteria = new Criteria ();
provider = locationManager . getBestProvider (criteria , false );
Location location = locationManager . getLastKnownLocation ( provider );
if ( location != null) {
Log.d(TAG , " Provider " + provider + " foi selecionado .");
onLocationChanged ( location )
} else {
latitudeText . setText (R. string . location_not_available );
49
11
MAPAS E GPS
11.3
Usando o MapView
Tambem e necessario ter uma chave cadastrada no Google Maps API, para que a aplicaca o possa ter
acesso ao Maps API do Google.
11.4
MapView - Examplo
Crie um novo projeto Android. Use como nome para o projeto Testes11. O nome do pacote deve ser
com.projeto3.android.testes11 e o nome da activity, MainActivity;
Edite o arquivo AndroidManifest.xml e deixe-o com o seguinte conteudo:
50
11
MAPAS E GPS
51
11
MAPAS E GPS
import
import
import
import
import
import
import
MapController mapController ;
MapView mapView ;
CustomItemizedOverlay itemizedOverlay ;
MyLocationOverlay myLocationOverlay ;
52
12
MULTIMEDIA
12
Multimedia
12.1
Reproduca o de Mdia
Caso o player precise manter a tela sem esmaecer ou manter o processador sem entrar em modo
de economia de energia, entao e preciso adicionar a seguinte permissao para que os metodos
MediaPlayer.setScreenOnWhilePlaying() ou MediaPlayer.setWakeMode() sejam executados:
<uses - permission android:name =" android . permission . WAKE_LOCK " />
12.2
Utilizando o MediaPlayer
53
12
MULTIMEDIA
No caso acima, como o arquivo contem som puro, nao existe a necessidade de nenhuma preparaca o
(decodificaca o) para ser reproduzido. Contudo, serao raras as vezes em que o arquivo de a udio nao
estara codificado;
Para reproduzir os tipos mais comuns de arquivos de a udio, procede-se conforme o exemplo abaixo:
// Localizac
a o do arquivo de m
dia
URI myUri = Uri. parse (" localizacaoAqui ");
// Criando um Player
MediaPlayer mediaPlayer = new MediaPlayer ();
um arquivo de m
// Definindo que o tipo de stream e
u sica
mediaPlayer . setAudioStreamType ( AudioManager . STREAM_MUSIC );
// Fazendo com que o player encontre o arquivo de entrada
mediaPlayer . setDataSource ( getApplicationContext (), myUri );
// Preparando a m
u sica para ser reproduzida
mediaPlayer . prepare ();
// Iniciando a reproduc
ao
mediaPlayer . start ();
54