Professional Documents
Culture Documents
mentes se
revoluciona
o mundo?
6 a 12 de fevereiro de 2012
Anhembi (SP)
Inovao
Cultura Digital
Cincia
Entretenimento Digital
Unimos talento Criamos futuro
www.campus-party.com.br
@CampusPartyBRA
www.facebook.com/campuspartybrasil
EDITORIAL
O
uso de mdias nos aplicativos extremamente comum, desde
sinais de alertas em aplicativos convencionais at sua vital im-
portncia em jogos. Podemos encontrar desde simples toques
polifnicos at mesmo sons em trs dimenses, com diversos efeitos sonoros, mu-
dando consideravelmente a percepo do usurio em relao ao aplicativo que ele
est usando.
O uso da mdia tambm est sendo utilizado na entrada de dados. Alm dos tecla-
Ano 4 - 39 Edio - 2011 ISSN 1807736-6 dos convencionais, as telas touchscreen, j encontramos sites e aplicativos que requi-
sitam que o usurio fale a informao que deseja inserir no software.
Para telefones celulares e smartphones a importncia das mdias se torna ainda
Corpo Editorial
Atendimento ao Leitor maior devido ateno que o usurio pode dar ao aparelho. Por exemplo: o moto-
A DevMedia conta com um departamento exclu- rista est dirigindo pela auto-estrada quando recebe uma mensagem de SMS. Caso
sivo para o atendimento ao leitor. Se voc tiver
ele precise olhar para o visor do aparelho, estar deixando de prestar ateno onde
algum problema no recebimento do seu exemplar
ou precisar de algum esclarecimento sobre assina- mais importa, na estrada. Se a mensagem fosse lida de forma automtica e repro-
turas, exemplares anteriores, endereo de bancas duzida no sistema de som do prprio automvel, o risco de um acidente diminuiria
Editor Geral
Rodrigo Oliveira Spnola
de jornal, entre outros, entre em contato com: consideravelmente.
editorwebmobile@devmedia.com.br Outro ponto muito importante na ajuda a deficientes visuais. Apesar da conscin-
www.devmedia.com.br/mancad
(21) 3382-5038 cia em relao usabilidade e acessibilidade ter aumentado nos ltimos anos, ainda
Sub Editor pouco provvel encontrarmos um aplicativo para celular ou smartphone que mostre
Eduardo Spnola Publicidade
Para informaes sobre veiculao de anncio na duas informaes na forma textual e oral.
Jornalista Responsvel revista ou no site e para fechar parcerias ou aes Mas, felizmente para ns programadores, todas as plataformas mobile de hoje
Kaline Dolabella - JP24185 especficas de marketing com a DevMedia, entre apresentam APIs que nos permitem inserir e capturar udio e vdeo em nossos apli-
em contato com:
Na Web cativos como Android e JavaME.
www.devmedia.com.br/webmobile/pagina.asp publicidade@devmedia.com.br Neste contexto, esta edio da Mobile Magazine destaca a tema Multimdia em An-
droid e JavaME. Para, isto teremos dois artigos apresentado o tema. O primeiro artigo,
Utilizando sons e imagens em aplicaes Android, mostra parte da API de mdia do
Android utilizando dois exemplos. O primeiro um aplicativo de streaming de mdia,
Fale com o Editor! que pode ser facilmente transformado em uma aplicao completa para rdios. O
Se voc estiver interessado em publicar um artigo na segundo exemplo mostra um lbum de fotos capturadas e persistidas pela prpria
muito importante para a equipe saber o que
revista ou no site Mobile Magazine, entre em contato aplicao. J o segundo artigo, Trabalhando com dados multimdia em aplicaes
voc est achando da revista: que tipo de artigo
com os editores, informando o ttulo e mini-resumo do
voc gostaria de ler, que artigo voc mais gostou CLDC/MIDP com Java ME, apresenta a utilizao de dados multimdia em aplicaes
tema que voc gostaria de publicar:
e qual artigo voc menos gostou. Fique a vontade JavaME.
Rodrigo Oliveira Spnola - Editor da Revista
para entrar em contato com os editores e dar a Alm destas matrias, esta edio da Mobile Magazine ainda traz outros artigos
editorwebmobile@devmedia.com.br
sua sugesto! passando por assuntos como Jogos, Android e .NET Mobile. Tenha uma tima leitura.
ta
edio
20 - Desenvolvendo aplicaes para Android com PhoneGap
Mayron Cachina
A Resumo DevMan
plataforma Android tem como base o kernel 2.6 do Linux.
Sobre ele temos uma mquina virtual chamada Dalvik,
que responsvel por executar as aplicaes. O Android De que se trata o artigo:
padro (pois cada fabricante pode modific-lo) vem com algumas Neste artigo ser apresentada a construo de um jogo de corrida de carros.
aplicaes padres como media player, calendrio, calculadora e Mostraremos de forma prtica e passo a passo os conceitos relacionados ao
SMS/MMS. Alm disso, os usurios de aparelhos Android contam sistema Android para este tipo de jogo.
com uma loja virtual chamada Android Market.
Para a plataforma Android, a Google disponibiliza o Android Em que situao o tema til:
SDK, que um conjunto de ferramentas que provm a infraes- Recentemente, os jogos para celulares ganharam popularidade por fornecer
trutura necessria para a construo de aplicaes, como: biblio- o entretenimento pessoal mvel. Esta popularidade faz com que os jogos de-
tecas de classes e um simulador para que possamos testar nossos sempenhem um papel fundamental na gerao de renda para as operadoras
aplicativos sem a necessidade do aparelho real. Esse SDK est de celulares, desenvolvedores de jogos e fabricantes de aparelhos telefnicos.
disponvel para Windows, OS X e Linux. Neste contexto, este artigo pode ser til para desenvolvedores iniciantes ou
O mercado mvel est em expanso e hoje podemos encontrar experientes que desejam entrar neste fantstico mundo dos jogos.
vrios dispositivos com Android, facilitando assim a sua dissemi-
nao. Outro ponto bastante importante o fato da plataforma ser Construindo um jogo de Corrida de Carros em Android:
livre e ter o seu cdigo fonte liberado, assim como um SDK que O mercado mvel est em expanso e hoje podemos encontrar vrios dispo-
possui um emulador, facilitando o desenvolvimento. sitivos com Android, facilitando assim a sua disseminao. Outro ponto bastan-
Recentemente, os jogos para celulares ganharam popularidade te importante o fato da plataforma ser livre e ter o seu cdigo fonte liberado,
por fornecer o entretenimento pessoal mvel. Esta popularidade assim como um SDK que possui um emulador, facilitando o desenvolvimento.
faz com que os jogos desempenhem um papel fundamental na De acordo com dados sobre o Market - loja de aplicativos para Android OS da
gerao de renda para as operadoras de celulares, desenvolvedores Google, jogos representam entre 30 e 50 por cento do volume de downloads
de jogos e fabricantes de aparelhos telefnicos. de aplicativos. Sendo assim, torna-se um grande nicho para ser explorado
O desenvolvimento de jogos (ler Nota DevMan 1) passa por vrias pelos desenvolvedores, e este artigo vem contribuir neste aspecto.
etapas, e algumas delas so: Game Design; Rascunho dos objetos e
cenrios; Modelagem; Engenharia de Software; e Programao.
O Game Design a etapa onde o jogo criado com suas idias, Ele possibilita a criao de interfaces de usurio, adicionar com-
personagens e estria, ou seja, a concepo propriamente dita. O ponentes, depurar aplicaes utilizando as ferramentas do SDK
rascunho do jogo a etapa do processo que auxilia os modeladores android e exportar os .apk (assinados ou no).
a criarem o mundo do jogo. J a modelagem a etapa onde sero O ADT estende os recursos do Eclipse para permitir que voc
criados modelos e texturas utilizados no jogo. Na engenharia configure rapidamente projetos Android, crie uma aplicao,
de software feita a modelagem do sistema, e na programao, adicione componentes baseados na API do framework Android,
o jogo desenvolvido. Este artigo abordar apenas a etapa da depure suas aplicaes usando as ferramentas do SDK e at ex-
programao. porte APK assinadas (ou no) para distribuir sua aplicao.
Assim, a motivao deste artigo aprender conceitos relaciona- Em geral, usar o Eclipse com o ADT a forma mais recomen-
dos a jogos. Iremos desenvolver um pequeno esboo de framework dada de desenvolver aplicaes Android e o jeito mais rpido de
para o funcionamento e controle do jogo. Neste contexto, neste comear. Se voc usa Eclipse, o plugin ADT lhe fornecer um bom
tutorial desenvolveremos um jogo de corrida usando vrios re- comeo no desenvolvimento de aplicaes Android.
cursos tais como: threads, sprites, soundpool para reproduo de Para instalar e atualizar o plugin ADT, voc pode tirar vanta-
som atravs da API Mdia Player do Android e muitos outros. gem do recurso de atualizao remota do Eclipse. Configurando
um site de atualizao, voc pode facilmente baixar, instalar e
Preparando o ambiente de desenvolvimento verificar atualizaes do ADT. Alternativamente, voc pode
O Android Development Tools (ADT) trata-se de um plugin para baixar a ltima verso do ADT para seu computador como um
o eclipse que facilita a criao rpida de novos projetos Android. arquivo local.
Nota do DevMan 1
Conceitos de jogos
Para que o leitor possa acompanhar melhor o artigo, vamos relembrar alguns conceitos aqui:
Curva de aprendizagem: o tempo que um jogador necessita para assimilar os comandos e as regras
do jogo. Existem principalmente duas abordagens utilizadas para permitir que o jogador aprenda as
regras e os comandos: (1) atravs da criao de uma fase do jogo, conhecida como tutorial, onde os Figura 1. Verificando o Virtual Device
comandos e as regras so explicitamente demonstrados e (2) atravs da criao de fases iniciais com
nveis de dificuldade baixos. Essas abordagens facilitam a despertar o interesse do jogador.
Tempo de vida do jogo: quantas horas em mdia um usurio vai continuar jogando este jogo antes
de perder o interesse por ele.
Fator de replay: quantas vezes o jogador vai jogar novamente, mesmo j tendo terminado o jogo.
Sprite: um elemento bsico visual que pode ser renderizado a partir de um ou vrios frames de
uma imagem. Estes vrios frames podem ser utilizados para fazer a animao do sprite. Normalmente
corresponde a um objeto na tela do jogo, como um inimigo, o personagem principal, ou um tiro.
FPS (frames per second): significa quadros por segundo. Define quantos quadros so mostrados
ao usurio em um segundo de jogo. Para jogos em celulares, o mnimo aceitvel so 10 quadros por
segundo. Quanto maior a quantidade de quadros por segundo, maior o processamento requerido.
Plataforma-alvo: celular ou conjunto de celulares que sero capazes de rodar o jogo.
Pblico-alvo: pessoas s quais o jogo se destina.
Turno de jogo: conjunto de atividades que o jogo faz a cada frame de jogo. Entre atividades tpicas,
esto repintar a tela, verificar os pontos do jogador ou colises entre os sprites.
Uma vez que voc tenha o SDK e o ADT plugin instalado, hora
de configurar o nosso projeto. Para isso, abra o Eclipse, v em Win-
dow> Android SDK e AVD Manager, clique em virtual devices e
verifique se existe ao menos um dispositivo virtual configurado.
Se no houver, conforme mostra a Figura 1, d um clique no boto
Figura 2. Criando e configurando o Virtual Device
New, preencha o campo Name com um nome sugestivo, adicione-o
selecionando o target Android 2.1 - API level 7, se necessrio infor-
me o tamanho do SD Card a ser criado, se for necessrio capturar Arquitetura bsica do jogo
telas do aplicativo, deixe a opo Snapshot selecionada. Pode-se De uma forma geral, um jogo uma aplicao com resposta em
tambm escolher ou definir as propriedades de resoluo do Skin, tempo real, diferente de uma aplicao para edio de imagens que
assim como tambm acrescentar caractersticas de hardware, tais fica esttica esperando que um evento (comando) seja disparado
como acelermetro, gravar udio, gps e outros. Feito isto, clique pelo usurio. Um jogo tambm espera por estmulos do usurio
no boto Create AVD para criar o dispositivo virtual que ir rodar ou do ambiente, mas enquanto espera, todo um motor j esta
a aplicao de acordo com a Figura 2. em funcionamento.
Nota do DevMan 2
OpenGL
Android inclui suporte para grficos de alto desempenho em 2D e 3D com o Open Graphics Library
(OpenGL), especificamente, a API OpenGL ES. OpenGL uma multi-plataforma API grfica que
especifica uma interface de software padro para hardware de grficos 3D de processamento.
OpenGL ES uma verso da especificao OpenGL destinado para dispositivos embarcados. O OpenGL
ES 1.0 e 1.1 tm sido apoiados desde o Android 1.0. Comeando com o Android 2.2 (API Nvel 8), a
estrutura suporta o OpenGL ES 2.0.
Figura 3. Game Loop Bsico
A taxa de exibio dos objetos na tela medido em FPS Frames Na Listagem 1 o game loop representado em pseudo-cdigo
por Segundo. Se temos uma taxa de 10 FPS, significa que so Java. A listagem demonstra um loop onde so executadas
apresentados 10 imagens a cada segundo. Um filme exibido vrias tarefas de um jogo de forma contnua e o mais rpido
a 24 FPS e a taxa de exibio de um monitor de computador possvel, porm temos um problema simples nesta concepo,
de 60 FPS. Quanto maior a taxa de exibio, mais suave ser a o tempo.
animao, e com certeza mais bem elaborada poder ser. Ima- No caso de um jogo Android, tudo ir ocorrer dentro de uma
gine o deslocamento de um personagem com vrias posies activity. Conforme a Figura 4, a atividade ir criar uma View. A
dos ps, braos e corpo, quanto mais FPS tivermos, mais real View onde tudo acontece, nela temos a principal entrada de
ser a animao. Por outro lado, se a mesma animao for feita dados (Touch Screen), e tambm a principal sada de dados,
com um taxa pequena, no teremos a verdadeira sensao de que a imagem que esta sendo visualizada, conforme podemos
deslocamento. visualizar na Figura 4.
Listagem 3. Main.java
package br.com.animacao;
import android.app.Activity;
Figura 4. Game Loop Android import android.os.Bundle;
lastUpdate = System.currentTimeMillis();
while (running){
if (System.currentTimeMillis() - lastUpdate > 300) {
lastUpdate = System.currentTimeMillis();
lerEntradas();
executarAI();
moverObjetos();
verificarColisoes();
desenharSprites();
tocarMusica();
}
}
Game Engine
Este o item da arquitetura de nosso jogo onde cuidaremos da
atualizao dos movimentos (fsica do jogo) e tambm do desenho
na tela. Nas Listagens 3 e 4 temos um exemplo de uma pequena
engine para fazer uma figura se deslocar na tela pelo eixo y.
Na Listagem 3 criamos uma nova View. A View uma classe
simples que nos proporciona o tratamento de eventos (como
onTouch) e um papel em forma de retngulo para podermos
desenhar. A maneira mais simples de cri-la estender da prpria
classe View. Podemos tambm estender da SurfaceView, que
atualizao da View. J o mtodo draw implementado nas linhas mesmo tempo, alguns representando entidades de IA (inteligncia
43 e 52 define a cor de fundo do canvas para preto. Em seguida, artificial) ou o personagem principal controlado pelo jogador.
calculamos a posio de y e finalmente utilizamos o mtodo Um sprite possui posio(x,y), pode possuir velocidade, som e
drawBitmap do canvas para desenhar na tela o carro na posio at mesmo animao prpria.
calculada. Na Listagem 5 criamos um escopo bsico para o sprite. Este
escopo foi definido porque utilizaremos a reutilizao de c-
digo, ou seja, iremos utilizar herana para evitar repetio de
Listagem 4. Arquivo GameView.java
cdigo . Sendo assim, neste escopo definimos as propriedades e
01. package br.com.animacao; mtodos comuns aos objetos do jogo, tais como posio, limites
02.
da tela, mtodo de desenho, e uma propriedade do tipo Bitmap
03. import android.content.Context;
04. import android.graphics.Bitmap; para armazenar a imagem do objeto. Nas linhas 28 e 38 fazemos
05. import android.graphics.BitmapFactory; a inicializao do sprite. J as linhas 40 a 42 so responsveis por
06. import android.graphics.Canvas;
07. import android.graphics.Color;
desenhar no Canvas o bitmap, na posio de desenho, drawX e
08. import android.util.Log; drawY.
09. import android.view.View; Agora na Listagem 6 temos a classe Carro que estendida da
10.
11. public class GameView extends View implements Runnable {
classe Sprite e implementa o mtodo move e o atributo speed para
12. definirmos o deslocamento do carro na tela. Nas linhas 19 a 24
13. private static final int INTERVAL = 10; implementamos o mtodo move, que verifica se o carro j chegou ao
14. private Bitmap bmpCarro;
15. private boolean running = true; final da tela, se no define uma nova posio para o carro somando
16. private int y; a posio atual com o valor da propriedade speed, caso contrrio
17. define a posio para zero para dar um efeito de continuidade.
18. public GameView(Context context) {
19. super(context); Com isto finalizamos as definies necessrias para a constru-
20. o do jogo.
21. bmpCarro = BitmapFactory.decodeResource(getResources(),
22. R.drawable.carro);
23. Thread minhaThread = new Thread(this); Game Resources
24. minhaThread.setPriority(Thread.MIN_PRIORITY); Os game resources, em nosso estudo de caso, sero os recursos
25. minhaThread.start();
26. }
de som e imagens utilizados no jogo.
27. O jogo de corrida que desenvolveremos neste artigo consiste de
28. public void run() { uma tela principal e vrias classes encapsulando os elementos do
29. while (running) {
30. try {
jogo. Poderemos acrescentar tela de abertura, preferences, confor-
31. Thread.sleep(INTERVAL); me vimos no Artigo Tutorial Android Jogo da Velha publicado
32. } catch (InterruptedException e) { na edio 38 da Mobile Magazine.
33. Log.e(Carro, GameLoop Finalizado!);
34. } Para iniciar, crie um novo projeto Android no Eclipse File> New>
35. update(); Project Android, e preencha os campos conforme a Figura 5.
36. } Nesta figura definimos:
37. }
38. Project Name: onde definimos o nome do projeto;
39. private void update() { Application Name: nome da aplicao;
40. postInvalidate();// Dispara o mtodo draw
Package Name: nome do pacote onde sero criados os arquivos
41. }
42. JAVA do projeto;
43. public void draw(Canvas canvas) { Create Activity: nome da atividade principal;
44. super.draw(canvas);
Min SDK Version: onde definimos qual a menor verso do
45. canvas.drawColor(Color.BLACK);
46. if (y < getHeight() - bmpCarro.getHeight()) { Android na qual a aplicao ir rodar.
47. y+=5;
48. }else{
49. y =0;
Ao concluir as definies, ser gerado um projeto com uma classe
50. } Main.java responsvel por levantar a aplicao. Esta iniciali-
51. canvas.drawBitmap(bmpCarro, getWidth()/2, y, null); zao mais conhecida como Launch e pode ser configurada
52. }
53. }
atravs do arquivo AndroidManifest.xml, conforme ser visto
mais adiante neste artigo.
Toda aplicao Android deve ter um arquivo AndroidManisfest.
Sprite xml presente no diretrio raiz do projeto. AndroidManifest.xml
Em computao grfica, um sprite um objeto grfico bi ou o arquivo de configuraes que permite descrever as funcio-
tridimensional que se move em uma tela sem deixar traos de nalidades e requerimentos do projeto, contendo as informaes
sua passagem. Normalmente, em uma tela temos vrios sprites ao necessrias para a execuo da aplicao.
Nota do DevMan 3
XML o acrnimo de eXtensible Markup Language, uma linguagem de marcao projetada
especificamente para transportar e armazenar dados, a fim de permitir e simplificar a troca de
informaes entre aplicaes estruturalmente disconexas (que no apresentam interfaces comuns).
O seu uso serve as mais variadas necessidades de representao de dados, como transaes de processos
de negcio, dados vetoriais, equaes matemticas, troca de mensagens ou mesmo um cadastro de
clientes, por exemplo. Como os dados so mantidos em formato textual e hierarquicamente organizados
atravs das tags (marcaes) definidas, qualquer software capaz de parsear o arquivo est apto a
processar os dados.
Assim, temos que a linguagem XML (eXtensible Markup Language), resumidamente, define-se como
uma metalinguagem, ou seja, uma espcie de receita para se criar linguagens prprias. O seu uso traz
inmeros benefcios, mas certamente, o maior deles a capacidade de descrever dados de modo a dar
significado aos mesmos. O resultado disso que tanto seres humanos quanto mquinas tm facilidade
em inferir informaes a partir de um documento escrito em XML, o que permite a componentes de
sistemas distintos, desconhecidos originalmente, compreender os dados com a mesma significncia.
Ciclo de vida
Aplicaes Android so compostas de Activities. Activities repre-
Figura 5. Configurando nossa aplicao sentam a tela de uma aplicao Android. Nela definido o layout da
Nota do DevMan 4
Internacionalizao (i18n) o desenvolvimento de uma
aplicao de modo que com a localizao, ela possa se adaptar a
determinado idioma/cultura, ou seja, ser globalizada. Porm, no
apenas traduzir os labels da aplicao, vai muito alm disto, pois
temos pases em que a escrita se d da direta para esquerda, etc.
Nota do DevMan 5
Intents: A classe android.content.Intent representa uma
inteno para executar uma tarefa. Esta inteno enviada para
o Android OS como uma mensagem. Ela pode ser utilizada para Figura 6. Arquitetura da aplicao
lanar (executar) uma atividade, fazer um broadcast, ou iniciar ou
comunicar com um servio.
Uma atividade ir fazer toda a configurao global no OnCreate Listagem 7. Arquivo Main.java
(), e liberar todos os recursos remanescentes em onDestroy ().
Visible lifetime: o tempo de vida visvel de uma atividade 01. package br.com.carrace;
02.
acontece entre uma chamada para onStart () at uma chamada 03. import android.app.Activity;
correspondente para onStop (). Durante este perodo a Activity 04. import android.content.pm.ActivityInfo;
05. import android.hardware.SensorManager;
pode estar visvel para o usurio ou aguardando em segundo
06. import android.media.AudioManager;
plano outra Activity terminar. 07. import android.os.Bundle;
Foreground lifetime: o tempo de vida do primeiro plano de uma 08. import android.util.DisplayMetrics;
09. import android.view.Window;
atividade acontece entre uma chamada para onResume () at uma
10. import android.view.WindowManager;
chamada correspondente para OnPause (). Durante esse tempo, a 11.
atividade est na frente de todas as outras atividades e interagindo 12. public class Main extends Activity {
13. private GameView view;
com o usurio. Uma atividade pode alternar entre os estados onRe- 14.
sume() e onPause() com muita frequncia, por exemplo: quando o 15. public void onCreate(Bundle savedInstanceState) {
dispositivo entra em modo sleep, ou quando um resultado de uma 16. super.onCreate(savedInstanceState);
17. SensorManager mSensorManager;
atividade entregue, ou quando uma nova inteno entregue. 18. setRequestedOrientation
Sendo assim, espera-se que o cdigo destes mtodos sejam leves, (ActivityInfo.SCREEN_ORIENTATION_PORTRAIT);
evitando consumir recursos preciosos do processador, prejudican- 19. getWindow().addFlags(WindowManager.LayoutParams.
FLAG_FULLSCREEN);
do a aplicao que esta rodando em primeiro plano. 20. getWindow().addFlags(WindowManager.LayoutParams.
FLAG_KEEP_SCREEN_ON);
21. requestWindowFeature(Window.FEATURE_NO_TITLE);
Esta foi uma viso geral do que representa uma Activity no
22. setVolumeControlStream(AudioManager.STREAM_MUSIC);
desenvolvimento e execuo de uma aplicao Android. 23.
24.
Alterando a Atividade Main 25.
26.
// Aponta para uma instancia do SensorManager
mSensorManager = (SensorManager) getSystemService
No passo anterior, o Eclipse gerou automaticamente uma aplicao e (SENSOR_SERVICE);
criou uma atividade. Abra o arquivo Main.java (a atividade principal 27. DisplayMetrics dm = new DisplayMetrics();
28. getWindowManager().getDefaultDisplay().getMetrics(dm);
do jogo) (voc vai encontr-lo no diretrio src no pacote br.com.carrace 29.
pelo painel Project Explorer). O prximo passo no desenvolvimento de 30. view = new GameView(this,
nosso jogo alterar essa atividade de acordo com a Listagem 7. 31. getResources(),dm.widthPixels,dm.heightPixels,mSensorManager);
32. setContentView(view);
Na linha 18, configuramos a orientao da tela como sendo 33. }
modo Portrait retrato, isto evitar que a mesma altere ao 34.
girarmos o equipamento. Na linha 19, definimos o parmetro 35. protected void onDestroy() {
36. super.onDestroy();
FLAG_FULLSCREEN para esconder a barra de status. Na linha 37. view.release();
20, definimos o parmetro FLAG_KEEP_SCREEN_ON para que 38. }
a tela mantenha-se ligada e na linha 21 definimos que a tela no 39. }
110. updateTime = 300; 180. // Verifica se houve exploso, se sim desenha a exploso e assim
111. return true; que a animao
112. } 181. // terminar, seta a varivel runnig para false, que finaliza o mtodo
113. Run da Thread
114. if (action == MotionEvent.ACTION_DOWN ) { 182. if (explosion){
115. updateTime = 300 - (int) aceleracao; 183. explosao.draw(canvas);
116. } 184. // se a animacao da exploso terminou, setamos running =
117. false para finalizar
118. return super.onTouchEvent(event); 185. // o game loop
119. } 186. if(explosao.dispose)
120. // GameLoop do jogo, responsvel pela execuo dos mtodos 187. running = false;
update e draw 188. return;
121. public void run() { 189. }
122. while (running) { 190. // Desenha a faixa
123. try { 191. barra.draw(canvas);
124. Thread.sleep(INTERVAL); 192. // Desenha o carro do jogador
125. } catch (InterruptedException e) { 193. carro.draw(canvas);
126. Log.e( TAG, game loop interrompido); 194. // Desenha os carrosm
127. } 195. for (CarroF s : carros) {
128. update(); 196. s.draw(canvas);
129. postInvalidate();// Dispara o mtodo draw 197. }
130. } 198. }
131. } 199.
132. 200. public void release() {
133. // Faz update da fisica do jogo. 201. // libera o sensor manager
134. private void update() { 202. mSensorManager.unregisterListener(this);
135. long now = System.currentTimeMillis(); 203. running = false;
136. if ( now - lastUpdate > updateTime) { 204. }
137. lastUpdate = now; 205.
138. // Se houve exploso, faz a atualizao do sprite da exploso 206. @Override
139. if (explosion){ 207. public void onAccuracyChanged(Sensor arg0, int arg1) {
140. explosao.update(now); 208.
141. return; 209. }
142. } 210.
143. // Para cada carro na lista , se estiver invisvel, 211. @Override
inicializa-o novamente 212. public void onSensorChanged(SensorEvent event) {
144. // para evitar a criao de novos objetos, vamos reaproveit-los 213. Sensor sensor = event.sensor;
145. for (CarroF s : carros) { 214. // Verifica se o sensor detectado
146. if(!s.isVisible()){ (disparado do tipo acelermetro, se for
147. s.inicializa(); 215. // move o carro com o valor do evento
148. } 216. if (sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
149. // Atualiza a posio do carro 217. c arro.move(-event.values[0]);
150. s.move(); 218. }
151. // Verifica a se houve coliso, se houve, vamos posicionar o 219. }
sprite da exploso 220.
152. // onde houve o choque 221. // Faz a checagem de coliso entre 2 sprites.
153. if(checkCollision(carro, s)){ 222. private boolean checkCollision(Sprite first, Sprite second) {
154. explosion = true; 223. boolean retValue = false;
155. explosao.setX((int)s.getX()); 224. int width = first.getWidth();
156. explosao.setY((int)s.getY()); 225. int height = first.getHeight();
157. explosao.update(now); 226. int firstXRangeStart = (int) first.getDrawX();
158. // Toca o som da exploso 227. int firstXRangeEnd = firstXRangeStart + width;
159. sounds.play(sExplosion, 1.0f, 1.0f, 0, 0, 1.5f ); 228. int firstYRangeStart = (int) first.getDrawY();
160. // Dispara o mtodo draw 229. int firstYRangeEnd = firstYRangeStart + height;
161. postInvalidate(); 230. int secondXRangeStart = (int) second.getDrawX();
162. break; 231. int secondXRangeEnd = secondXRangeStart + width;
163. } 232. int secondYRangeStart = (int) second.getDrawY();
164. } 233. int secondYRangeEnd = secondYRangeStart + height;
165. } 234. if ((secondXRangeStart >= firstXRangeStart && secondXRangeStart
166. // Faz update do FPS <= firstXRangeEnd)
167. fps.update(); 235. || (secondXRangeEnd >= firstXRangeStart && secondXRangeEnd
168. // Atualiza a animao da faixa <= firstXRangeEnd)) {
169. barra.atualizaBarra(); 236. if ((secondYRangeStart >= firstYRangeStart && secondYRange
170. } Start <= firstYRangeEnd)
171. 237. || (secondYRangeEnd >= firstYRangeStart && secondYRange
172. // Desenha na tela os objetos End <= firstYRangeEnd)) {
173. public void draw(Canvas canvas) { 238. retValue = true;
174. super.draw(canvas); 239. }
175. // Seta cor do paint 240. }
176. cPaint.setColor(Color.WHITE); 241. return retValue;
177. canvas.drawText(FPS: + fps.getFPS(), 20, 20, cPaint); 242. }
178. canvas.drawText(UpdateTime: + String.valueOf(updateTime), 243. }
80, 20, cPaint);
179. cPaint.setColor(Color.BLACK);
ir controlar se o carro est dentro dos limites da tela no eixo x, Listagem 11. Arquivo CarroF.java
evitando assim que o mesmo saia da tela.
01. package br.com.carrace;
02.
Listagem 10. Arquivo Carro.java 03. import java.util.List;
04. import java.util.Random;
01. package br.com.carrace; 05.
02. 06. import android.content.res.Resources;
03. import android.content.res.Resources; 07. import android.graphics.Canvas;
04. import android.util.Log; 08.
05. 09. public class CarroF extends Sprite {
06. public class Carro extends Sprite { 10.
07. 11. private int speed;
08. 12. private boolean visible = false;
09. public Carro(Resources resources,int id) { 13.
10. super(resources,id); 14. public CarroF(Resources resources, int id) {
11. setY(400); 15. super(resources, id);
12. Log.i(Y,String.valueOf(getHeightScreen()) + - +String. 16. }
valueOf( getHeight())); 17.
13. } 18. public void inicializa() {
14. 19. Random generator = new Random();
15. // Atualiza a posio x do carro 20. speed = generator.nextInt((int) 30) + 5;
16. public void move(float x) { 21. setY(0);
17. setX(getX() + x); 22. setX((generator.nextInt((int) 6) + 1) * 40);
18. } 23. visible = true;
19. 24. }
20. // seta o valor de x, fazendo as verificaes necessrias para 25.
que o carro 26. @Override
21. // no saia da tela 27. public void draw(Canvas canvas) {
22. @Override 28. if (this.visible)
23. public void setX(float x) { 29. super.draw(canvas);
24. if (x< getWidth()) 30. }
25. x = getWidth(); 31.
26. if (x> (getWidthScreen() - getWidth())) 32. public void move() {
27. x = getWidthScreen() - getWidth(); 33. setY(getY() + speed );
28. super.setX(x); 34. }
29. } 35.
30. } 36. // Seta posio y do carro verificando, caso tenha alcanado o final
da tela seta o carro
37. // para no visvel
38. @Override
A classe CarroF (apresentada na Listagem 11), estendida da
39. public void setY(float y) {
classe Sprite, utilizada para controlar os carros adversrios. 40. if (y > (getHeightScreen() - getHeight()))
Nas linhas 18 at 31 temos o mtodo inicializa, que sorteia uma 41. this.visible = false;
42. super.setY(y);
velocidade aleatria. O deslocamento dos carros adversrios se 43. }
d no eixo y, sendo assim, definimos o incio para zero. 44.
A rotina tambm faz o sorteio da posio x do carro. O mtodo 45. public boolean isVisible() {
46. return visible;
draw foi sobrescrito, pois o carro deve ser desenhando apenas 47. }
enquanto estiver visvel na View. O mtodo move foi implemen- 48. }
tado para atualizar a posio y adicionando-se a velocidade em
cada passo. Nas linhas entre 38 e 43 temos a sobrescrita do mtodo
setY(), pois temos um comportamento diferente da classe Sprite, Como foi explorado anteriormente, na classe Barra, podemos
verificando se o valor da propriedade y ultrapassou o tamanho da fazer a animao de outra forma tambm, utilizando-se uma
tela menos o tamanho do carro. Se maior, define a propriedade imagem nica, contendo vrias outras imagens. Conforme vemos
visible para false, pois no mais necessrio desenhar o carro, e na Figura 8, temos uma grande figura contendo 20 frames.
ele ser reaproveitado, reincializando-o.
Para visualizarmos uma faixa simulando uma rua, com uma
faixa, criamos a classe Barra, estendida da classe Sprite, conforme a Figura 8. Sprite utilizado na exploso
Listagem 12. A classe Barra representa um sprite animado, contro- E a animao ocorrer fazendo-se a iterao sobre cada uma. O
lando o frame que deve ser desenhado. A cada iterao, l o respectivo mtodo update faz a atualizao da propriedade currentFrame
bitmap, que ocorre no mtodo atualizaBarra entre as linhas 18 e 42. e verifica se chegou ou no ao fim da animao. Caso o objeto
Esta forma de animao bem simples, porm temos vrios ar- deva ficar em loop, define-se currentFrame para zero, caso con-
quivos de imagens. A classe SpriteAnimado traz outra abordagem trrio define-se a propriedade dispose para True, indicando que
de animao conforme podemos observar na Listagem 13. a animao terminou.
66. if(!loop)
67. dispose = true;
68. }
69.
70. sRectangle.left = currentFrame * width;
71. sRectangle.right = sRectangle.left + width;
72. }
73. }
74.
75. // Desenha o recorte do bitmap.
76. public void draw(Canvas canvas) {
77. Rect dest = new Rect(getX(), getY(), getX() + width, getY() + height);
78. canvas.drawBitmap(bitmap, sRectangle, dest, null);
79. }
80. }
81.
Listagem 14. Arquivo FPSCounter.java Figura 9. Visualizao do jogo
01. package br.com.carrace;
02. Alguns pontos no foram cobertos pelo artigo tais como a utili-
03. import java.text.DecimalFormat; zao de double buffering, surfaceView, interface para definio
04. import android.os.SystemClock;
05. do sprite, dentre outros. Espero que estes pontos possam ser
06. public class FPSCounter { utilizados como sugesto para melhoria futura em seu jogo.
07.
08. public static final DecimalFormat format = new DecimalFormat(###0.00);
09. Luiz Fernando Barbosa
10. private float frames;
11. private String fps;
luizfbarbosa@gmail.com
12. private long start; graduado em Cincia da Computao pela Unitri (Centro Universi-
13. private long current; trio do Triangulo). Trabalha com mobilidade desde 1999, desen-
14. volvendo sistema de fora de vendas. Como hobby desenvolve jogos,
15. public FPSCounter() {
16. start = SystemClock.uptimeMillis(); para PALMOS e Android. Possui MBA em Administrao & Marketing pela
17. frames = 0; FPU (Faculdade Politcnica de Uberlndia), Pos-graduado em Gerncia de Projetos pela
18. fps = ???; Unitri e Pos-graduado em Desenvolvimento JAVA pela Unitri.
19. }
20.
21. public void update() {
22. frames ++; http://code.google.com/android/intro/installing.html
23. current = SystemClock.uptimeMillis();
24. if( current - start > 1000 ){
Descreve a instalao passo a passo do SDK Android
25. fps = format.format(frames);
26. frames = 0;
http://code.google.com/android/intro/anatomy.html
27. start = current; Descreve a anatomia de uma aplicao android.
28. }
29. } http://code.google.com/android/reference/android/app/Activity.html
30.
31. public String getFPS() {
Descreve uma Atividade e seu ciclo de vida
32. return fps;
33. }
http://developer.android.com/guide/topics/ui/menus.html
34. } Descreve a criao de menus
http://developer.android.com/guide/topics/media/index.html
O mtodo draw desenha o respectivo frame na tela. Particular- Descreve o funcionamento do framework de multimdia do sistema
mente esta abordagem mais interessante e at poderia servir de Android
base para a classe Sprite.
http://android-er.blogspot.com/
Para finalizar temos a classe FPSCounter, que pode ser visualizado
Site com bastante contedo e cdigos de exemplo
na Listagem 14. Sua finalidade podermos visualizar a taxa de
atualizao em Frame Rate do jogo.
Aps digitar todas estas classes e executar o seu projeto, o resul- D seu feedback sobre esta edio! eu
Feedback
s
A Mobile Magazine tem que ser feita ao seu gosto. Para isso, precisamos
sobre e
ta
edio
Neste artigo foram apresentados vrios recursos para o desen- D seu voto sobre este artigo, atravs do link:
volvimento de um jogo simples no Android, e atravs da aplicao www.devmedia.com.br/webmobile/feedback
desenvolvida foi ilustrada a aplicao destes conceitos.
C Resumo DevMan
om a disseminao dos smartphones e o uso cada vez
mais frequente da internet, difcil no estar conectado
na rede, acessando o e-mail ou redes sociais, como Face- De que se trata o artigo:
book e Twitter. Todos estes servios disponibilizam um aplicativo Apresentaremos neste artigo a implementao de um aplicativo para o
para uso em smartphones, seja ele Android, iOS ou outro sistema sistema operacional Android utilizando as tecnologias HTML, CSS e JavaS-
operacional. Tais aplicativos so chamados de webapps, ou seja, cript. Para isso, analisaremos como montar o ambiente de desenvolvimento
precisam estar conectados internet para disponibilizarem os utilizando a IDE Eclipse e o Android SDK.
seus servios. Pensando nisso, nesse artigo iremos conhecer o
PhoneGap, um framework que nos auxiliar na criao de apli- Em que situao o tema til:
cativos desse tipo. Este tema til ao abordar mais uma importante ferramenta para o desen-
O PhoneGap um framework voltado para o desenvolvimento volvimento de aplicaes mveis. Apesar de termos estudado apenas a codi-
de aplicaes para dispositivos mveis, open source, multiplata- ficao de um exemplo Android, o PhoneGap tambm pode ser adotado para
forma, com suporte para os sistemas operacionais iOS, Google criar aplicativos para dispositivos como iPhone, BlackBerry, entre outros.
Android, Palm, Symbian e BlackBerry. Com ele possvel desen-
volver aplicaes utilizando as tecnologias JavaScript, HTML Desenvolvendo aplicaes para Android com PhoneGap:
5 e CSS3, dispensando assim o uso de SDKs ou compiladores, Neste artigo destacaremos o desenvolvimento de um aplicativo para o
bastando apenas adicionar um arquivo JavaScript e um JAR para sistema operacional Android utilizando o framework PhoneGap e as tecnolo-
ter acesso a vrias funes de seu smartphone. gias HTML, CSS e JavaScript. Nele, analisaremos tambm o uso do framework
O JavaScript tem se transformado na linguagem de progra- jQuery Mobile para criar uma interface mais amigvel e como configurar um
mao mais popular da web. Inicialmente, no entanto, muitos ambiente de desenvolvimento utilizando a IDE Eclipse e o Android SDK.
profissionais denegriram a linguagem. Com o advento do Ajax,
o JavaScript teve sua popularidade de volta e recebeu mais aten- de informao, tais como o contedo de um correio eletrnico,
o profissional. O resultado foi a proliferao de frameworks e para o servidor. A tendncia mais ampla de programao em Ajax
bibliotecas, prticas de programao melhoradas e o aumento no explora de maneira similar este ponto forte.
uso do JavaScript fora do ambiente de navegadores bem como o Uma JavaScript engine (tambm conhecida como interpretador
uso de plataformas de JavaScript server-side. JavaScript ou uma implementao JavaScript) interpreta cdigo
O uso primrio de JavaScript escrever funes que so em- fonte JavaScript e o executa de forma adequada. A primeira im-
barcadas ou includas em pginas HTML e que interagem com plementao JavaScript foi criada por Brendan Eich na Netscape
o Document Object Model(DOM) da pgina. Alguns exemplos Communications Corporation, para o Navegador Netscape. A
deste uso so: implementao, nomeada SpiderMonkey, implementada em C e
abrir uma nova janela com controle programtico sobre seu vem sendo atualizada para estar em conformidade com a edio 3
tamanho, posio e atributos; do ECMA-262. A implementao Rhino, criada primariamente por
v alidar valores de um formulrio para garantir que so aceitveis Norris Boyd (ex-empregado da Netscape; agora no Google) uma
antes de serem enviados ao servidor; implementao de JavaScript em Java. Rhino, como SpiderMoneky,
m udar imagens medida que o mouse se movimenta sob elas. est em conformidade com a terceira edio do ECMA-262.
Por ser o JavaScript a nica linguagem que a maioria dos na-
Pelo fato do cdigo JavaScript rodar localmente no navegador vegadores populares suportam, tem se tornado uma linguagem
do usurio, e no em um servidor remoto, o navegador pode alvo para muitos frameworks em outras linguagens, a despeito
responder a tais aes rapidamente, aprimorando desta forma o do fato de no ter sido planejado para tal.
tempo de resposta para o usurio. Alm disso, o cdigo JavaScript Atualmente o PhoneGap se encontra na verso 1.0, e alguns dos
pode detectar aes de usurio que o HTML sozinho no poderia, destaques deste release so:
tais como teclas pressionadas individualmente. Aplicaes como API mais estvel;
Gmail tomam vantagem disso: muito da lgica da interface do Arquitetura plugvel, permitindo a criao de componentes;
usurio escrita em JavaScript, e o JavaScript envia requisies Compatibilidade com acesso a dados padronizados pelo W3C;
Possibilidade de manipulao dos contatos da agenda telefnica. facilidade de configurao. Para podermos utilizar os recursos
do Android no Eclipse, o Google disponibiliza um SDK que for-
Alm destes, o framework oferece diversos recursos que auxi- nece uma mquina virtual, suporte para mdias de udio, vdeo
liam o seu uso. A Figura 1 apresenta os recursos suportados em e imagem, nos formatos MPEG4, H.264, MP3, AAC, AMR, JPG,
cada plataforma. PNG, GIF, bem como acelerador grfico 3D, baseado no OpenGL.
Deste modo, faa o download do SDK no link http://developer.
android.com/sdk/index.html.
Agora, acesse o diretrio onde foi realizada a instalao do
Android SDK, execute o aplicativo SDK Manager, escolha a opo
Available Packages e a plataforma Android 2.1. Por fim, selecione
Install Selected, conforme a Figura 2.
package br.com.devmedia;
import android.os.Bundle;
import com.phonegap.*;
Permisso Descrio
android.permission.CAMERA Permite acesso aos recursos da cmera.
android.permission.VIBRATE Permite acesso aos recursos de vibrao do aparelho.
android.permission.ACCESS_COARSE_LOCATION Permite acesso aos recursos de nveis de preciso de latitude (menos preciso).
android.permission.ACCESS_FINE_LOCATION Permite acesso aos recursos de nveis de preciso de latitude (mais preciso).
android.permission.READ_PHONE_STATE Permite acesso leitura da ligao em andamento.
android.permission.INTERNET Permite acesso internet.
android.permission.RECEIVE_SMS Permite acesso a receber SMS.
android.permission.RECORD_AUDIO Permite gravao de udio.
android.permission.MODIFY_AUDIO_SETTINGS Permite acesso configurao de udio.
android.permission.READ_CONTACTS Permite acesso aos contatos telefnicos.
android.permission.WRITE_CONTACTS Permite acesso a gravar contatos telefnicos.
android.permission.WRITE_EXTERNAL_STORAGE Permite acesso a gravar arquivos.
android.permission.ACCESS_NETWORK_STATE Permite acesso rede.
android.permission.GET_ACCOUNTS Permite acesso s contas.
Tabela 1. Permisses de acesso do aparelho para a aplicao
pginas que utilizarem o jQuery Mobile, o filho imediato de uma caso voc deseje alinhar os botes. Por padro, um elemento
page so divs contendo tags data-roles header, content preenche toda a tela.
e footer, sendo estas, respectivamente, cabealho, contedo e
rodap.
Para montarmos as nossas pginas, precisamos seguir essa
sequncia do template. Na tag <div> com data-role=header,
colocamos informaes referentes ao cabealho, um nome
para a aplicao ou informaes adicionais. J a tag <div data-
role=content> definir o contedo principal; no nosso caso, as
informaes do cronmetro e os botes do formulrio. Por fim, na
<div data-role=footer>, poderemos inserir os menus ou outras Figura 10. Alinhando os botes da interface.
informaes. A Listagem 8 apresenta o cdigo que emprega os
recursos do jQuery Mobile em nosso projeto. Para finalizar a interface do cronmetro vamos customizar os
seus botes. Portanto, crie um arquivo de folha de estilo (cronome-
Listagem 8. jQuery Mobile em ao.
tro.css) conforme a Listagem 10 dentro da pasta asserts/css.
<div data-role=page>
<div data-role=header> Listagem 9. Adicionando recursos do jQuery Mobile.
<h1>Cronometro</h1>
</div> <header>
<div data-role=content> ...
<span id=chronotime>0:00:00:00</span> <link rel=stylesheet href=style/cronometro.css />
<form name=chronoForm id=chronoForm> ...
<input type=button name=startstop value=start! </header>
onClick=chronoStart() />
<input type=button name=reset value=reset! ...
onClick=chronoReset() /> <form name=chronoForm id=chronoForm>
</form> <input type=button name=startstop value=start!
</div> data-inline=true data-theme=b onClick=chronoStart() />
<div data-role=footer>...</div> <input type=button name=reset value=reset! data-inline=
</div> true onClick=chronoReset() />
... </form>
#chronotime {
Ao executarmos novamente a aplicao, teremos o resultado font-size: 90px;
apresentado na Figura 9. }
#chronoForm {
margin-left: 100px;
}
s
D
de programao e membro dos grupos Java-RN e PSL-RN. A Mobile Magazine tem que ser feita ao seu gosto. Para isso, precisamos
sobre e
saber o que voc, leitor, acha da revista!
s
ta
edio
D seu voto sobre este artigo, atravs do link:
www.devmedia.com.br/webmobile/feedback
Utilizando sons e imagen
O Resumo DevMan
uso de mdias nos aplicativos extremamente comum,
desde sinais de alertas em aplicativos convencionais at
sua vital importncia em jogos. Podemos encontrar desde De que se trata o artigo:
simples toques polifnicos at mesmo sons em trs dimenses, O artigo mostra uma parcela pequena da API de mdia do Android utilizando
com diversos efeitos sonoros, mudando consideravelmente a per- dois exemplos. O primeiro um aplicativo de streaming de mdia, que pode
cepo do usurio em relao ao aplicativo que ele est usando. ser facilmente transformado em uma aplicao completa para rdios. O
O uso da mdia tambm est sendo utilizado na entrada de segundo exemplo mostra um lbum de fotos capturadas e persistidas pela
dados. Alm dos teclados convencionais, as telas touchscreen, j prpria aplicao. Este artigo pode ser utilizado por programadores iniciantes
encontramos sites e aplicativos que requisitam que o usurio fale na tecnologia Android, que visam tornar mais atrativo suas aplicaes a partir
a informao que deseja inserir no software. de recursos multimdias.
Para telefones celulares e smartphones a importncia das
mdias se torna ainda maior devido ateno que o usurio Em que situao o tema til::
pode dar ao aparelho. Por exemplo: o motorista est dirigindo A grande maioria dos aplicativos, sejam eles Android ou outra plataforma,
pela auto-estrada quando recebe uma mensagem de SMS. Caso ter em algum ponto uma interao com o usurio atravs de mdias, sejam
ele precise olhar para o visor do aparelho, estar deixando de elas udio, vdeo ou apenas imagens. Sendo assim, o conhecimento aqui
prestar ateno onde mais importa, na estrada. Se a mensagem reproduzido pode ser produzido em um nmero muito grande de casos.
fosse lida de forma automtica e reproduzida no sistema de
som do prprio automvel, o risco de um acidente diminuiria Utilizando sons e imagens em aplicaes Android:
consideravelmente. Este artigo cria dois aplicativos, um para acessar o streaming de udio de
Outro ponto muito importante na ajuda a deficientes visuais. uma rdio e, o segundo, para capturar e armazenar um conjunto de fotos.
Apesar da conscincia em relao usabilidade e acessibilidade Iremos trabalhar principalmente com a classe MediaPlayer, que permite tocar
ter aumentado nos ltimos anos, ainda pouco provvel encon- arquivos de mdias internos e externos e, criar um player de streaming de
trarmos um aplicativo para celular ou smartphone que mostre msica. Alm disso, tambm veremos como trabalhar com um importante
duas informaes na forma textual e oral. conceito do Android, um Service.
Temos alguns poucos exemplos que podem ser citados aqui.
LookTel: assistncia a cegos e deficientes visuais. Aparelhos
celulares so usados para reconhecer e identificar de maneira Conhecendo o Android
audvel objetos e locais, de forma quase instantnea; A plataforma Android, criada por um consrcio de empresas
SeeScan: possui o mesmo objetivo do anterior. lideradas pelo Google, fornece um sistema operacional, um am-
biente de desenvolvimento completo para programadores e uma
Mas, felizmente para ns programadores, todas as plataformas loja virtual com milhares de opes. Seu ncleo baseado em
mobile de hoje apresentam APIs que nos permitem inserir e cap- Linux e a grande maioria das bibliotecas que compe o Android
turar udio e vdeo em nossos aplicativos. At mesmo algumas de cdigo aberto.
tecnologias um pouco mais antigas j permitiam isso, como o O Android pode ser dividido em partes, como mostrado na Figura 1.
caso do Java ME. Algumas delas mais atuais fornecem suporte No seu ncleo mais bsico temos o kernel Linux. Alm disso, os
inclusive a Text to Speech e Speech to Text. O Android no foge drivers que gerenciam todos os processos e fazem a ligao da
a regra. parte de software com as partes de hardware que compe o device.
A plataforma do Google fornece um conjunto de classes e m- Logo acima teremos as bibliotecas (libraries), que permitem aos
todos completos para trabalho com mdia. desenvolvedores acessarem um banco de dados relacional SQLIte,
Neste artigo vamos falar do suporte a udio e vdeo dentro da por exemplo. Ou ainda, criar interfaces grficas complexas com
plataforma do Google, alm disso, tambm discutiremos como OpenGL e SurfaceManager. O Android Runtime contm a mquina
trabalhar com Text to Speech. Para facilitar o aprendizado, o texto virtual Java, chamada no ambiente criado pelo Google de Dalvik.
acompanhar o desenvolvimento de dois aplicativos como provas A camada de Application Framework utilizada pelos aplicativos
de conceito. nativos do aparelho, como por terceiros que desejem criar software
para a plataforma. Um ponto interessante do Android est no fato ento, inicio uma aplicao que verifica o nmero de discagem e
das aplicaes terem o mesmo poder, a mesma importncia dentro mostra um som caso o nmero seja igual a determinado nmero.
da arquitetura. Isso difere bastante do Java ME, onde, os nossos Service: Definio de um servio que rodar em background.
aplicativos eram tratados quase que como vrus pelo Symbian. Alm disso, o mesmo s ser descartado pelo sistema operacional
e seu gerenciamento de memria em caso extremamente crtico.
Content Resolver: Permite que dados de uma aplicao se tor-
nem visveis a outros aplicativos, sejam eles de terceiros ou no.
try {
1: String url = http://xxx.xxx.xx.xxx:50000/; // your URL here
2: MediaPlayer mp = new MediaPlayer();
3: mp.setDataSource(url);
4: mp.prepare();
5: mp.start();
} catch (IllegalArgumentException e) {
} catch (IllegalStateException e) {
} catch (IOException e) {
}
Figura 3. Ciclo de vida MediaPlayer
Na primeira linha cria-se uma instncia de String apontando Por exemplo. Ao chamar o mtodo setDataSource, o player pas-
a localizao do recurso externo. Logo em seguida feita a ini- sa para o estado Initialized. Neste momento podemos chamar o
cializao do objeto MediaPlayer, porm, chamando o construtor mtodo prepare() que far com que o estado mude para Prepared e
padro, sem argumentos. Na linha 3 utilizamos o mtodo setDa- posteriormente, ao chamar start(), o estado passa para Started.
taSource passando como parmetro a varivel url j criada. Desta Alguns pontos importantes que merecem destaque. Ao cha-
forma, o player de msica saber de onde ler a informao de mar o mtodo prepare(), como dito anteriormente, ele ir buscar
mdia. e decodificar os dados oriundos da fonte de dados informada.
O mtodo prepare da linha 4 bem sugestivo. Isso porque sua Porm, a mdia por ser muito extensa, ou ainda, a conexo com
funo preparar o incio da mdia, ou seja, ele quem busca a a internet naquele momento pode estar muito debilitada, atra-
mdia e decodifica os dados. Finalmente, depois de tudo arquite- sando o incio do player. Caso isso ocorra, nossa aplicao iria
tado e organizado pelo mtodo anterior, basta chamar o mtodo ficar travada ocasionando o erro chamado de Application Not
start (ler Nota DevMan 2). Responding (ANR).
@Override
protected void onStop() {
<service android:name=.MyService/>
mediaPlayer.release();
mediaPlayer = null;
epare que devemos declarar um servio assim como o fazemos
R
super.onStop();
} com Activitys. Logicamente, a classe MyService j deve existir no
seu classpath e deve obrigatoriamente herdar da classe Service:
Mas o que isso tem a ver com o ciclo de vida da mdia? Depen-
dendo da arquitetura da aplicao e da forma de entrada e sada public class MyService extends Service {
@Override
do mesmo, a mdia no vai liberar todos os seus recursos quando
public IBinder onBind(Intent arg0) {
a tela chamar o onStop. Ela poder simplesmente querer pausar a // TODO Auto-generated method stub
mdia e quando a Activity for recriada, reiniciar a mesma. return null;
}
Neste caso, o mtodo stop() da MediaPlayer poderia ser chamado. }
Neste ponto o ciclo de vida da mdia iria para o estado Stopped.
Para tocar a mdia novamente posteriormente, deve-se preparar a O nico mtodo de implementao obrigatrio o onBind. Este,
mdia novamente. Uma simples chamada a start() quando a mdia por sua vez, retorna uma instncia de IBinder, permitindo uma
est Stopped vai gerar uma Exception. comunicao direta entre o cliente (no caso geralmente uma
opo FLAG_UPDATE_CURRENT. Esta flag dita que se esta A interface grfica extremamente simples. Prova disso o ar-
PendingIntent j existir, o mesmo ser mantido, porm, seus dados quivo xml que representa a tela apresentado na Listagem 7.
sero atualizados.
A linha 7 define as informaes visuais da notificao (Figura 5). Listagem 7. Arquivo de layout.
No primeiro parmetro do mtodo setLatestEventInfo passamos
uma instncia de Context. Na sequncia, o ttulo. Depois o texto 1: <?xml version=1.0 encoding=utf-8?>
2: <LinearLayout xmlns:android=http://schemas.android.com/apk/res/
que descreve a notificao. Por fim, uma instncia de PendingIntent, android
que ser utilizada quando o usurio clicar ou tocar na notificao android:orientation=vertical android:layout_width=match_parent
expandida na tela. android:layout_height=match_parent>
3: <Gallery xmlns:android=http://schemas.android.com/apk/res/android
android:id=@+id/gallery android:layout_width=fill_parent
android:layout_height=wrap_content />
Listagem 6. Cdigo para apresentar a notificao. 4: <ImageView android:id=@+id/img
android:layout_width=wrap_content android:layout_height=
1:Notification notification = new Notification(); wrap_content/>
2:notification.tickerText = Streaming udio; 5: </LinearLayout>
3:notification.icon = android.R.drawable.ic_media_play;
4:
5:PendingIntent pi = PendingIntent.getActivity(getApplicationContext(), 0,
new Intent(getApplicationContext(), WorkingWithMediaActivity.class), Na segunda linha temos um LinearLayout com orientao
PendingIntent.FLAG_UPDATE_CURRENT);
6:
vertical (android:orientation). Na linha 3 definimos uma galeria
7:notification.setLatestEventInfo(getApplicationContext(), Rdio, (Gallery). Por fim, na linha 4 definimos uma tag ImageView.
Playing: Streaming Rdio, pi); O funcionamento do aplicativo muito simples. Ao capturar
8:
9:startForeground(19, notification);
uma foto a galeria da parte superior atualizada, ao clicar em
um dos thumbs a imagem visualizada em tamanho maior no
centro da tela.
Por fim, a linha 9 chama o mtodo startForeground para fazer o Na pasta res do projeto adicione uma pasta chamada menu.
servio ser executado em primeiro plano, fornecendo uma notifi- Dentro da mesma, crie um arquivo chamado menu.xml. Popule-o
cao passada por parmetro enquanto este estado for mantido. com o seguinte cdigo:
Com isso, finalizamos nosso primeiro estudo de caso sobre uso
de mdias em Android. <?xml version=1.0 encoding=utf-8?>
<menu xmlns:android=http://schemas.android.com/apk/res/android>
<item android:id=@+id/menuCapturar
Segundo Aplicativo - lbum de Fotos android:icon=@android:drawable/ic_menu_add
android:title=Capturar />
Nosso segundo aplicativo mostrar apenas um lbum de fotos
</menu>
de imagens capturadas apenas pelo nosso cdigo. Infelizmente o
simulador tem problemas ao trabalhar com captura de imagens, O nico ponto de ateno no android:icon. No estamos usan-
porm, ele funciona perfeitamente no aparelho. A Figura 6 mostra do uma imagem que est no res/drawable do nosso projeto, mas
o aplicativo funcionando em um Samsung Galaxy S. sim, nos recursos do prprio Android. Para que a explicao
fique clara. Veja a Figura 7. Ela mostra a estrutura de um pro-
jeto Android tpico. Para acessarmos as imagens que esto no
nosso path, ou seja, nas pastas que iniciam com drawable, basta
usar a notao @drawable/nome_da_imagem. Mas o Android nos
permite ir alm, acessando as imagens que so usadas pelo
prprio sistema operacional. Para tanto, basta utilizar a notao
@android:drawable/_nome_da_imagem.
A Activity tem seu escopo bsico j conhecido pelo leitor e est
apresentada na Listagem 8. O mtodo onCreate ser chamado
no incio do ciclo de vida da activity, ento, mostraremos o seu
contedo grfico (linha 8). Estamos usando a classe R que defi-
ne os recursos. Perceba que apontamos para o caminho layout,
e, para seu arquivo main.xml. Logo que o projeto construdo
este arquivo j construdo de forma automtica pela IDE.
O primeiro passo na construo do aplicativo sobrescre-
ver os mtodos onCreateOptionsMenu e onOptionsItemSelected
conforme Listagem 9. O primeiro define os itens de menu e o
Figura 6. Aplicativo de fotos no Galaxy S segundo chamado quando o usurio seleciona o menu.
momento. No mtodo onCreate, vamos adicionar um try-catch (ler Na linha 1 definimos uma constante que aponta para o path
Nota DevMan 4): onde todas as capturas de tela esto sendo armazenadas. A linha
3, j dentro do mtodo, faz uso desta varivel para criar uma
public void onCreate(Bundle savedInstanceState) { instncia de File.
super.onCreate(savedInstanceState);
setContentView(R.layout.main); A classe File tem um mtodo muito til: listFiles. Seu retorno um
vetor de instncia da mesma classe. Mas, neste caso, teremos todos
try {
os arquivos persistidos dentro da pasta. Logo, nossas imagens.
readSDCard();
} catch (Exception e) {} O vetor criado na linha 6 ir armazenar as instncias de Bitmap. A
} linha 7 apresenta um lao for, que vai desde o ndice 0 at o nmero
de files encontrado no path especificado na constante FILE_PATH.
Na linha 8 apenas recuperamos a instncia de File do Vector.
Nota do DevMan 4 Na linha 10 estamos literalmente criando um Bitmap. A classe
Media nos oferece um mtodo getBitmap, este, por sua vez, aceita
Activity: Uma Activity tambm possui um ciclo de vida bem definido.Para entend-lo completamente dois parmetros: uma instncia de ContentResolver e, uma URI.
acesse este link: http://developer.android.com/reference/android/app/Activity.html. Este caminho foi especificado pelo mtodo fromFile da classe
Neste momento, o importante entender o papel do onCreate: o mesmo chamado quando a URI. Com isso, pegamos a representao textual do caminho
activity criada pela primeira vez, ou, quando a orientao da tela muda. E o mais importante, especificado pelo File.
quando a activity removida da visualizao do usurio e depois volta ao foreground, o onCreate
chamado novamente. Na linha 13 recuperamos o ImageView declarado no XML de
layout. Na linha seguinte definimos que a imagem que esta view
receber o primeiro elemento do vetor de Bitmaps recm criado.
O OnCreate constri a tela. Isso quer dizer que, uma vez que o Isso porque em um primeiro momento a galeria ter seu primeiro
layout definido no main.xml mostrado ao usurio, neste mo- ndice selecionado.
mento que devemos buscar no sistema de arquivos do aparelho as Na linha 16 recuperamos o Gallery declarado no main.xml. Na
fotos capturadas pelo nosso aplicativo. O mtodo readSDCard faz linha seguinte definimos seu adaptador. Este conceito est muito
exatamente isto conforme podemos observar na Listagem 11. presente no Android. Um adapter faz a ligao entre a interface
de um componente e suas informaes. Para quem programou
Listagem 11. Mtodo readSDCard. com o Java Swing, existe uma semelhana com o modelo MVC
adotado por esta (ler Nota DevMan 5).
View.ScaleType tem constantes para diferentes tipos. O que estamos A Mobile Magazine tem que ser feita ao seu gosto. Para isso, precisamos
sobre e
ta
edio
acaso especificado na linha anterior. Se a imagem for menor que D seu voto sobre este artigo, atravs do link:
200x200 ser escalada para ficar maior e, caso contrrio, escalada www.devmedia.com.br/webmobile/feedback
para ficar menor.
M Resumo DevMan
ultimdia um termo que se refere tecnologia digital
utilizadas para criar, manipular, armazenar e pesqui-
sar contedos que foge do tradicional contedo texto. De que se trata o artigo:
No incio, esse recurso era quase que exclusivo dos programas Este artigo apresenta a utilizao de dados multimdia em aplicaes Java
Desktop, j que a Internet na poca era muito limitada, sendo que ME. Para exemplificar estes recursos, so utilizados imagens simples e din-
a maioria das pessoas acessavam a rede utilizando modem que micas, execuo de sons nativos do aparelho celular e sons de arquivos, e por
chegavam no mximo a 56 Kpbs, inviabilizando com isso a trans- fim, reproduo de arquivos de vdeo e animao. Em alguns momentos, a
misso de vdeos, sons e muitas vezes at imagens maiores. Mobile Media API foi utilizada.
Porm, a informtica evoluiu muito daquela poca para os dias
de hoje, assim como as redes de comunicao. Hoje possvel Em que situao o tema til:
assistir vdeos online em sites de compartilhamento de contedo, Este artigo pode ser til a acadmicos e estudantes que desejam utilizar
ouvir rdios de todas as partes do mundo atravs da Internet, e dados multimdia em suas aplicaes, bem como a desenvolvedores mais
at mesmo assistir algumas emissoras de TV, isso graas evo- experientes que desejam fazer uso destes recursos.
luo da rede de comunicao, aos softwares de compactao de
vdeo, som e imagem, e principalmente aos computadores, que Trabalhando com dados multimdia em aplicaes CLDC/MIDP com Java ME:
deixaram de ser dispositivos limitados e passaram a ser fonte de Este artigo apresenta de forma simples a utilizao dos recursos bsicos
entretenimento. de multimdia em aplicaes Java ME. Dessa forma, pode ser utilizado por
Da mesma forma, a telefonia celular evoluiu muito, e contamos programadores iniciantes na tecnologia, uma vez que o exemplo apre-
hoje com aparelhos que so verdadeiros computadores, com alta sentado desenvolvido passo a passo, procurando facilitar ao mximo o
velocidade de processamento, grande capacidade de armaze- desenvolvimento do aplicativo completo. Aos usurios avanados, poss-
namento, telas grandes e de alta resoluo para visualizao de vel visualizar em poucas linhas de cdigo a apresentao e reproduo de
contedo, alto falantes polifnicos para reproduo de sons ainda recursos multimdia.
mais sofisticados, inclusive sons estreos e com efeitos 3D, sem
contar com o acesso a uma rede cada vez mais rpido, onde no Nesse novo cenrio, os aplicativos para celulares podem utilizar
necessrio conexo via cabo ou wi-fi, dessa forma, podemos ter recursos at ento presentes apenas nos computadores mais avan-
acesso a rede de dados da operadora com custo cada vez menor. ados, e com certeza o maior de todos os recursos a integrao
Na Figura 1 so apresentados alguns exemplos de telas de jogos das vrias mdias: som, vdeo e imagem, que juntas permitem o
com recursos multimdia disponveis para aparelhos celulares desenvolvimento de softwares e jogos cada vez mais atraentes.
hoje. E na grande revoluo que estamos vivendo na telefonia mvel,
uma linguagem tradicional ainda recebe destaque: a linguagem
Java ME, esta madura, estando no mercado a mais de 10 anos.
Com Java ME possvel desenvolver aplicativos para vrios
tipos de dispositivos, incluindo aparelhos celulares (dos antigos
celulares que ainda no contavam com cmera digital, bluetooth
ou recursos multimdia) at os mais modernos smartphones, que
dispem de inmeros sensores, receptores GPS, conectividade via
bluetooth, wi-fi, GPRS, infravermelho, cabo, carto de memria,
etc, etc e etc.
Alm disso, esta tecnologia permite o desenvolvimento de apli-
caes para uma grande quantidade de outros dispositivos limita-
dos, porm, nem sempre pequenos, como a TV Digital, os Smart
Cards, a utilizao em circuitos digitais com tecnologias como
TINI, at sua utilizao em brinquedos, como Lego Mindstorm
Figura 1. Exemplos de jogos com recursos multimdia utilizados em aplicaes para celular (http://mindstorms.lego.com/), este apresentado na Figura 2.
Nota do DevMan 2
Listener: Um listener pode ser entendido como um rob que fica esperando que alguma ao ocorra
para avisar o seu aplicativo que algo ocorreu. Falando especificamente da MMAPI, esse rob espera
por mudanas no estado de um Player, como as que ocorrem quando voc chama o mtodo start().
O prximo passo desenvolver o fluxo componente que deve ser renomeado para da linha 06 pode gerar uma exceo, se a
da aplicao, para isso, deve-se utilizar os fmImagem receber apenas um Comando imagem est referenciada de forma errada
componentes visuais presentes na catego- Voltar, este presente na categoria Coman- (caminho errado ou diferena entre mais-
ria Exibies. O resultado do modo fluxo dos da paleta de componentes. cula e minscula no nome da imagem).
apresentado na Figura 8. Voltando ao lsPrincipal, a segunda opo A linha 06 tem a funo de criar um obje-
Como pode ser observado, aps o incio Exemplo Som, que apresentar uma lista to do tipo javax.microedition.lcdui.Image.
apresentada a tela lsPrincipal, este um chamada lsSom. Esta lista possui os Ele- Esta imagem criada a partir do caminho
componente Lista (categoria Exibies da mentos da Lista Som Erro, Som Ateno, passado por parmetro (a imagem foi co-
Paleta de Componentes). Este componente Som Wav e Voltar. piada para a pasta do projeto, dentro do
formado por 4 Elementos da Lista, pre- Por fim, a opo Exemplo Vdeo do ls- pacote res.image).
sentes na categoria Elementos da paleta de Principal apresentar uma lista chamada Na linha 08 esta imagem adicionada ao
componentes. So eles: Exemplo Imagem, lsVideo, contendo os Elementos da Lista formulrio fmImagem, que por sua vez
Exemplo Som, Exemplo Vdeo e Sair (ler Animao Canvas, Vdeo MPEG e Voltar exibida na linha 10. Caso ocorra alguma
Nota DevMan 4). (ler Nota DevMan 5). exceo, o cdigo do catch executado
Ao ser selecionada a opo Exemplo Ima- Uma vez desenvolvido o fluxo, vamos (linha 13), o qual apresentar na console de
gem, uma nova lista ser apresentada, esta adicionar a lgica no clique de cada opo desenvolvimento a mensagem de erro.
chamada lsImagem, contendo os seguintes de tela existente neste aplicativo. Iniciando J o mtodo usandoImageItem() faz uso
Elementos da Lista: Usando Form, Usando pela apresentao das imagens, necess- de um componente visual de formulrio,
ImageItem, Usando ChoiceGroup, Usando rio clicar com o boto direito sobre cada este presente em javax.microedition.lcdui.
Alert, Usando Canvas e Voltar. Esta lista opo do lsImagem, selecionando Ir para
tem a opo de apresentar imagem nos o Cdigo Fonte. Cada opo executar um
componentes visuais mais utilizados da mtodo especfico, conforme apresentado
plataforma Java ME tradicional. na Listagem 1.
Nota do DevMan 3
Para apresentar os componentes visuais apresentado erro no cdigo fonte re-
Tamanho dos arquivos: Devido a uma limitao dos aparelhos
citados, necessrio adicionar ao fluxo ferente a chamada dos mtodos, isto por mais antigos, bem como do emulador, deve-se evitar arquivos
um componente Formulrio (Categoria que estes no foram codificados ainda, com tamanho grande. Procure, sempre que possvel, utilizar
Exibies da paleta de componentes). Este dessa forma, ao final do cdigo fonte, os arquivos de at 100Kb, j que os aparelhos antigos possuem um
tamanho de jar que deve ser respeitado..
mtodos devem ser codificados, conforme
Listagem 2.
Inicialmente foi codificado o mtodo
usandoForm(), o qual tem a funo de Nota do DevMan 4
criar uma imagem e coloc-la diretamente
dentro de um componente Formulrio. Programao Visual no Netbeans: Para um melhor
Assim, inicialmente na linha 03 so ex- aproveitamento deste artigo, interessante que se conhea
cludos todos os componentes visuais do a programao visual do ambiente Netbeans, sendo este
apresentado com detalhes na Revista Web Mobile nmero 6.
formulrio fmImagem. Neste, so apresentadas dicas de como renomear os componentes
Como o trabalho com arquivos pode visuais, que conseguido clicando duas vezes sobre o nome do
componente ou ainda selecionando este e clicando com o boto
gerar erro (excees), obrigatria a codifi-
direito opo Renomear. Outra dica importante realizar
cao do try-catch (linha 05), pois o cdigo chamada de novas telas no modo fluxo do aplicativo, para isso,
Figura 7. Estrutura de pasta com os arquivos de mdias
basta clicar no comando/item que gera o evento, arrastar o mouse
e soltar sobre a tela que ser apresentada.
Nota do DevMan 5
Formato dos arquivos: O exemplo do artigo utiliza os formatos
de arquivos aconselhados para aplicaes mveis, sendo eles o
formato PNG para imagens, WAV para sons e MPEG para vdeo,
sendo que a maioria dos aparelhos celulares, mesmos os mais
antigos, do suporte a estes arquivos. Porm, outros tipos de
arquivos tambm podem ser utilizados, como o formato JPEG
ou GIF para imagens, GIF animado para vdeo e MP3 para som.
Entretanto, importante verificar se o aparelho que executar sua
aplicao compatvel com estes ltimos formatos citados.
Figura 8. Visualizao do modo fluxo do aplicativo desenvolvido
ImageItem. Para utiliz-lo necessrio ins- Seguindo, das linhas 52 a 54 so adicionados imagens disponveis na pasta do projeto.
tanciar um objeto de imagem (linha 23), as- ao ChoiceGroup suas opes, estas formadas Para o exemplo, foi utilizado PNG, mas
sim como instanciar o objeto ImagemItem por um texto e uma imagem. Finalizando o outros tipos tambm so suportados em
(linha 25). Este objeto espera por parmetro mtodo, na linha 56 adicionado ao formu- alguns aparelhos, como JPEG e GIF, sendo
em seu construtor o ttulo para a imagem, a lrio fmImagem o componente ChoiceGroup, que o procedimento para usar estes forma-
imagem instanciada na linha 23, um layout assim como o formulrio tela (linha 58). tos o mesmo que o utilizado para PNG.
(para o exemplo, a imagem foi apresentada Outro componente visual que tambm J no mtodo usandoCanvas() linha
centralizada) e um texto alternativo, caso a utiliza imagem o Alert, que utilizado 83 utilizado um recurso avanado de
imagem no consiga ser apresentada. para apresentar um texto informativo por desenho em tela, que a partir do Canvas
Em seguida, este ImageItem adicio- alguns segundos ao usurio. Assim, o mto- permite desenhar na interface do aparelho
nado ao formulrio (linha 29), sendo o do usandoAlert() exemplifica sua utilizao, utilizando recursos de baixo nvel, sendo
formulrio adicionado a tela do celular sendo criada uma imagem na linha 70 e um este o procedimento preferido para o desen-
(linha 31). componente do tipo javax.microedition. volvimento de jogos e telas que fogem dos
O terceiro mtodo faz uso de outro com- lcdui.Alert na linha 72. Este componente componentes tradicionais do Java ME.
ponente visual que permite imagens, este Alert espera em seu construtor apenas o Sendo assim, um canvas deve ser apre-
chamado ChoiceGroup, assim, para este ttulo da Janela. sentado na tela do celular, e para o exem-
exemplo, trs componentes Image foram Seguindo, na linha 73 adicionada a plo, foi utilizado um objeto annimo,
criados (linhas 45 a 47), sendo na linha 49 imagem ao componente Alert, sendo este este passado por parmetro no mtodo
instanciado um objeto javax.microedition. apresentado no display do celular pelo co- setCurrent() linha 85.
lcdui.ChoiceGroup. O construtor desta mando da linha 75. O segundo parmetro do No canvas, obrigatrio o desenvolvi-
classe espera um texto para o componente, comando informa que tela ser exibida aps mento do mtodo paint, que ser respons-
bem como um modo de funcionamento, o Alert desaparecer. vel por pintar a tela do dispositivo. Nesse
que para o exemplo foi utilizado EXCLU- Nos cdigos apresentados at o mo- contexto, a tela do dispositivo represen-
SIVE (apenas um elemento pode ser sele- mento, foram utilizados componentes da tada pelo objeto Graphics linha 85.
cionado de cada vez). plataforma Java ME para apresentao de Para se desenhar na tela, deve-se utili-
zar sempre definir a cor para desenho e
em seguida realizar a operao desejada.
Isto exemplificado neste mtodo, ini-
cialmente, na linha 89, definida a cor de
desenho para preto, sendo que o mtodo
setColor() espera os parmetros referentes
ao RGB (Red, Green e Blue, em portugus,
Vermelho, Verde e Azul). Como todos os
parmetros foram passados como 0, isso
indica a cor preta.
Seguindo, a linha 90 desenha um retn-
gulo preenchido, este iniciando na posio
0 e 0 da tela (eixo x e y), se estendendo at
a largura e altura da tela, estes recupera-
dos pelos mtodos this.getWidth() e this.
getHeight().
J as linha 92 e 93 definem a cor de dese-
nho para azul (255 o valor mximo permi-
tido para um parmetro de cor, desta forma,
a cor formada no possui informaes para
vermelho, verde e possui o valor mximo
para azul), sendo desenhada uma linha
reta, que inicia na posio 50 e 50 (x e y), se
estendendo at a posio 300 e 300 da tela.
Executando o programa, o mesmo apre-
senta as telas correspondentes aos com-
ponentes visuais e as imagens, conforme
Figura 9.
Figura 9. Exemplos de talas utilizando imagens em Java ME.
na sequncia utilizado recursos da MMAPI, a partir da classe 01. private void executarSomErro() {
Player. Assim, a classe Manager instancia um player passando por 02. AlertType.ERROR.playSound(getDisplay());
03. }
parmetro o Stream e o tipo do udio, no formato de MIME type.
04.
A Tabela 1 apresente os tipos de arquivos compatveis com Java 05. private void executarSomAtencao() {
ME, bem como seus MIME type. 06. AlertType.WARNING.playSound(getDisplay());
07. }
08.
MIME Type Descrio
09. private void executarSomWav() {
audio/midi Scalable Polyphony MIDI 10.
11. try {
audio/x-tone-seq MIDP 2.0 tone sequence
12. InputStream is = getClass().getResourceAsStream
audio/x-wav WAV PCM sampled audio (/res/audio/som.wav);
13.
image/gif FIG 89a (animated GIF) 14. Player tocaSom = Manager.createPlayer(is, audio/x-wav);
video/mpeg MPEG vdeo 15.
16. tocaSom.start();
video/vnd.sun.rgb565 Video capture 17.
18. } catch (IOException e) {
Tabela 1. Tipos de arquivos compatveis 19. e.printStackTrace();
20. } catch (MediaException e) {
Para finalizar, o player executado na linha 16 a partir do co- 21. e.printStackTrace();
22. }
mando start(). 23. }
Finalizando o aplicativo, vamos fazer uso de vdeo no Java ME. 24. } //fim da classe principal - MIDlet
Assim como os recursos anteriores, necessrio clicar com o
boto direito sobre as opes Animao Canvas e Vdeo MPEG,
realizando a chamada dos respectivos mtodos que so apresen- O segredo da animao est na linha 07, onde foi criada uma
tados na Listagem 5. nova Thread que ser executada em paralela ao programa. Dentro
Inicialmente ser apresentado o procedimento para criar uma desta Thread, mais especificamente no mtodo run() linha 09,
animao em Canvas, desta forma, ao longo do tempo, sero rea- executado um looping infinito (linha 11), que ir redesenhar a tela,
lizadas vrias execues dessa rotina em um segundo, alterando porm, para no ser executado muito rpido, na linha 16 acontece-
a posio de um desenho na tela do computador, o que dar a r uma pausa de 80 mili-segundos na execuo, que corresponde
impresso de um vdeo. a uma frequncia de 12 fps (frames por segundo).
Para isso, necessrio trabalhar com Canvas, sendo criada uma J a classe ExecutaAnimacaoCanvas linha 33 possui duas va-
classe chamada ExecutaAnimaoCanvas (linha 33), esta instan- riveis de classe chamadas x e y (linhas 35 e 36) que correspondem
ciada na linha 03 e apresentada na tela na linha 05. a posio onde o objeto ser desenhado. Dessa forma, no mtodo
paint(), este chamado inmeras vezes pela linha 13 do cdigo, de- No ExecutaVideoCanvas, em seu mtodo construtor, instancia-
senha na tela um retngulo branco (linhas 40 e 41), que corresponde do um Stream com as informaes contidas no arquivo de vdeo
ao fundo da tela. Este ocupa a tela toda (canto superior esquerdo MPEG armazenada na pasta do projeto Linha 57.
corresponde a 0 e 0, canto inferior direito corresponde a largura Na linha 59 criado um objeto Player, este da MMAPI, que recebe o
e altura da tela). Seguindo, definida a cor de desenho para azul Stream correspondente ao vdeo e o tipo do arquivo. Na linha seguinte
(linha 43) e realizado o desenho de um quadro, este na posio (linha 61) preparado o vdeo para execuo, e criado um objeto de
referente s variveis x e y, com a largura/altura de 10 pixeis. VideoControl, que permite apresentar o vdeo em um Canvas.
No final do mtodo, as variveis x e y so atualizadas para na Se o VideoControl foi instanciado com sucesso linha 65, defi-
prxima interao o objeto ser desenhado em uma nova posio da nido o mesmo para o modo de vdeo direto, j que ser apresen-
tela. Dessa forma, tem-se o efeito de movimento de um quadrado tado em um Canvas, definido tambm o tamanho da rea de
azul, no sentido cima-baixo esquerda-direita que se repete at o visualizao do vdeo que ser igual ao tamanho da tela (linha
quadrado ultrapassar as fronteiras da tela. Essa tcnica costuma 67) e definida sua propriedade visible para true. Por fim, o vdeo
ser muito utilizada nos jogos. executado com o comando start() linha 71.
J o mtodo executarVideo linha 28, tambm apresenta um Caso ocorra alguma exceo, a mesma tratada das linhas 73 a 77.
objeto Canvas na tela, este objeto da classe ExecutaVideoCanvas O mtodo paint() linha 81, mesmo sem ter cdigo deve ser co-
e codificado na linha 52. dificada, pois obrigatrio em classes do tipo canvas.
s
D
aplicaes com recursos de multimidia. A Mobile Magazine tem que ser feita ao seu gosto. Para isso, precisamos
sobre e
Assim, este artigo apresentou de forma didtica a utilizao dos saber o que voc, leitor, acha da revista!
s
ta
trs recursos multimdia existentes hoje: som, vdeo e imagem. edio
D seu voto sobre este artigo, atravs do link:
Sendo utilizado desde imagens simples e estticas, como arquivos
PNG at a criao de imagens dinmicas utilizando recursos de www.devmedia.com.br/webmobile/feedback
canvas.
J referente a execuo do som, foi visto a utilizao de sons
simples, que na maioria dos celulares so monofnicos, at a
reproduo de arquivos de audio, como por exemplos sons WAV,
utilizando para isto a MMAPI.
Para finalizar, tambm utilizando a MMAPI foi apresentada
a execuo de um vdeo MPEG, assim como a criao de uma
animizao dinmica, utiliznado para isso recursos de Thread
e Canvas.
O Resumo DevMan
desenvolvimento para dispositivos mveis sempre foi
considerado um desenvolvimento diferenciado, seja por
restries do hardware ou recursos disponveis da lin- De que se trata o artigo:
guagem utilizada. A plataforma .NET diminuiu essas diferenas Desenvolver sistemas mais do que criar classes a esmo, formulrios e
quando lanou na poca o .NET Compact Framework, que permi- colocar tudo ali. pensar no problema, possveis solues e unir tudo em
tia ao desenvolvedor usufruir de recursos de forma mais fcil. O algo que no cause mais problemas. Por isso existem os bons princpios para
prprio sistema operacional mvel da Microsoft sofreu mudanas desenvolvimento de softwares orientados a objetos. Neste artigo vamos
ao longo do tempo, e hoje uma nova e remodelada plataforma estudar como separar a camada de interface do restante do aplicativo.
nasce, o Windows Phone. Esta evoluo aproveita todo o conhe-
cimento em XAML do desenvolvedor, mais os recursos do .NET Em que situao o tema til:
Framework, aliados a um nico ambiente de desenvolvimento. Desenvolver um sistema flexvel bom para voc, como desenvolvedor,
o sonho de consumo de qualquer desenvolvedor, que agora pode e bom para seu cliente. Para voc bom porque levar menos tempo para
aplicar os mais diversos recursos do ambiente, incluindo o uso ajustar o sistema e o far com segurana. Para seu cliente bom porque ele
da orientao a objetos em si (ler Nota DevMan 1). ver que o sistema que ele utiliza estvel e que no vai deix-lo na mo.
Sempre se fala da orientao a objetos como se esta fosse a bala
de prata para todos os problemas, desde anlise programao. MVVM no Windows Phone:
No entanto, apesar de podermos desenvolver para o Windows Criar uma separao entre as camadas lgicas de um aplicativo muito bom,
Phone aplicando a orientao a objetos, colocar tudo em classes desde que se evite dependncia excessiva entre as classes, duplicao de
no resolve o problema, podendo at mesmo piorar a situao, cdigo e outros problemas mais. Neste artigo vamos estudar o padro MVVM
pois um software orientado a objetos mal construdo sinnimo e com um exemplo prtico ele ser aplicado para que voc leitor assimile e
de dor de cabea. possa utilizar no seu dia-a-dia.
Neste momento estamos considerando que todo leitor j sabe
o que uma classe, uma propriedade, um mtodo. J conhecem
estruturalmente a orientao a objetos, e o que falta saber como Nota do DevMan 1
modelar tudo isso de forma adequada para poder criar um sis-
tema flexvel e que responda rpido s mudanas das regras de Orientao a Objetos: A orientao a objetos surgiu com a necessidade de se criar um
negcio. paradigma de programao simples baseado na percepo humana dos objetos ao seu redor. Este
novo paradigma no apenas um modo de programar, mas uma maneira de pensar e conceber as
As regras de negcio mudam constantemente, isto fato, e faz ideias. Neste paradigma, o software composto por uma coleo de objetos que interagem entre
com que seja um desafio construir um aplicativo que responda si atravs de mensagens, simulando as aes que ocorrem no mundo real.
rpido s mudanas apresentadas. Toda essa exigncia por mu- A partir dos conceitos do paradigma orientado a objetos possvel fazer uma anlise dos requisitos
danas pode levar-nos a desenvolver algo que no tenha a quali- do sistema, investigando as entidades que o compem. O sistema pode ser quebrado em unidades
de objetos e a partir da possvel entender como eles se relacionam. Nesta etapa ser feita a
dade desejada. Os aplicativos bem desenvolvidos podem oferecer anlise de requisitos para serem construdos modelos que representem o sistema.
vantagem competitiva para seus clientes, contudo o projeto mal
O importante o que ser feito, sem se preocupar em como ser feito, desprendendo-se de
modelado pode levar a prejuzos por enrijecer processos, j que qualquer tipo de tecnologia. O sistema assim precisa ser validado e verificado, para ter certeza de
no se adapta s mudanas de forma eficiente. Neste segmento, que os requisitos atendem as necessidades do cliente.
possvel identificar quando um aplicativo bem ou mal proje- Em um processo de desenvolvimento orientado a objetos, o resultado da analise so modelos que
tado, por isso vamos analisar os elementos de um bom design e representam as estruturas das classes de objetos componentes e modelos que especifiquem as
de um no to bom. funcionalidades do sistema. A nfase est em achar e descrever objetos (ou conceitos) no domnio
do problema. Por exemplo, num sistema acadmico alguns dos conceitos poderiam ser aluno,
matricula,curso.
Modelagem boa A utilizao deste mecanismo possibilita no somente equipe de desenvolvimento o
Aplicaes bem desenhadas oferecem rotinas que so robustas, entendimento do problema. Como este paradigma aproxima o mundo real do computacional,
de fcil manuteno e reutilizveis. Elas devem estar aptas a se ele traz tambm como benefcio uma melhor interpretao do cliente quanto ao documento de
requisitos especificado.
adequar s mudanas sem afetar sua modelagem. Um exemplo
disso seria uma aplicao onde necessrio exportar um arquivo
Separando em camadas Uma coisa interessante sobre os padres que eles mostram
A Engenharia de Software sugere que uma aplicao deva ser como resolver um problema de forma conceitual. Como imple-
separada em camadas lgicas, que no tenham dependncia mentar isso responsabilidade dos desenvolvedores. Por causa
direta entre si. Isso favorece a manuteno do software, pois disso, ao longo do uso do MVVM, vrios desenvolvedores perce-
quanto menos uma parte depender de outra, menos itens sofrero beram algumas dificuldades em aplicar os conceitos deste padro
mudanas. e at mesmo formas de melhorar sua aplicao. E pensando em
Uma das camadas que precisa ser separada do restante do sof- toda a comunidade de desenvolvedores, surgiram os chamados
tware a camada de interface, ou simplesmente UI. Ela deve ser Frameworks MVVM. Eles j possuem muita coisa implementada
responsvel apenas por apresentar os dados e nada mais. Assim, e resolvida, facilitando a aplicao do padro.
ela pode ser substituda ou redesenhada sem interferir nas regras Para desenvolver o exemplo apresentado neste artigo, vamos
de negcio, que tambm estaro em uma camada separada no utilizar um framework MVVM chamado MVVM Light (veja
sistema. Mas como podemos fazer essa separao em ambientes seo Links), que possui compatibilidade para WPF, Silverlight
mveis? e Windows Phone. Se voc ainda no instalou o SDK 7.1 RC do
Windows Phone e o Silverlight for Windows Phone Toolkit, no
Model-View-ViewModel (MVVM) se esquea de instal-los (veja seo Links).
Em 2005, John Gossman, ento arquiteto do WPF na Microsoft,
publicou em seu blog o padro Model-View-ViewModel, que tem
por finalidade separar a lgica da aplicao da camada de interface Nota do DevMan 2
com o usurio utilizando os recursos do WPF. A estrutura bsica
desse padro pode ser vista na Figura 1. Padro Command: O padro Command faz parte dos padres de projeto. Seu objetivo encapsular
qualquer ao que venha a ser chamada em um momento futuro. Essa ao torna-se um objeto que
pode ser reutilizado, contendo em si a complexidade da chamada da ao original. Ao aplicar esse
padro conseguimos uma flexibilidade maior no sistema, j que para adicionar novas aes (comandos)
no h necessidade de se alterar o design do projeto, apenas novos objetos so criados e associados
interatividade do sistema. Apesar dessa vantagem, existe uma desvantagem no seu uso. Como seu uso
implica na execuo de objetos que possuem como nica finalidade a execuo de uma ao, acabaremos
por ter um cdigo que se assemelha muito ao cdigo procedural, orientado aos comandos.
Lista de tarefas
Para demonstrar os conceitos envolvidos, nada melhor do
que p-los em prtica. Para isso vamos criar um aplicativo de
demonstrao bem simples, uma lista de tarefas a realizar. O
usurio poder incluir as tarefas e ainda categoriz-las como
sendo de casa ou do trabalho. A pgina principal da aplicao
exibe por padro todas as tarefas, contudo permite que se filtre
Figura 1. Estrutura do padro MVVM pela categoria (utilizando o controle Pivot). Nessa mesma pgina
ser possvel marcar quando a tarefa foi feita, incluir uma nova
Nesta estrutura, a View representa nossas janelas, o ViewModel ou excluir alguma. Com tudo isso em mente, podemos prototipar
nada mais que uma classe que contm as aes que uma View um layout como o apresentado na Figura 2.
pode tomar, encapsulando sua lgica. Ele responsvel por prepa- Aps iniciar um novo aplicativo do tipo Windows Phone Ap-
rar o Model para ser exibido pela View. Model representa nossas plication preciso instalar o MVVM Light. Isso pode ser feito via
classes de negcio e tudo o que precisa para a apresentao e lgica NuGet, que j automatiza o processo. Uma vez instalado, criada
dos dados. A View, por sua vez, se comunica com o ViewModel no projeto uma pasta denominada ViewModel. Nela j foram in-
atravs do mecanismo de Binding e atravs de Commands dis- seridas duas classes: MainViewModel e ViewModelLocator. A
ponibilizados pela infraestrutura do WPF. Quem j ouviu sobre primeira vai encapsular a lgica da pgina principal e a segunda
Model-View-Presenter (MVP) ou Model-View-Controller (MVC) uma espcie de localizador de ViewModels, que tem a funo de
vai perceber similaridades, contudo, neste, temos o uso avanado centralizar as instncias deles e disponibiliz-las para as Views.
dos recursos do WPF, como DataBinding e Commands (veja a
Nota DevMan 2). O Model
O MVVM o padro original, destinado ao WPF e suas tec- Como temos uma regra de negcio (criar tarefas e gerenci-las),
nologias. Com o tempo surgiu o Silverlight e agora o Windows melhor represent-las em um domnio, utilizando uma classe.
Phone. Ambas as tecnologias fazem uso de XAML e possuem um Assim, foi criada uma pasta Model no projeto e nela foi inserida
subconjunto dos recursos do WPF, assim, o mesmo padro pode a classe Tarefa. Essa classe bem simples, como se pode ver na
ser aplicado para as duas plataformas. Listagem 1.
Banco de dados sua criao o nome do banco. Para a criao das tabelas, por sua
No Windows Phone Mango temos disponvel o uso do SQL vez, utilizado o mtodo CreateTable(), que requer apenas uma
Server e do LINQ to SQL para manipular dados. O uso destas classe como parmetro. A tabela a ser criada guarda informaes
opes exige algumas implementaes extras que no fazem da classe informada. Por fim, caso o banco j exista, aberto pelo
parte do escopo do artigo e que causariam uma complexidade mtodo OpenDatabase().
no desejada no momento. Como temos poucos dados a serem
salvos, vamos partir para algo simples e que funciona. Neste ViewModels
artigo vamos utilizar um projeto chamado Windows Phone 7 Ao rever a Figura 1 possvel notar que temos classes que
Database. Para isso, faa seu download e referencie sua nica so o que chamamos de ViewModel. Elas so responsveis pela
DLL no projeto. Ele implementa um banco de dados simples no adaptao dos dados para a exibio, ou seja, preparam o Model
espao IsolatedStorage do aparelho, que pode conter vrias tabelas para ser exibido na View. O primeiro ViewModel criado o Main-
com vrios campos (veja a Nota DevMan 3). Para localizao dos ViewModel. Segundo nosso prottipo, temos trs listas distintas
dados salvos, pode-se utilizar LINQ to Objects. No projeto, foi de tarefas (todas, casa e trabalho) e duas aes: criar uma nova
criada uma pasta chamada DatabaseUtils e nela foi definida uma tarefa e excluir uma tarefa. Cada lista de dados a apresentar re-
classe DbHelper, responsvel pela criao e abertura do banco presentada por propriedades especficas no ViewModel. Nele, foi
de dados, como mostra a Listagem 2. implementado um mtodo que cria as listas esperadas, conforme
apresentado na Listagem 3.
IsolatedStorage: Nada mais do que um sistema de arquivos protegido que pode ser acessado private void AtualizarListas()
programaticamente no Windows Phone. Quando um aplicativo faz uso de IsolatedStorage, seus {
dados ficam armazenados em compartimentos nicos para a aplicao, ou seja, se uma aplicao A var queryTodas = (from tarefa in _banco.Table<Tarefa>()
salva informaes, uma outra aplicao B no consegue acessar o que foi salvo por A e vice-versa. orderby tarefa.Descricao select tarefa);
TodasTarefas = new ObservableCollection<Tarefa>(queryTodas.ToList());
Este mtodo recebe a tarefa que ser excluda, e uma vez feita a Nota do DevMan 4
excluso, as listas so atualizadas. Mas como que tudo isso fica
ligado na View? Atravs de Binding. Data Template: Um DataTemplate especifica em XAML como determinado tipo de dado deve ser
apresentado. Controles visuais que possuem a finalidade de exibir colees de objetos necessitam de
Views um DataTemplate para saber como exibir os dados que contm.
As Views so responsveis pela exibio dos dados e nada mais. No cdigo a seguir temos a definio de um DataTemplate:
Essa a parte que o usurio final v de seu projeto, assim, uma <ListView ItemsSource={Binding ListaObjetos, Mode=TwoWay}
View deve cuidar da melhor forma de apresentar informaes. SelectedItem={Binding ObjetoSelecionado}>
Para isso, geralmente faz-se uso at mesmo de efeitos visuais,
<ListView.ItemTemplate>
grficos e infogrficos.
<DataTemplate>
Admite-se que o cdigo de uma View tenha lgica desde que
essa seja apenas relativa exibio de dados. Deste modo, toda a <StackPanel>
lgica de negcio fica centralizada nos ViewModels, pelos coman- <Label Content={Binding Codigo}/>
dos e suas propriedades. Uma View pode ser uma janela ou at <Label Content={Binding Descricao}/>
mesmo um UserControl. No projeto de exemplo ela a MainPage
</StackPanel>
do projeto, que realiza um Binding nas colees expostas pelo
ViewModel, como mostra a Listagem 4. </DataTemplate>
</ListView.ItemTemplate>
a ele. Uma vez que o ViewModel foi criado e ligado sua View, Listagem 6. Cdigo da classe NovaTarefaViewModel.
j possvel ver a execuo da pgina principal. Como ainda
public class NovaTarefaViewModel: ViewModelBase
no temos uma entrada de dados funcional, no ViewModel foi {
includo um mtodo chamado GeraDadosFicticios(), que cha- private Database _db = DatabaseUtils.DbHelper.GetDataBase();
mado em seu construtor para que tenhamos alguns elementos
public RelayCommand CmdSalvar { get; set; }
j carregados. public RelayCommand CmdCancelar { get; set; }
Listagem 8. Na incluso tambm feito o uso de mensagens. Ao ela pode querer responder somente quando um determinado
repensarmos o funcionamento da aplicao, sempre que uma ViewModel for o emitente da mesma. Portanto, deve ser criada
nova tarefa for includa, deve-se voltar para a tela principal que uma forma de identificar quem o emitente de uma mensagem.
mostrar as listas j atualizadas. Sendo assim, ao salvar uma nova No exemplo, na classe GoToPageMessage que foi criada, temos
tarefa, devemos disparar uma mensagem que avisa que as listas o DataContext que disparou a mensagem. Com isso, quem vai
devem ser refeitas e ento se dispara outra mensagem que trar responder pode verificar se a mensagem vinda de quem ela
novamente a pgina principal ao foco. precisa e ento responder de acordo. Foi isso o que desenvolvemos
na Listagem 9.
Listagem 8. Incluindo uma nova tarefa. Para finalizar nosso exemplo, os botes do tipo Application-
BarIconButton, nativos do Windows Phone, no possuem uma
private void DoSalvar()
{ propriedade Command para ligarmos os comandos Salvar e
if (NovaTarefa != null) Cancelar, ento simplesmente implementamos seu evento de Click
{
chamando os respectivos comandos.
NovaTarefa.Categoria = (ETarefaCasa) ? CategoriaTarefa.
Casa : CategoriaTarefa.Trabalho;
_db.Table<Tarefa>().Add(NovaTarefa); A arquitetura final
_db.Table<Tarefa>().Save();
A Figura 4 mostra um diagrama de camadas gerado pelo Visual
Messenger.Default.Send<AtualizarListasMessage> Studio. Como se pode observar, estamos respeitando a ordem das
(new AtualizarListasMessage()); camadas. No temos, por exemplo, ViewModel algum acessando a
var msg = new GoToPageMessage() { PageName = MainPage,
OriginalDataContext = this };
camada de apresentao, o que timo. Isso representado pelas
setas de navegao que so geradas automaticamente pelo Visual
Messenger.Default.Send<GoToPageMessage>(msg); Studio na anlise das classes para definio do diagrama. Note que
}
}
no h nenhuma seta bidirecional; elas seguem de cima para baixo.
Na arquitetura de sistemas, dito que camadas inferiores no de-
vem acessar camadas superiores. No entanto, talvez voc estranhe
A mensagem de atualizao de listas respondida pelo objeto o acesso da camada de dados camada Model, que est um nvel
MainViewModel, que registrou seu interesse em seu construtor, acima. Isso acontece porque nossos dados so o modelo em si.
como visto a seguir:
Messenger.Default.Register<AtualizarListasMessage>
(
this,
(action) => ReceiveMessage(action)
);
s
D
em processamento de dados pela FATEC-TQ. Atua como analista A Mobile Magazine tem que ser feita ao seu gosto. Para isso, precisamos
sobre e
saber o que voc, leitor, acha da revista!
e desenvolvedor da Siplan Control-M (www.siplancontrolm.com.br).
s
ta
edio
Entusiasta do desenvolvimento orientado a objetos e arquitetura, tem D seu voto sobre este artigo, atravs do link:
publicado vrios artigos sobre o assunto. Blog: http://quicoli.wordpress.com
www.devmedia.com.br/webmobile/feedback