Atenção: esse artigo tem uma palestra complementar. Clique e assista!
Atenção: esse artigo tem um vídeo complementar. Clique e assista!
Explorar os recursos da plataforma do Android para criar uma aplicação
de cadastro de carros onde as informações são sincronizadas diretamente de um
servidor web. É demonstrado como integrar a câmera para tirar a foto do carro e
enviar para o servidor. Fornecer um exemplo prático de
aplicação que executa em um dispositivo móvel e sincroniza as informações pela
internet. Também explora diversos conceitos sobre a plataforma do Android, como
a sua arquitetura focada em mensagens (intent) e boas práticas ao utilizar
threads. Ao desenvolver aplicações móveis frequentemente é necessário se
comunicar com a internet para buscar e enviar informações. Explorando os recursos do Android: O Android, comandado pelo Google
e por gigantes do mercado de mobilidade que formam o grupo Open Handset
Alliance (OHA) tem o objetivo de consolidar uma plataforma única com diversos
recursos que os usuários procuram em um celular moderno, e ainda revolucionar a
maneira de construir aplicações para dispositivos móveis e acirrar a disputa no
mercado coorporativo. Este artigo explora alguns aspectos da arquitetura do
Android à medida que uma aplicação de cadastro de carros é construída.
Para que serve:
Em que situação o tema é útil:
O Android é a plataforma open source criada pelo Google para o desenvolvimento de aplicações para dispositivos móveis, e promete esquentar a disputa no mercado de mobilidade. Neste artigo vamos construir uma aplicação de cadastro de carros para o Android, onde será possível inserir, editar e excluir carros, sincronizando os dados diretamente de um servidor web, fazendo requisições HTTP para um servlet. Também vamos demonstrar como integrar a câmera disponível no Android para tirar a foto do carro desejado e anexar no cadastro. Alguns componentes visuais como uma janela de progresso, barra de rolagem e criação de menus também serão abordados.
Android Virtual Device (AVD)
Se você desenvolve para Java ME deve estar acostumado a escolher em qual emulador você deseja executar a aplicação, que pode ser um emulador padrão da Sun ou algum que simula uma plataforma específica, como o da Nokia. Pense em um Android Virtual Device (AVD) da mesma forma, a diferença é que ele vai simular uma plataforma específica do Android.
Desta forma podemos criar uma configuração que possui o mesmo ambiente do celular HTC G1 (primeiro celular Android) ou outra que possui novas APIs de versões mais recentes do SDK.
No momento que este artigo estava sendo escrito, foi lançado o SDK 1.5, que possui três modelos de configurações (target). O primeiro simula exatamente o SDK 1.1 (HTC G1), o segundo e o terceiro são compatíveis com o SDK 1.5, sendo que o terceiro modelo adiciona o pacote para desenvolvimento de mapas.
Para listar os modelos de configurações disponíveis abra um prompt, navegue até a pasta tools do SDK e digite: android list targets. O resultado pode ser visualizado na lista a seguir que exibe o id de cada configuração.
Available Android targets:
id: 1
Name: Android 1.1
Type: Platform
API level: 2
Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 2
Name: Android 1.5
Type: Platform
API level: 3
Skins: HVGA (default), HVGA-L, HVGA-P, QVGA-L, QVGA-P
id: 3
Name: Google APIs
Type: Add-On
Vendor: Google Inc.
Description: Android + Google APIs
Based on Android 1.5 (API level 3)
Libraries:
* com.google.android.maps (maps.jar)
API for Google Maps
Skins: QVGA-P, HVGA-L, HVGA (default), QVGA-L, HVGA-P
Para criar um AVD digite no prompt: “android create avd --name <nome> --target <id>”. Para o nosso exemplo tanto faz a configuração escolhida, sendo que o mesmo funciona em qualquer SDK. Então vamos criar uma configuração com o id=1 e nome G1:
“android create avd --name G1 --target 1”.
Criando o projeto no Eclipse
Com o SDK do Android e o plugin ADT do Eclipse devidamente instalados, utilize o wizard para criar um projeto Android com o nome “ExemploCadastroAndroid” e pacote br.javamagazine.cadastro. No campo Activity Name digite ListaCarros para ser a activity principal do projeto.
Depois de criar o projeto é necessário configurar o AVD em que a nossa aplicação será executada, o que pode ser feito acessando as propriedades do projeto. Feito isto é possível executar a aplicação no emulador. Para isto clique com o botão direito no projeto e selecione o menu Run as >Android Application. O projeto será executado no emulador e uma tela vai aparecer com o resultado. Mas isto seria suficiente se você apenas desejasse fazer um Olá Mundo. Neste artigo vamos construir uma aplicação completa de cadastro, integrando a câmera do Android e sincronizando os dados pela internet.
Repositório de Carros
Para persistir as informações deste exemplo, vamos criar uma interface RepositorioCarro conforme demonstrado na Listagem 1. Desta forma poderemos deixar a persistência separada da lógica de negócios, o que além de boa prática, torna a explicação do exemplo mais simples.
Listagem 1. Repositório de Carros
public interface RepositorioCarro {
// Insere ou atualiza o carro
public boolean salvar(Carro carro);
// Deleta o carro
public boolean deletar(Carro carro);
// Busca o carro pelo id
public Carro getCarro(Long id);
// Retorna uma lista com todos os carros
public List<Carro> listarCarros();
// Busca o carro pelo nome
public Carro buscarCarroPorNome(String nome);
}
Posteriormente podemos implementar esta interface da maneira que for necessário, como por exemplo, utilizando o banco de dados SQLite, disponível no Android. Mas neste artigo vamos criar uma implementação que busca e envia os carros diretamente de um servidor web, fazendo requisições HTTP para um servlet. Este tipo de aplicação é muito importante no mundo de mobilidade, e valoriza muito a aplicação sendo que podemos utilizar a internet para sincronizar e integrar a aplicação do celular com alguma aplicação já existente.
Para obter a implementação correta do repositório vamos utilizar o padrão Factory, conforme demonstrado a seguir:
RepositorioCarro repositorio = RepositorioFactory.getRepositorioCarro();
List<Carro> carros = repositorio.listarCarros();
Este repositório gerencia a entidade Carro que pode ser visualizada na Listagem 2. O carro possui um identificador (id), nome, placa, ano e um array de bytes para armazenar a foto.
Como nesta aplicação será necessário exibir a foto do carro na lista, foi criado o método getBitmap() nesta classe para converter o array de bytes da foto para Bitmap, classe que representa uma imagem no Android. Isto é necessário porque a classe ImageView utilizada para exibir uma imagem na tela possui o método setImageBitmap(bitmap).
...