android handbook
DESCRIPTION
Manual to beginners on Android Programming APITRANSCRIPT
-
Material para estudos e revisao: Android 4.4 (KitKat)
Liuri Loami Ruyz Jorge [email protected]
2 de janeiro de 2014
1
-
SUMARIO
Sumario
1 Requisitos 4
2 Introducao 42.1 Arquitetura . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
3 Projeto de Aplicacao Android 53.1 Principais Componentes do Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
4 Activities, Layouts, Widgets e Listeners 64.1 Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64.2 Layouts em XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74.4 Layouts - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84.5 Layouts - Exemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94.6 Layouts - Exemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 94.7 Layouts - Exemplo 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104.8 Layouts - Exemplo 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114.9 Listeners de Eventos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124.10 Listeners - Exemplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
5 Usando Intents 145.1 Usando o Intent com Activities . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.2 Intent - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145.3 Usando Intents para passar dados . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165.4 Intent - Exemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175.5 Abrindo outros aplicativos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195.6 Intent - Exemplo 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
6 Persistencia de dados 216.1 Usando o SharedPreferences . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216.2 Persistencia - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226.3 Usando o SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246.4 SQLite - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
7 HTTP e JSON 307.1 HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307.2 JSON . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307.3 HTTP e JSON - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 307.4 HTTP e JSON - Exemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 33
8 Threads e AsyncTasks 348.1 Threads e Handlers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348.2 Threads e Handlers - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 358.3 Threads e Handlers - Exemplo 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 368.4 AsyncTasks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 378.5 AskyncTasks - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 37
9 Services e BroadCastReceivers 399.1 Servicos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 399.2 Manifest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 409.3 Classe Service . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40
Liuri Loami Ruyz Jorge [email protected] 2
-
SUMARIO
10 Notificacoes 4210.1 Dialogs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4210.2 Dialogs - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4210.3 Notifications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4510.4 Notifications - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
11 Mapas e GPS 4711.1 Utilizando o GPS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4711.2 GPS - Exemplo 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4711.3 Usando o MapView . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5011.4 MapView - Examplo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
12 Multimedia 5312.1 Reproducao de Mdia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5312.2 Utilizando o MediaPlayer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Liuri Loami Ruyz Jorge [email protected] 3
-
2 INTRODUCAO
1 Requisitos
Antes do incio dos estudos para desenvolvimento Android, e necessario que o estudante tenha uma basesolida em Java e em XML.
2 Introducao
Android e um sistema operacional (SO) baseado em Linux para dispositivos moveis; Desenvolvido pela Open Handset Alliance, liderado pela Google;
A Open Handset Alliance sao as companhias que dao suporte direto a` plataforma Android;
Fabricantes de dispositivos: HTC, LG, Motorola, Sansung, ..;
Operadoras: Nextel, T-Mobile, Telefonica, Telecom Italia, ..;
Semicondutores: Broadcom, Intel, Nvidia, Synaptics, ..;
Software: Google, eBay, LivingImage, ..;
Atualmente na versao 4.4 (KitKat), lancada em Outubro de 2013; Google Play:
Loja da Google para distribuicao de aplicacoes, jogos, filmes, musicas e livros;
Anteriormente chamada Android Market;
Os produtos podem ser vendidos de graca ou a um custo;
Desde 2013, ha mais de 1 milhao de aplicacoes disponveis na loja, com mais de 50 bilhoes dedownloads.
Middleware ou mediador: Transporta informacoes e dados entre modulos de alto nvel com os de baixo nvel;
Seu objetivo e mascarar a heterogeneidade e fornecer um modelo de programacao mais produtivopara os programadores de aplicativos;
Sao sistemas de software que se executam entre as aplicacoes e os sistemas operacionais.
Desenvolvimento de aplicacoes para dispositivos Android e feito com a programacao em Java; Smartphone:
Smartphones sao uma evolucao dos celulares comuns;
Sao mais caros que os celulares, geralmente maiores em tamanho, com telas sensveis ao toque epossuem um sistema operacional complexo, como o Android, o iOS ou Windows Phone;
Em outras palavras, smartphones sao celulares com a complexidade tecnologica de computadores;
Possuem varias aplicacoes como navegadores web, GPS, Camera, telas de alta resolucao, entre outrascoisas;
Entre os SOs para Smartphones temos Symbian, Linux, Windows Mobile, Windows Phone, iOS,Blackberry OS;
Vantagens do uso do Android: Solucao para os diferentes tipos de hardware;
Redes abertas;
Possui codigo aberto.
Liuri Loami Ruyz Jorge [email protected] 4
-
3 PROJETO DE APLICACAO ANDROID
2.1 Arquitetura
Figura 1: Arquitetura do sistema Android.
3 Projeto de Aplicacao Android
Antes de tudo, deve-se: Instalar o ambiente de desenvolvimento Java (JDK) e Android (Android SDK);
Instalar a IDE Eclipse e o ADTPlugin (para a programacao Android dentro desse editor);
Criar uma maquina virtual Android (Android Virtual Device) atraves do Eclipse.
No momento da criacao de um novo projeto Android, entre outras etapas, devem ser realizadas duasescolhas:
Build SDK: Qual a versao padrao (mais recente) do Android a ser utilizada para o aplicativo;
Minimum Required SDK: Qual a mnima versao do Android que podera rodar o aplicativo.
As pastas sao organizadas da seguinte maneira: src: E a pasta onde fica o codigo fonte da nossa aplicacao. No nosso projeto, essa pasta so possui
um arquivo, nomeDaActivity.java;
gen: Pasta onde ficam os arquivos gerados automaticamente pelo Eclipse. Nao deve ser feitonenhum tipo de alteracao manual dentro dessa pasta;
assets: Pasta onde ficam os arquivos de mdia usados pela aplicacao. Pode ser quaisquer tipos comovdeos, sons, imagens, etc;
bin: Pasta onde ficam os arquivos compilados pelo Eclipse. Em geral, nao deve se mexer nessapasta tambem;
Liuri Loami Ruyz Jorge [email protected] 5
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
res: Abreviacao 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 saousadas na aplicacao, como cones, por exemplo; A pasta layout se destina a armazenar os arquivos XML que representam o layout das telas da
aplicacao; A pasta values tambem se destina a armazenar XMLs que serao usados na aplicacao.
AndroidManifest.xml: E o arquivo que guarda a configuracao de um aplicativo Android.
3.1 Principais Componentes do Framework
O framework do Android possui varios componentes. Os principais sao: Activities - E o componente que representa a tela, na qual o usuario interage com a aplicacao;
Services - E o componente responsavel por rodar tarefas em background. Em geral sao tarefas maislongas, rodadas em background para nao prejudicar a responsividade da aplicacao;
Broadcast receivers - E um componente responsavel por responder a eventos do sistema. Os eventospodem ser de variados tipos, por exemplo, uma localizacao foi encontrada pelo GPS, ou que a bateriaesta acabando, etc;
Intents - E o componente que inicia os demais (activities, services e receivers). A criacao de uma novaactivity ou service e realizada atraves dos intents;
Content providers - Componente responsavel por gerenciar dados da aplicacao. Caso voce queiracompartilhar os dados da sua aplicacao com outras, voce so consegue faze-lo atraves de um contentprovider. Porem, mesmo quando a informacao e usada somente na sua aplicacao e nao e compar-tilhada com as demais, e possvel usar um content provider para organizar a forma como os dadossao consultados.
4 Activities, Layouts, Widgets e Listeners
4.1 Activities
Activity e o componente responsavel por mostrar uma tela ao usuario; Sempre que voce quiser criar uma nova tela na aplicacao, devera criar uma classe que herda de Activity; Entre os principais metodos da activity estao os que sao responsaveis pelo seu ciclo de vida; O ciclo de vida de uma activity se refere a ordem em que os metodos sao chamados desde a sua criacao,
ate o seu final, quando a activity e destruda. Estes metodos sao:
onCreate - E chamado quando a activity e criada;
onStart - E chamado apos o onCreate, e antes da activity se tornar visvel para o usuario;
onResume - E chamado apos o onStart, quando a activity se torna visvel para o usuario;
onPause - E chamado apos o onResume, quando a activity esta para perder a visibilidade para outraactivity;
onStop - E chamado quando a activity nao esta mais visvel para o usuario;
onDestroy - E chamado quando a activity esta prestes a ser destruda.
Liuri Loami Ruyz Jorge [email protected] 6
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
4.2 Layouts em XML
As interfaces da aplicacao sao definidas em arquivos XML que ficam na pasta res/layout. Todos osarquivos de layout devem ficar nesta pasta, voce nao pode agrupa-los em outra pasta;
A ligacao entre a interface em XML e seus elementos com o codigo Java da activity e feita atravesde um arquivo especial, com o nome apenas de R.java que fica na pasta gen. Esse arquivo e geradoautomaticamente, e voce nao deve fazer alteracoes manuais nele. O nome R e como uma abreviacaopara 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. Aopassar como parametro R.layout.main estamos dizendo que o conteudo da activity esta definido noarquivo main.xml da pasta res/layout;
Existem dois tipos de elementos no XML de um layout, os containers e os widgets; Um container e um elemento que agrega varios outros elementos, sejam eles outros containers ou
widgets;
Widgets sao os elementos isolados, como textos, botoes, caixas de texto, etc; 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 deveter o mesmo tamanho do elemento que o contem ou wrap content para indicar que deve ter o mesmotamanho do conteudo do elemento;
Entre os containers temos:
4.3
LinearLayout - Possui um atributo orientation que pode receber o valor vertical ou horizontal queindica que os elementos filhos devem ser agrupados na vertical ou horizontal;
RelativeLayout - E um layout que permite posicionar os elementos filhos de maneira relativa, umem relacao ao outro;
FrameLayout - E um tipo de layout bem simples, que permite adicionar apenas um elemento. Seadicionar 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 dotipo 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 opcao;
Spinner - Usado para que o usuario selecione uma opcao (combo box).
ImageView - Usado para mostrar imagens na tela.
Liuri Loami Ruyz Jorge [email protected] 7
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
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 activityMainLayout;
Na pasta res/layouts delete qualquer arquivo que existir e crie um arquivo chamado linear.xml com oseguinte conteudo:
No incio de todos os arquivos xml deve haver essa primeira linha especificando a sua codificacaoe a versao utilizada;
Deve-se respeitar os padroes de identacao para tabulacao;
No exemplo apresentado, foram inseridos os widgets de tipo TextView, EditText e Button den-tro de um container do tipo LinearLayout, onde todos os elementos sao inseridos em sequenciaverticalmente;
O atributo android:text define o texto a ser mostrado;
O atributo android:orientation serve para definir a orientacao (vertical ou horizontal) do container(layout) LinearLayout;
O atributo xmlns e utilizado para definir algum namespace no arquivo. Usado, nesse caso, paraobter 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:package com.projeto3.android.testes1;
import android.app.Activity;import android.os.Bundle;
public class MainActivity extends Activity {@Override
public void onCreate (Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.linear);
}
}
Apos isso, rode e teste a aplicacao.
Liuri Loami Ruyz Jorge [email protected] 8
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
4.5 Layouts - Exemplo 2
Edite o arquivo linear.xml, deixando-o igual ao codigo abaixo:
Em seguida edite o arquivo strings.xml presente em res/values:
Exemplo
Nome :
Ver mensagem
O arquivo strings.xml armazena textos (strings) que sao utilizadas pela aplicacao;
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 nomedo aplicativo.
4.6 Layouts - Exemplo 3
Agora crie um novo arquivo de layout chamado relative.xml com o seguinte conteudo:
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
android:inputType="text"
android:layout_toRightOf="@id/name_label_text" />
O atributo android:id identifica um determinado widget da aplicacao por meio de um nome;
No momento da atribuicao de um novo id deve-se utilizar @+id/nomeDoID;
Para se referenciar um widget pelo seu id (ja existente), deve-se utilizar @id/nomeDoID;
No container RelativeLayout os widgets sao inseridos em posicoes relativas (e nao absolutas) emrelacao a outros widgets ja inseridos ou ao proprio container;
Edite novamente o arquivo MainActivity.java:package com.projeto3.android.testes1;
import android.app.Activity;import android.os.Bundle;
public class MainActivity extends Activity {@Override
public void onCreate (Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.relative); // Edite essa linha
}
}
Rode a aplicacao e veja o resultado.
4.7 Layouts - Exemplo 4
Salve uma imagem com o nome imagem.png na pasta res/drawable-hdpi Crie um novo arquivo de layout chamado frame.xml:
A disposicao de um elemento em um container de tipo RelativeLayout e realizada apenas atravesdo seu alinhamento com o mesmo (topo, esquerda, direita, base ou quinas);
Liuri Loami Ruyz Jorge [email protected] 10
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
Por isso, torna-se difcil a insercao de mais do que um elemento dentro desse tipo de container semque 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 visualizacao da imagem) deveconter o nome da imagem png na forma @drawable/nomeDaImagem.
Acrescente a seguinte linha ao arquivo strings.xml:Teste com Imagem
Edite o arquivo MainActivity.java:package com.projeto3.android.testes1;
import android.app.Activity;import android.os.Bundle;
public class MainActivity extends Activity {@Override
public void onCreate (Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.frame); // Edite essa linha
}
}
Execute o projeto.
4.8 Layouts - Exemplo 5
Crie um novo arquivo chamado table.xml com o seguinte conteudo:
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
android:textStyle="bold" />
No container de tipo TableLayout divide-se a tela em linhas e colunas;
O atributo do container android:stretchColumns com valores true/false especifica se as colunasdevem ou nao ocupar toda a largura da tela;
Linhas sao especificadas com as tags TableRow;
O numero 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 aplicacao.
4.9 Listeners de Eventos
Lidam com as interacoes do usuarios com a tela; Primeiramente, para utilizar um widget que foi definido no layout, devemos busca-lo e fazer referencia
no nosso codigo Java. Para isso, e utilizado o metodo findViewById:
Button button = (Button) findViewById(R.id.nomeBotao1);
TextView label = (TextView) findViewById(R.id.nomeLabel1);
Sempre deve-se fazer um cast para o elemento que queremos, pois o metodo retorna objetos do tipoView;
O parametro recebido se refere ao id que foi dado ao elemento no XML. (Lembre-se que o arquivo R.javafaz a ligacao 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 obtencao 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.
Liuri Loami Ruyz Jorge [email protected] 12
-
4 ACTIVITIES, LAYOUTS, WIDGETS E LISTENERS
4.10 Listeners - Exemplo
Crie um novo projeto Android, da mesma forma que o item anterior. Use como nome para o projetoTestes1Parte2. O nome do pacote deve ser com.projeto3.android.testes1parte2 e o nome da activity deveser MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
O atributo android:visibility e utilizado para se ocultar um elemento. Seus possveis valores saovisible (visvel), invisible (invisvel, mas ocupando espaco no layout) e gone (invisvel, mas naoocupando espaco).
Edite o arquivo strings.xml:
Exemplo
Nome :
Ver mensagem
Ola, %1$s!
O valor %1$s para strings e utilizado para realizar a sua substituicao por alguma outra no decorrerda execucao.
Edite o arquivo MainActivity.java:package com.projeto3.android.testes1parte2;
import android.app.Activity;import android.os.Bundle;
Liuri Loami Ruyz Jorge [email protected] 13
-
5 USANDO INTENTS
import android.view.View;import android.widget.*;
public class MainActivity extends Activity {
@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);
}
});
}
}
Rode a aplicacao e veja o resultado final.
5 Usando Intents
Intents sao objetos responsaveis por passar informacoes, como se fossem mensagens, para os principaiscomponentes da API do Android, como as Activities, Services e BroadCast Receivers;
Para que um destes componentes seja instanciado, e necessario que seja criado um Intent, mesmo quandonao temos nenhuma informacao para passar para o componente criado;
Quando usado em conjunto com Intent Filters podemos ate iniciar uma Activity de outros aplicativo, ouo inverso, deixar que um outro aplicativo inicie uma das nossas Activities.
5.1 Usando o Intent com Activities
Para iniciar uma nova Activity e necessario usar o metodo startActivity() presente no objeto Context, ouna Activity;
Intent intent = new Intent(this, NewActivity.class);startActivity(intent);
No exemplo acima, estamos iniciando uma Activity cujo nome e NewActivity; O primeiro parametro que passamos para o construtor do Intent e o contexto, no caso this se refere a`
propria Activity atual, que esta chamando a proxima.
5.2 Intent - Exemplo 1
Crie um novo projeto Android, da mesma forma que no captulo anterior. Use como nome para oprojeto Testes2. O nome do pacote deve ser com.projeto3.android.testes2 e o nome da activity deve serMainActivity;
Liuri Loami Ruyz Jorge [email protected] 14
-
5 USANDO INTENTS
Na paste res/layouts crie um arquivo chamado main.xml:
O arquivo res/values/strings.xml deve ficar com o seguinte conteudo:
Intents
Proxima tela
O arquivo MainActivity.java deve ficar como o abaixo:package com.projeto3.android.testes2;
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
Button button = (Button) findViewById(R.id.main_button);
button.setOnClickListener(new OnClickListener() {
public void onClick(View v) {Intent intent = new Intent(MainActivity.this, SecondActivity.class);startActivity(intent);
}
});
}
}
Crie um arquivo XML na pasta layouts chamado second.xml com o conteudo abaixo:
Liuri Loami Ruyz Jorge [email protected] 15
-
5 USANDO INTENTS
Adicione a seguinte linha no arquivo strings.xml:Nova tela
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 aseguinte tag dentro da tag application:
Apos isso, rode a aplicacao e veja o resultado.
5.3 Usando Intents para passar dados
No exerccio anterior, foi instanciada uma nova Activity, mas nao foi passada nenhuma informacao paraela. 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);
Este metodo tem overloading, logo podemos passar diferentes tipos; Podemos passar tipos primitivos e Strings; O primeiro parametro indica qual a chave que estamos usando para a informacao. O segundo e o valor
da informacao que estamos passando;
Do outro lado, na Activity que esta sendo criada, podemos obter os valores atraves do Bundle que podeser obtido a partir do metodo getExtras presente no Intent:
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.some_layout);
Bundle extras = getIntent().getExtras();
String curso = extras.getString("curso");
int total = extras.getInt("total");..
}
Um Bundle e um mapeamento de varios valores de tipos diferentes atraves de strings como chaves.
Liuri Loami Ruyz Jorge [email protected] 16
-
5 USANDO INTENTS
5.4 Intent - Exemplo 2
Edite o arquivo second.xml para:
O arquivo res/values/strings.xml devera ficar com o seguinte conteudo:
Intents
Proxima tela
Nome
Idade
Nome: %1s
Idade: %1s
A seguir, edite o arquivo SecondActivity.java:package com.projeto3.android.testes2;
import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;
public class SecondActivity extends Activity {
@Override
Liuri Loami Ruyz Jorge [email protected] 17
-
5 USANDO INTENTS
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.second);
final EditText nameEditText =(EditText) findViewById(R.id.name_edit_text);
final EditText ageEditText =(EditText) findViewById(R.id.age_edit_text);
Button button = (Button) findViewById(R.id.next_button);
button.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {String name = nameEditText.getEditableText().toString();
String age = ageEditText.getEditableText().toString();
Intent intent =
new Intent(SecondActivity.this, ThirdActivity.class);
intent.putExtra("name", name);
intent.putExtra("age", age);
startActivity(intent);
}
});
}
}
Crie um novo arquivo XML na pasta de layouts chamado third.xml:
Adicione a seguinte entrada no arquivo strings.xml:Nova tela
Crie uma nova classe chamada ThirdActivity que herda Activity e possui o conteudo abaixo:package com.projeto3.android.testes2;
import android.app.Activity;import android.os.Bundle;import android.widget.TextView;
public class ThirdActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.third);
Liuri Loami Ruyz Jorge [email protected] 18
-
5 USANDO INTENTS
Bundle extras = getIntent().getExtras();
String name = extras.getString("name");
String age = extras.getString("age");
TextView nameTextEdit = (TextView) findViewById(R.id.name);
TextView ageTextEdit = (TextView) findViewById(R.id.age);
nameTextEdit.setText(getString(R.string.user_name , name));
ageTextEdit.setText(getString(R.string.user_age, age));
}
}
Adicione a nova activity no AndroidManifest.xml:
Apos isso rode a aplicacao e faca alguns testes.
5.5 Abrindo outros aplicativos
E possvel abrir outros aplicativos utilizando intents. Para isso, e necessario passar uma flag que chama-mos de action;
Dependendo do tipo de action que passarmos, um novo aplicativo sera aberto para executar a acao; Este tipo de intent e chamado de implcito, porque nao e especificado qual a activity que sera aberta; Apenas passamos uma acao 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 projetoTestes2Parte2. O nome do pacote deve ser com.projeto3.android.testes2parte2 e o nome da activity deveser MainActivity;
Na paste res/layouts crie um arquivo chamado main.xml:
Liuri Loami Ruyz Jorge [email protected] 19
-
5 USANDO INTENTS
O arquivo strings.xml devera ficar como o abaixo:
Intents
MainActivity
Ver site
Enviar email
Fazer ligacao
A seguir, edite o arquivo MainActivity.java:package com.projeto3.android.testes2;
import android.app.Activity;import android.os.Bundle;import android.net.Uri;import android.content.Intent;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main2);
Button viewSiteButton = (Button) findViewById(R.id.view_site_button);
Button sendEmailButton = (Button) findViewById(R.id.send_email_button);
Button makeCallButton = (Button) findViewById(R.id.make_call_button);
viewSiteButton.setOnClickListener(new OnClickListener() {
@Override
void onCreate (View v) {Intent intent =
new Intent(Intent.ACTION_VIEW , Uri.parse("http://projeto3.com");startActivity(intent);
}
});
sendEmailButton.setOnClickListener(new OnClickListener() {
@Override
void onCreate (View v) {Intent intent = new Intent(Intent.ACTION_SEND);intent.setType("plain/text");
intent.putExtra(Intent.EXTRA_EMAIL ,
new String[] {"[email protected]"});
startActivity(Intent.createChooser(intent, "Enviar email"));
}
});
makeCallButton.setOnClickListener(new OnClickListener() {
@Override
void onCreate (View v) {Intent intent = new Intent(Intent.ACTION_DIAL ,
Uri.parse("tel:1234-5678");
startActivity(intent);
}
});
}
}
Liuri Loami Ruyz Jorge [email protected] 20
-
6 PERSISTENCIA DE DADOS
Apos isso, adicione a seguinte linha dentro da tag e fora da tag , para permitirque a aplicacao realize chamadas:
6 Persistencia de dados
A API do Android oferece diferentes opcoes quando se trata de salvar dados para serem usados posteri-ormente;
Qual a opcao e mais apropriada depende do tipo de informacao que sera salva e da disponibilidade quequeremos 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 aplicacao 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
Abaixo esta um exemplo de como utilizar o SharedPreferences para ler informacoes:SharedPreferences prefs = getSharedPreferences(nome, modo);
String algumaString = prefs.getString(chave, null);int algumInt = prefs.getInt(outraChave , 0);
Voce obtem o SharedPreferences chamando o metodo getSharedPreferences, passando para ele uma string,que sera a chave para indicar o SharedPreferences da sua aplicacao;
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 informacao 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:
Liuri Loami Ruyz Jorge [email protected] 21
-
6 PERSISTENCIA DE DADOS
SharedPreferences prefs = getSharedPreferences(nome, modo);
Editor editor = prefis.edit;
editor.putString("curso","Android");
editor.commit();
Obtemos o editor chamando o metodo edit(); Adicionamos informacoes chamando o metodo put() correspondente ao tipo que estamos armazenando; E necessario chamar o metodo commit() no final, senao as alteracoes nao serao salvas.
6.2 Persistencia - Exemplo 1
Crie um novo projeto Android. Use como o nome do projeto Testes3. O nome do pacote deve sercom.projeto3.android.testes3 e o nome da activity deve ser MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
Edite o arquivo /res/values/strings.xml:
SharedPrefs
-
6 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("Voce nao 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);
}
});
}
}
Crie um novo arquivo na pasta layouts chamado add name.xml:
O atributo android:inputType especifica qual o tipo de entrada que o campo de texto aceitara. Ovalor 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:
Liuri Loami Ruyz Jorge [email protected] 23
-
6 PERSISTENCIA DE DADOS
package com.projeto3.android.testes3;
import android.app.Activity;import android.os.Bundle;import android.content.SharedPreferences;import android.content.SharedPreferences.Editor;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;
public class AddNameActivity extends Activity {
private SharedPreferences prefs;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.add_name);
prefs = getSharedPreferences(MainActivity.APP_PREFS , MODE_PRIVATE);
final EditText name = (EditText) findViewById(R.id.name_edit_text);Button saveButton = (Button) findViewById(R.id.add_name_button);
saveButton.setOnClickListener(new OnClickListener () {
@Override
public void onClick(View v) {String username = name.getEditableText().toString();
Editor editor = prefs.editor();
editor.putString(MainActivity.USERNAME_KEY , username);
editor.commit();
finish();
}
});
}
}
O metodo finish() encerra a Activity.
Adicione as activities no AndroidManifest e teste a aplicacao. PAREI DE CORRIGIR AQUI!!
6.3 Usando o SQLite
O SQLite e um banco de dados bem simples que consome poucos recursos, bastante usado em dispositivosembarcados;
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 incluirquaisquer comandos relacionados a` alteracao do esquema, como alteracoes em tabelas e colunas;
O SQLiteOpenHelper oferece dois metodos que serao muito usados, o getWritableDatabase() e getRea-dableDatabase();
Estes metodos retornam uma instancia de SQLiteDatabase, que e utilizada para fazer consultas aosdados;
Liuri Loami Ruyz Jorge [email protected] 24
-
6 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 sercom.projeto3.android.testes4 e o nome da activity deve ser MainActivity;
Na pasta res/layouts crie um arquivo main.xml:
O arquivo res/values/strings.xml deve ficar igual ao abaixo:
SQLite
MainActivity
Adicionar
Nenhuma anotacao
Escreva uma anotacao
Salvar
Crie uma nova classe chamada CustomSQLiteOpenHelper com o seguinte conteudo:package com.projeto3.android.testes4;
import android.content.Context;import android.database.sqlite.SQLiteDatabase;import android.database.sqlite.SQLiteOpenHelper;
public class CustomSQLiteOpenHelper extends SQLiteOpenHelper {
public static final String TABLE_NOTES = "notes";public static final String COLUMN_ID = "_id";public static final String COLUMN_NOTES = "_note";
private static final String DATABASE_NAME = "notes.db";private static final int DATABASE_VERSION = 1;
//Database creation sql statementprivate static final String DATABASE_CREATE =
"create table " + TABLE_NOTES + "(" + COLUMN_ID
+ " integer primary key autoincrement , "
Liuri Loami Ruyz Jorge [email protected] 25
-
6 PERSISTENCIA DE DADOS
+ COLUMN_NOTES + " text not null);";
public CustomSQLiteOpenHelper(Context context) {super(context, DATABASE_NAME , null, DATABASE_VERSION);
}
@Override
public void onCreate(SQLiteDatabase database) {database.execSQL(DATABASE_CREATE);
}
@Override
public void onUpgrade(SQLiteDatabase database,int oldVersion , int newVersion) {
database.execSQL("DROP TABLE IF EXISTS " + TABLE_NOTES);
onCreate(database);
}
}
Crie uma classe Note com o seguinte conteudo:package com.projeto3.android.testes4;
public class Note {
private long id;private String note;
@Override
public String toString() {return note;
}
public long getId() {return id;
}
public void setId(long id) {this.id = id;
}
public String getNote() {return note;
}
public void setNote(String note) {this.note = note;
}
}
Crie uma classe chamada NotesDao com o seguinte conteudo:package com.projeto3.android.testes4;
import java.util.ArrayList;import java.util.List;
import android.content.ContentValues;import android.content.Context;import android.database.Cursor;import android.database.SQLException;import android.database.sqlite.SQLiteDatabase;
public class NotesDao {
private SQLiteDatabase database;private String[] columns = { CustomSQLiteOpenHelper.COLUMN_ID ,
CustomSQLiteOpenHelper.COLUMN_NOTES };
Liuri Loami Ruyz Jorge [email protected] 26
-
6 PERSISTENCIA DE DADOS
private CustomSQLiteOpenHelper sqliteOpenHelper;
public NotesDao(Context context) {sqliteOpenHelper = new CustomSQLiteOpenHelper(context);
}
public void open() throws SQLException {database = sqliteOpenHelper.getWritableDatabase();
}
public void close() {sqliteOpenHelper.close();
}
public Note create(String note) {ContentValues values = new ContentValues();values.put(CustomSQLiteOpenHelper.COLUMN_NOTES , note);
long insertId = database.insert(CustomSQLiteOpenHelper.TABLE_NOTES ,null, values);
Cursor cursor = database.query(CustomSQLiteOpenHelper.TABLE_NOTES ,
columns, CustomSQLiteOpenHelper.COLUMN_ID
+ " = " + insertId, null, null, null, null);
cursor.moveToFirst();
Note newNote = new Note();newNote.setId(cursor.getLong(0));
newNote.setNote(cursor.getString(1));
cursor.close();
return newNote;}
public void delete(Note note) {long id = note.getId();database.delete(CustomSQLiteOpenHelper.TABLE_NOTES ,
CustomSQLiteOpenHelper.COLUMN_ID + " = " + id, null);}
public List getAll() {List notes = new ArrayList ();
Cursor cursor = database.query(CustomSQLiteOpenHelper.TABLE_NOTES ,
columns, null, null, null, null, null);
cursor.moveToFirst();
while(!cursor.isAfterLast()) {Note note = new Note();note.setId(cursor.getLong(0));
note.setNote(cursor.getString(1));
notes.add(note);
cursor.moveToNext();
}
cursor.close();
return notes;}
}
Edite o arquivo res/menu/main.xml (ou crie um, se nao existir). Deixe-o com o conteudo abaixo:
A seguir edite o conteudo do arquivo MainActivity.java:
Liuri Loami Ruyz Jorge [email protected] 27
-
6 PERSISTENCIA DE DADOS
package com.projeto3.android.testes4;
import java.util.List;
import android.app.ListActivity;import android.content.Intent;import android.os.Bundle;import android.view.Menu;import android.view.MenuItem;import android.widget.ArrayAdapter;
public class MainActivity extends ListActivity {
private NotesDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
dao = new NotesDao(this);dao.open();
}
@Override
protected void onResume() {dao.open();
super.onResume();List notes = dao.getAll();
ArrayAdapter adapter =
new ArrayAdapter (this,android.R.layout.simple_list_item_1 , notes);
setListAdapter(adapter);
}
@Override
protected void onPause() {dao.close();
super.onPause();}
@Override
public boolean onCreateOptionsMenu(Menu menu) {getMenuInflater().inflate(R.menu.main, menu);
return true;}
@Override
public boolean onOptionsItemSelected(MenuItem item) {if (item.getItemId() == R.id.add_note) {
Intent intent = new Intent(this, AddNoteActivity.class);startActivity(intent);
}
return super.onOptionsItemSelected(item);}
}
Crie um novo arquivo na pasta layouts chamado add note.xml:
-
6 PERSISTENCIA DE DADOS
android:layout_height="wrap_content"
android:inputType="textMultiLine"
android:hint="@string/write_a_note" />
Crie uma nova classe chamada AddNoteActivity:package com.projeto3.android.testes4;
import android.app.Activity;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.EditText;
public class AddNoteActivity extends Activity {
private NotesDao dao;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.add_note);
dao = new NotesDao(this);dao.open();
Button saveButton = (Button) findViewById(R.id.save_note_button);
final EditText noteText = (EditText) findViewById(R.id.note_text);
saveButton.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {String note = noteText.getEditableText().toString();
dao.create(note);
finish();
}
});
}
@Override
protected void onResume() {dao.open();
super.onResume();}
@Override
protected void onPause() {dao.close();
super.onPause();}
}
Lembre-se de adicionar os nomes as activities no AndroidManifest.xml; Rode a aplicacao e veja os resultados.
Liuri Loami Ruyz Jorge [email protected] 29
-
7 HTTP E JSON
7 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
Para fazer requisicoes HTTP, a API do Android oferece duas alternativas (ambas nao mais recomenda-das):
A primeira e utilizando a classe DefaultHttpClient, do projeto Apache;
Tambem existe a classe AndroidHttpClient que e um subtipo do DefaultHttpClient ja configuradopara valores otimizados no Android.
O metodo recomendado e utilizar a classe HttpURLConnection, que e desenvolvido e suportado peloGoogle.URL url = new URL("http://www.android.com/"); //Exemplo de URL para ser acessadaHttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
try {InputStream in = new BufferedInputStream(urlConnection.getInputStream());//Leitura dos dados aqui..
} finally {urlConnection.disconnect();
}
7.2 JSON
JSON ganhou muita forca nos ultimos anos como o formato mais utilizado no retorno de webservices,devido a sua simplicidade em comparacao com XML;
O Android possui bibliotecas padrao para lidar com JSON; Existem duas classes que sao utilizadas com este proposito, JSONObject e JSONArray. A primeira serve
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 HTTP e JSON - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes5. O nome do pacote deve sercom.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:
Liuri Loami Ruyz Jorge [email protected] 30
-
7 HTTP E JSON
O arquivo res/values/strings.xml devera ficar igual ao abaixo:
HttpAndJson
HttpAndJson
Telefone: %1$s
Telefone: %1$s
Telefone: %1$s
Telefone: %1$s
Telefone: %1$s
Crie uma classe chamada MainActivity:package com.projeto3.android.testes5;
import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.net.HttpURLConnection;import java.net.URL;
import org.json.JSONException;import org.json.JSONObject;
import android.app.Activity;import android.os.Bundle;import android.os.StrictMode;import android.view.Menu;import android.widget.TextView;
Liuri Loami Ruyz Jorge [email protected] 31
-
7 HTTP E JSON
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
TextView nameText = (TextView) findViewById(R.id.name_label);
TextView phoneText = (TextView) findViewById(R.id.phone_label);
TextView addressText = (TextView) findViewById(R.id.address_label);
TextView cityText = (TextView) findViewById(R.id.city_label);
TextView likesText = (TextView) findViewById(R.id.likes_label);
StrictMode.ThreadPolicy policy = new StrictMode.ThreadPolicy.Builder().permitAll().build();
StrictMode.setThreadPolicy(policy);
String response = makeRequest("http://graph.facebook.com/vovozuzu");
try {JSONObject json = new JSONObject(response);String name = json.getString("name");
String phone = json.getString("phone");
int likes = json.getInt("likes");String address = json.getJSONObject("location").getString("street");
String city = json.getJSONObject("location").getString("city");
nameText.setText(name);
phoneText.setText(getString(R.string.phone_label , phone));
addressText.setText(getString(R.string.address_label , address));
cityText.setText(getString(R.string.city_label , city));
likesText.setText(getString(R.string.likes_label , likes));
} catch (JSONException e) {e.printStackTrace();
}
}
private String makeRequest(String urlAddress) {HttpURLConnection con = null;URL url = null;String response = null;try {
url = new URL(urlAddress);con = (HttpURLConnection) url.openConnection();
response = readStream(con.getInputStream());
} catch (Exception e) {e.printStackTrace();
} finally {con.disconnect();
}
return response;}
private String readStream(InputStream in) {BufferedReader reader = null;StringBuilder builder = new StringBuilder();try {
reader = new BufferedReader(new InputStreamReader(in));String line = null;while ((line = reader.readLine()) != null) {
builder.append(line + "\n");
}
} catch (IOException e) {e.printStackTrace();
} finally {if (reader != null) {
try {reader.close();
Liuri Loami Ruyz Jorge [email protected] 32
-
7 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 deveraser alterada para uma mais recente (mnimo SDK 9);
Adicione permissao para internet no AndroidManifest.xml adicionando a seguinte linha:
Rode a aplicacao e veja o resultado.
7.4 HTTP e JSON - Exemplo 2
Ainda utilizando o projeto anterior.. Na pasta res/values crie um arquivo chamado colors.xml:
#FFCCCC
#064E83
#6C6C6C
Na pasta res/values crie um arquivo chamado dimens.xml:
8dp
8dp
16dp
20dp
Edite novamente o arquivo main.xml nas linhas marcadas abaixo:
android:paddingButtom="@dimen/padding_medium" android:textStyle="bold" />
Liuri Loami Ruyz Jorge [email protected] 33
-
8 THREADS E ASYNCTASKS
Rode a aplicacao. O resultado devera ser o mesmo.
8 Threads e AsyncTasks
No Android, existe uma thread principal que e responsavel por desenhar a tela e lidar com os eventosde 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 atarefa 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 aplicacao ira receberautomaticamente um ANR (Application not responding), e o sistema ira fechar a aplicacao;
Por isso, qualquer processamento mais lento deve ser feito em outras threads para nao ocupar a UI thread.
8.1 Threads e Handlers
No Android e suportado o mesmo tipo de concorrencia dos demais aplicativos Java; Podemos utilizar threads, que executam objetos do tipo Runnable; O unico porem, e que nao podemos alterar nada relativo a UI dentro destas threads que rodam embackground;
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 interfaceda aplicacao;
Outra alternativa que nao envolve criar um Handler e utilizar o metodo runOnUiThread(Runnable), quepertence a Activity. O Runnable que e passado a este metodo tambem e executado dentro da main thread.
Liuri Loami Ruyz Jorge [email protected] 34
-
8 THREADS E ASYNCTASKS
8.2 Threads e Handlers - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes6. O nome do pacote deve sercom.projeto3.android.testes6 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
Edite o arquivo res/values/strings.xml:
Threads
MainActivity
Iniciar
Edite o arquivo MainActivity.java:package com.projeto3.android.testes6;
import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ProgressBar;
public class MainActivity extends Activity {private Handler handler;private ProgressBar progress;private Button button;
@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
progress = (ProgressBar) findViewById (R.id.progress_bar);
startButton = (Button) findViewById (R.id.start_button);
handler = new Handler;
startButton.setOnClickListener(new OnClickListener() {Runnable runnable = new Runnable() {
Liuri Loami Ruyz Jorge [email protected] 35
-
8 THREADS E ASYNCTASKS
@Override
public void run() {for (int i = 1; i
-
8 THREADS E ASYNCTASKS
public void run() {progress.setProgress(value);
}
});
}
}
};
new Thread(runnable).start();}
});
}
}
8.4 AsyncTasks
Outra alternativa para utilizar concorrencia no Android e utilizar AsyncTasks; Um AsyncTask e um objeto que encapsula em uma interface simples o uso de threads; Uma AsyncTask deve implementar obrigatoriamente o metodo doInBackground(), que exatamente a
tarefa que esta sendo executada em background;
Caso seja necessario alguma atualizacao na interface, e so sobrescrever o metodo onPostExecute(). Tudoque estiver dentro deste metodo e executado na UI thread;
Outro metodo interessante que pode ser sobrescrito e o metodo onPreExecute() que e executado antesdo doInBackground() e que tambem e executado na UI thread.
8.5 AskyncTasks - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes7. O nome do pacote deve sercom.projeto3.android.testes7 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
Edite o arquivo res/values/strings.xml:
AskyncTasks
MainActivity
Iniciar download da imagem
Download
downloading
Liuri Loami Ruyz Jorge [email protected] 37
-
8 THREADS E ASYNCTASKS
Edite o arquivo MainActivity.java:package com.projeto3.android.testes7;
import java.io.IOException;import java.io.InputStream;import java.net.HttpURLConnection;import java.net.MalformedURLException;import java.net.URL;
import android.app.Activity;import android.app.ProgressDialog;import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.os.AsyncTask;import android.os.Bundle;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.ImageView;
public class MainActivity extends Activity {
private ProgressDialog dialog;private Button startButton;private ImageView imageView;private 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 {
@Override
protected Bitmap doInBackground(String... params) {try {
return downloadBitmap(params[0]);} catch(IOException e) {
e.printStackTrace();
}
Liuri Loami Ruyz Jorge [email protected] 38
-
9 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;}
}
}
Adicione permissao para internet no AndroidManifest.xml adicionando a seguinte linha:
Rode a aplicacao e veja o resultado.
9 Services e BroadCastReceivers
9.1 Servicos
Servicos sao aplicacoes que executam, em geral, processos longos em background desprovidos deinterface;
Uma aplicacao, por exemplo, pode requisitar a um servico para fazer um download ou mesmo executaruma musica enquanto o usuario interage com a interface ou mesmo sai da aplicacao host;
A aplicacao e o Servico podem ainda se comunicar entre si; Por padrao, um servico sempre e executado na Thread principal da aplicacao host; Porem, isto pode ser configurado para que o servico inicie outras threads quando e chamado evitando
assim que a interface trave durante uma execucao que consuma muito processamento;
Liuri Loami Ruyz Jorge [email protected] 39
-
9 SERVICES E BROADCASTRECEIVERS
9.2 Manifest
Para criar um servico e preciso declarar o nome da classe no Manifest.
...
..
O servico pode ser utilizado por qualquer aplicacao atraves de um Intent; Se o servico a ser implementado for apenas util para a aplicacao que o contem, entao e preciso explicitar
que o servico e privado no Manifest;
...
..
9.3 Classe Service
Para criar um servico e preciso implementar uma extensao da classe Service e sobreescrever algunsmetodos de callback:
onStartCommand() - Metodo que inicia um servico indefinidamente. O servico apenas terminaquando o metodo stopSelf() e executado a partir do proprio servico ou quando o metodo stopSer-vice() e executado a partir de outra aplicacao;
onBind() - Metodo que e chamado pelo sistema para associar o servico a uma aplicacao. Eledeve prover uma interface de comunicacao entre ambos. Este metodo deve ser implementadoobrigatoriamente, logo, se o servico nao for desenhado para suportar Bind entao o metodo onBinddeve devolver null;
onCreate() - Metodo chamado pelo sistema no momento da criacao do servico e pode ser utilizadopara realizar pre configuracoes;
onDestroy() - Metodo chamado pelo sistema quando o servico for destruido e pode ser utilizadopara liberar recursos utilizados.
Abaixo temos uma implementacao simples de um servico:public class ExampleService extends Service {
@Override
public void onCreate() {//Metodo executado no momento em que o servico e criado
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {//Execucao do servico;return START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {//Sem suporte a bindind
Liuri Loami Ruyz Jorge [email protected] 40
-
9 SERVICES E BROADCASTRECEIVERS
return null;}
@Override
public void onDestroy() {//Metodo executado no momento em que o servico e destruido
}
}
O metodo onStartCommand() devolve um inteiro. Este valor indica como o sistema deve continuar oservico 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 execucaomas apenas para os que estavam pendentes;
START REDELIVER INTENT - Reinicia o servico retomando a partir do Intent que estava emexecucao.
A thread que executa o servico e a thread principal da aplicacao 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 servico em uma thread separadaprivate final class ServiceHandler extends Handler {
public ServiceHandler(Looper looper) {super(looper);
}
@Override
public void handleMessage(Message msg) {//Implementacao da tarefa do servico..
//Parando explicitamente o servicostopSelf(msg.arg1);
}
}
@Override
public void onCreate() {//Criando a thread responsavel pela execucao da tarefaHandlerThread thread = new HandlerThread("ServiceStartArguments", Process.THREAD_PRIORITY_BACKGROUND);thread.start();
//Obtendo o Looper da thread e passando como parametro para o HandlermServiceLooper = 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 servico enfileiramos uma tarefa no HandlerMessage msg = mServiceHandler.obtainMessage();
msg.arg1 = startId;
mServiceHandler.sendMessage(msg);
Liuri Loami Ruyz Jorge [email protected] 41
-
10 NOTIFICACOES
//Se o servico morrer a partir deste ponto, reinicializarreturn START_STICKY;
}
@Override
public IBinder onBind(Intent intent) {// Sem suporte a Bindingreturn null;
}
@Override
public void onDestroy() {Toast.makeText(this, "service done", Toast.LENGTH_SHORT).show();
}
}
10 Notificacoes
10.1 Dialogs
O metodo mais indicado para mostrar avisos ao usuario e usando dialogs; Para criar um dialog no Android, cria-se uma classe estendendo a classe DialogFragment; Ao criar uma subclasse de DialogFragment, deve-se sobreescrever os metodos onCreate() e onCreate-
View() para a criacao de um dialogo customizado;
Outra opcao, para dialogos simples, e sobreescrever-se o metodo onCreateDialog().
10.2 Dialogs - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes8. O nome do pacote deve sercom.projeto3.android.testes8 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
-
10 NOTIFICACOES
android:padding="5dp"
android:layout_margin="8dp"
android:text="@string/show_custom_dialog" />
Copie uma imagem para a pasta drawable-hdpi com o nome imagem.png; Na pasta res/layouts crie um arquivo chamado custom dialog.xml com o seguinte conteudo:
O atributo android:contentDescription define um texto breve que resume o conteudo do elemento.
O arquivo res/values/strings.xml devera ficar com o seguinte conteudo:
Notificacoes
MainActivity
Atencao
Qual botao voce ira apertar?
Sim
Pressionou sim
Nao
Pressionou nao
Aguarde...
Estudando..!
Mostrar Progress Dialog
Mostrar Alert Dialog
Mostrar Custom Dialog
Logo
Edite o arquivo MainActivity.java com o seguinte conteudo:package com.projeto3.android.testes8;
import android.app.Activity;import android.app.AlertDialog;import android.app.Dialog;import android.app.DialogFragment;import android.app.ProgressDialog;import android.content.DialogInterface;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.View.OnClickListener;import android.view.ViewGroup;import android.widget.Button;import android.widget.Toast;
public class MainActivity extends Activity {
Liuri Loami Ruyz Jorge [email protected] 43
-
10 NOTIFICACOES
@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 {
Liuri Loami Ruyz Jorge [email protected] 44
-
10 NOTIFICACOES
public static ProgressDialogFragment newInstance() {ProgressDialogFragment frag = new ProgressDialogFragment();return frag;
}
@Override
public Dialog onCreateDialog(Bundle savedInstanceState) {Dialog dialog = new ProgressDialog(getActivity());dialog.setTitle(R.string.wait);
return dialog;}
}
public static class CustomDialogFragment extends DialogFragment {
public static CustomDialogFragment newInstance() {CustomDialogFragment frag = new CustomDialogFragment();return frag;
}
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater , ViewGroup container , Bundle savedInstanceState) {View v = inflater.inflate(R.layout.custom_dialog , container , false);getDialog().setTitle(R.string.studying);
return v;}
}
}
Rode a aplicacao e veja o resultado.
10.3 Notifications
Outro tipo de notificacao e conhecido como Status Bar Notifications, que sao aqueles alertas que aparecemna barra de status;
Existem diversos tipos de alertas que podem ser criados, mas em todos os casos deve-se utilizar a classeNotificationManager para enviar as notificacoes para o sistema;
Para construir uma notificacao, e utilizado o Notification.Builder() que possui diferentes metodos quecustomizam o conteudo e a aparencia da notificacao.
10.4 Notifications - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes9. O nome do pacote deve sercom.projeto3.android.testes9 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
-
10 NOTIFICACOES
android:layout_centerInParent="true" />
Na pasta res/layouts crie um arquivo chamado notification.xml com o seguinte conteudo:
O arquivo res/values/strings.xml devera ficar com o seguinte conteudo:
Notificacoes
MainActivity
Nova notificacao
Conteudo descrevendo a notificacao.
Criar notificacao
Esta tela foi aberta a partir da notificacao.
Crie um arquivo chamado NotificationActivity.java com o seguinte conteudo:package com.projeto3.android.testes9;
import com.projeto3.android.testes9;
import android.app.Activity;import android.os.Bundle;
public class NotificationActivity extends Activity {@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.notification);
}
}
Edite o arquivo MainActivity.java com o seguinte conteudo:package com.projeto3.android.testes9;
import android.app.Activity;import android.app.Notification;import android.app.NotificationManager;import android.app.PendingIntent;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.View.onClickListener;import android.widget.Button;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main);
Liuri Loami Ruyz Jorge [email protected] 46
-
11 MAPAS E GPS
Button createNotification = (Button) findViewById(R.id.create_notification_button);
createNotification.setOnClickListener(new OnClickListener() {
@Override
public void onClick (View v) {Intent intent = new Intent(MainActivity.this, NotificationActivity.class);PendingIntent pendingIntent = PendingIntent.getActivity(MainActivity.this, 0, intent, 0);
Notification notification = new Notification.Builder(MainActivity.this).setContentTitle(getString(R.string.new_notification))
.setContentText(getString(R.string.notification_content))
.setSmallIcon(R.drawable.ic_action_search)
.setContentIntent(pendingIntent)
.getNotification();
notification.flags |= Notification.FLAG_AUTO_CANCEL;
NotificationManager notificationManager = (NotificationManager)
getSystemService(NOTIFICATION_SERVICE);
notificationManager.notify(0, notification);
}
});
}
}
Apos isso rode a aplicacao e veja o resultado.
11 Mapas e GPS
Uma das vantagens para o desenvolvimento de aplicativos para dispositivos moveis e a possibilidade dese usar a informacao da localizacao do usuario.
11.1 Utilizando o GPS
Para utilizar o GPS, e necessario utilizar a classe LocationManager; Esta classe permite obter a localizacao do usuario, registrar listeners de localizacao, etc; Para obter uma posicao, e necessario escolher um Location Provider. O provider define como a posicao
do usuario sera obtida:
Network: Utiliza as antenas de rede e Wi-Fi para determinar a posicao do usuario. E mais rapidoem geral do que o GPS, e funciona melhor em ambientes fechados tambem;
GPS: Utiliza o sistema de GPS do aparelho para determinar a posicao. A precisao nesse caso emelhor do que utilizando network.
Para utilizar o GPS, e necessario incluir a permissao ACCESS FINE LOCATION. Para usar apenas arede e necessario incluir a permissao ACCESS COARSE LOCATION;
E possvel usar um objeto do tipo Criteria para auxiliar que tipo de provider sera utilizado; Com este objeto definimos parametros como precisao, velocidade de resposta, etc, e ele se encarrega de
escolher o provider mais adequado.
11.2 GPS - Exemplo 1
Crie um novo projeto Android. Use como nome para o projeto Testes10. O nome do pacote deve sercom.projeto3.android.testes10 e o nome da activity, MainActivity;
Na pasta res/layouts crie um arquivo chamado main.xml:
Liuri Loami Ruyz Jorge [email protected] 47
-
11 MAPAS E GPS
Edite o arquivo AndroidManifest.xml. Ele devera conter o seguinte conteudo:
Liuri Loami Ruyz Jorge [email protected] 48
-
11 MAPAS E GPS
-
11 MAPAS E GPS
longituteText.setText(R.string.location_not_available);
}
}
@Override
protected void onResume() {super.onResume();locationManager.requestLocationUpdates(provider, 400, 1, this);
}
@Override
protected void onPause() {super.onPause();locationManager.removeUpdates(this);
}
@Override
public void onLocationChanged(Location location) {double lat = location.getLatitude();double lng = location.getLongitude();latitudeText.setText(getString(R.string.point_label , lat));
longitudeText.setText(getString(R.string.point_label , lng));
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
}
@Override
public void onProviderEnabled(String provider) {Toast.makeText(this, "Novo provider " + provider, Toast.LENGTH_SHORT).show();
}
@Override
public void onProviderDisabled(String provider) {Toast.makeText(this, "Provider desabilitado " + provider, Toast.LENGTH_SHORT).show();
}
}
Rode novamente a aplicacao e veja os resultados.
11.3 Usando o MapView
E possvel mostrar mapas na aplicacao usando o MapView; Para isso, e necessario utilizar um target com suporte a` Google APIs e incluir a seguinte tag no Android-Manifest.xml:
Tambem e necessario ter uma chave cadastrada no Google Maps API, para que a aplicacao possa teracesso 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 sercom.projeto3.android.testes11 e o nome da activity, MainActivity;
Edite o arquivo AndroidManifest.xml e deixe-o com o seguinte conteudo:
Liuri Loami Ruyz Jorge [email protected] 50
-
11 MAPAS E GPS
Crie um arquivo chamado CustomItemizedOverlay com o seguinte conteudo:package com.projeto3.com.testes11;
import java.util.ArrayList;
import android.app.AlertDialog;import android.app.AlertDialog.Builder;import android.content.Context;import android.graphics.drawable.Drawable;import android.widget.Toast;
import com.google.android.maps.ItemizedOverlay;import com.google.android.maps.OverlayItem;
public class CustomItemizedOverlay extends ItemizedOverlay {
private ArrayList mOverlays = new ArrayList ();private Context context;
public CustomItemizedOverlay(Context context, Drawable defaultMarker) {super(boundCenterBottom(defaultMarker));this.context = context;
}
public void addOverlay(OverlayItem overlay) {mOverlays.add(overlay);
}
@Override
protected OverlayItem createItem(int i) {return mOverlays.get(i);
}
@Override
public int size() {return mOverlays.size();
}
protected boolean onTap(int index) {
Liuri Loami Ruyz Jorge [email protected] 51
-
11 MAPAS E GPS
OverlayItem item = mOverlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);dialog.setTitle(item.getTitle());
dialog.setMessage(item.getSnippet());
dialog.show();
return true;}
}
Insira uma imagem PNG na pasta res/drawable-hdpi com o nome logo.png; Edite o arquivo main.xml:
Edite o arquivo MainActivity.java:package com.projeto3.android.testes11;
import java.util.List;
import android.content.Context;import android.graphics.drawable.Drawable;import android.location.Location;import android.location.LocationListener;import android.location.LocationManager;import android.os.Bundle;
import com.google.android.maps.GeoPoint;import com.google.android.maps.MapActivity;import com.google.android.maps.MapController;import com.google.android.maps.MapView;import com.google.android.maps.MyLocationOverlay;import com.google.android.maps.Overlay;import com.google.android.maps.OverlayItem;
public class MainActivity extends MapActivity {
private MapController mapController;private MapView mapView;private CustomItemizedOverlay itemizedOverlay;private MyLocationOverlay myLocationOverlay;
public void onCreate(Bundle bundle) {super.onCreate(bundle);setContentView(R.layout.main);
mapView = (MapView) findViewById(R.id.mapview);
mapView.setBuiltInZoomControls(true);
mapView.setSatellite(false);mapController = mapView.getController();
mapController.setZoom(14);
myLocationOverlay = new MyLocationOverlay(this, mapView);mapView.getOverlays().add(myLocationOverlay);
List mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.logo);itemizedOverlay = new CustomItemizedOverlay(this, drawable);
GeoPoint point = new GeoPoint(-23570794, -46690747);OverlayItem overlayItem = new OverlayItem(point, "Projeto3", "Bla, bla, bla");
Liuri Loami Ruyz Jorge [email protected] 52
-
12 MULTIMEDIA
itemizedOverlay.addOverlay(overlayItem);
mapOverlaysadd(itemizedOverlay);
}
@Override
protected boolean isRouteDisplayed() {return false;
}
}
Rode a aplicacao e veja o resultado.
12 Multimedia
12.1 Reproducao de Mdia
O framework de multimedia do Android e capaz de reproduzid os tipos mais comuns de mdia; Com ele, e possvel reproduzir audio de vdeos puros ou codificados a partir do sistema de arquivos ou
mesmo atraves da internet;
Sao utilizadas duas classes para a reproducao de mdia: MediaPlayer - Principal classe de reproducao de audio e vdeo;
AudioManager - Manipula as entradas e sadas de audio do dispositivo.
Dependendo das funcionalidades da aplicacao, sera necessario modificar o AndroidManifest para habi-litar as permissoes necessarias:
Caso seja necessario utilizar o MediaPlayer como player de um stream atraves da internet, entaodeve-se adicionar a permissao de acesso a` internet:
Caso o player precise manter a tela sem esmaecer ou manter o processador sem entrar em modode economia de energia, entao e preciso adicionar a seguinte permissao para que os metodosMediaPlayer.setScreenOnWhilePlaying() ou MediaPlayer.setWakeMode() sejam executados:
12.2 Utilizando o MediaPlayer
O MediaPlayer e um dos componentes de mdia mais importantes do framework do Android; Uma instancia dessa classe e capaz de buscar, decodificar e reproduzir conteudos de audio e vdeo
exigindo pouca configuracao;
Principais funcoes da classe MediaPlayer: MediaPlayer.setDataSource() - Seleciona a mdia (caminho do arquivo local ou remoto) a ser repro-
duzida;
MediaPlayer.prepare() - Prepara (decodifica, pre-armazena, etc) a mdia, transformando-a em audiopuro pronto para ser reproduzido;
MediaPlayer.start() - Inicia a reproducao do audio;
MediaPlayer.pause() - Pausa a reproducao do audio;
MediaPlayer.stop() - Encerra a reproducao do audio;
Liuri Loami Ruyz Jorge [email protected] 53
-
12 MULTIMEDIA
mediaPlayer.setAudioStreamType() - Define o tipo de mdia que sera reproduzido. Para arquivosde musica passa-se como parametro a constante AudioManager.STREAM MUSIC.
Abaixo temos o trecho de um codigo que reproduz um arquivo de audio puro localizado em res/raw/.Neste caso, utilizou-se como entrada o recurso de audio da propria aplicacao:
MediaPlayer mediaPlayer = MediaPlayer.create(context, R.raw.arquivo_som_puro);
mediaPlayer.start();
No caso acima, como o arquivo contem som puro, nao existe a necessidade de nenhuma preparacao(decodificacao) para ser reproduzido. Contudo, serao raras as vezes em que o arquivo de audio naoestara codificado;
Para reproduzir os tipos mais comuns de arquivos de audio, procede-se conforme o exemplo abaixo://Localizacao do arquivo de mdiaURI myUri = Uri.parse("localizacaoAqui");
//Criando um PlayerMediaPlayer mediaPlayer = new MediaPlayer();
//Definindo que o tipo de stream e um arquivo de musicamediaPlayer.setAudioStreamType(AudioManager.STREAM_MUSIC);
//Fazendo com que o player encontre o arquivo de entradamediaPlayer.setDataSource(getApplicationContext(), myUri);
//Preparando a musica para ser reproduzidamediaPlayer.prepare();
//Iniciando a reproducaomediaPlayer.start();
Liuri Loami Ruyz Jorge [email protected] 54
RequisitosIntroduoArquitetura
Projeto de Aplicao AndroidPrincipais Componentes do Framework
Activities, Layouts, Widgets e ListenersActivitiesLayouts em XMLLayouts - Exemplo 1Layouts - Exemplo 2Layouts - Exemplo 3Layouts - Exemplo 4Layouts - Exemplo 5Listeners de EventosListeners - Exemplo
Usando IntentsUsando o Intent com ActivitiesIntent - Exemplo 1Usando Intents para passar dadosIntent - Exemplo 2Abrindo outros aplicativosIntent - Exemplo 3
Persistncia de dadosUsando o SharedPreferencesPersistncia - Exemplo 1Usando o SQLiteSQLite - Exemplo 1
HTTP e JSONHTTPJSONHTTP e JSON - Exemplo 1HTTP e JSON - Exemplo 2
Threads e AsyncTasksThreads e HandlersThreads e Handlers - Exemplo 1Threads e Handlers - Exemplo 2AsyncTasksAskyncTasks - Exemplo 1
Services e BroadCastReceiversServiosManifestClasse Service
NotificaesDialogsDialogs - Exemplo 1NotificationsNotifications - Exemplo 1
Mapas e GPSUtilizando o GPSGPS - Exemplo 1Usando o MapViewMapView - Examplo
MultimediaReproduo de MdiaUtilizando o MediaPlayer