Baixe o app para aproveitar ainda mais
Prévia do material em texto
1Android Android 2 Egydio Geraldo Passarelli Donati Vice Presidente Aguinaldo Silva Diretor de P&D José Melo de Oliveira - Governador do Estado do Amazonas Afonso Lobo Moraes Secretário de Estado de Fazenda Rossieli Soares da Silva Secretário de Estado de Educação Isa Assef dos Santos Diretora -Presidente Niomar Lins Pimenta Diretor de Tecnologia e Pesquisa EXPEDIENTE 3Android O avanço tecnológico, aumentando o poder de processamentos de dispositivos móveis, tem impulsionado a busca pela criação de aplicativos que atendam à necessidades desse novo público consumidor. Neste cenário, o Android, sistema operacional criado e mantido pela Google, se destaca como o atual líder de mercado, quando consideramos o número total de aparelhos quem levam o sistema do robozinho mais famoso da atualidade. O Curso de Linguagem de Programação - Android foi criado para oferecer aos alunos a oportunidade de conhecer e praticar técnicas para desenvolvimento de aplicativos, voltadas para uma das plataformas quem mais crescem no mercado mobile. Neste curso, o aluno é guiado pelo mundo da criação de aplicativos com interfaces ricas e funcionais, adaptáveis a dispositivos como Tablets e Smartphones. Iniciaremos apresentando características e fundamentos da plataforma Android, discutindo aspectos como mercado, aplicabilidade e histórico da sua evolução, permitindo que o aluno identifique as características que nos motivam ao desenvolvimento voltado a dispositivos móveis. Ao longo do curso, criamos uma aplicação completa, onde o aluno tem a oportunidade de desenvolver seu primeiro aplicativos Android, aprendendo a combinar componentes da linguagem, regras de negócio e lógica de programação. Durante o processo de desenvolvimento, o aluno aplica conceitos como: planejamento de software, usabilidade e persistência em banco de dados. Prof. M.Sc. Marcio Palheta Piedade Apresentação da Disciplina VANDROID Android 4 5Android Android 6 Neste capítulo, apresentamos umas das principais linguagens de programação da atualidade, a Java, que revolucionou o desenvolvimento de programas com uma proposta de arquitetura robusta, segura e de fácil adaptação, fortemente recomenda para projetos críticos, de médio e de grande porte. UNIDADE 1 Introdução ao Java 7Android 1. O que é o Java Em 1991, a empresa Sun Microsystems financiou um projeto coorporativo chamado Green, chefiado por James Gosling, que gerou como resultado uma nova linguagem de programação, baseada em C e C++, chamada de OAK, que quer dizer “carvalho”, em homenagem a uma grande árvore de carvalho que era avistada a partir da janela da Sun. Contudo, o time de projeto descobriu que a existência de outra linguagem chamada Oak e, em visita a uma cafeteria, surgiu a ideia do nome Java, em homenagem a um tipo de café da cidade de origem, muito apreciado pelos programadores daquele time. Em 2009, a Sun foi comprada pela empresa Oracle, e o Java passou a ser mantido pelo comitê Java Community Process – JCP, que divulga suas atualizações e normas no site www.jcp.org. 2. Orientação de um Programa em Java A arquitetura proposta pela linguagem Java garante que um programa possa ser desenvolvido para rodar em qualquer sistema operacional, sem a necessidade de reescrita de código fonte. Sendo assim, um programa desenvolvido para rodar em Linux também pode ser executado em Mac OS ou Windows. Mas para entendermos como isso é possível, precisamos entender como um programa Java é construído. Um programa Java é composto por um conjunto de arquivos de código fonte, que terminam com a extensão “.java”, e bibliotecas de terceiros, distribuídas em arquivos com a extensão “.jar”. Para que o novo programa possa ser executado, o compilador Java ( javac) transforma o código “.java“ em arquivos codificados, chamados de bytecode, armazenados em arquivos com a extensão “.class”. A figura 1 mostra a composição inicial de um programa Java. Figura 1. Programa Java Código Fonte (.java) Bibliotecas (.jar) Bytecode (.class) Android 8 3. Máquina Virtual Uma pergunta interessante, para todo iniciante em Java, é: Como é que o mesmo código fonte pode rodar em sistemas operacionais diferentes? A resposta é simples: O time de desenvolvimento da Sun criou uma Máquina Virtual capaz de interpretar o código fonte e executá-lo de acordo com o sistema operacional do usuário. O papel da máquina virtual do Java (ou Java Virtual Machine - JVM) é receber o Bytecode de um programa Java e gerar o arquivo binário para o sistema operacional em que desejamos executar a aplicação. Para isso, a Sun desenvolveu uma JVM para cada sistema operacional, garantindo esse aspecto multiplataforma da Java. Na figura 2, apresentamos a estrutura completa para execução de um programa Java. Android 8 Figura 2 - Estrutura de Execução de Programas Java Código Fonte (.java) Bibliotecas (.jar) Processo de compilação (javac) Bytecode (.class) JVM para Mac OS JVM para Linux JVM para Windows Sistema Operacional Mac OS Sistema Operacional Linux Sistema Operacional Windows 9Android 4. Java e a “Sopa de Letrinhas” Outro problema enfrentado por programadores iniciantes em Java é: para começar a programar em Java, que pacote eu devo baixar? A JVM, naturalmente, é um dos requisitos necessários para execução e desenvolvimento de aplicações Java. Porém, a Sun entendia que nem todos os usuários que precisam da Java são programadores e dividiu a distribuição em dois pacotes: JDK e JRE. O Java Runtime Environment – JRE é o ambiente para execução de aplicações Java e traz um pacote de arquivos contendo a JVM e várias bibliotecas e programas utilitários. O Java Development Kit – JDK é o kit para desenvolvimento de aplicações Java e traz, além da JVM, arquivos utilitários como o JAVAC, que é o compilador utilizado para gerarmos o bytecode. Atualmente, o Java encontra-se na versão 1.8 e seus pacotes para desenvolvimento podem ser baixados no site oficial da linguagem: http:// www.oracle.com/technetwork/java/. 5. Java em Projetos Diferentes A linguagem Java pode ser utilizada para o desenvolvimento de aplicações nos segmentos de WEB, Desktop ou Mobile. Para garantir essa característica, a Application Programming Interface – API (ou Interface de Programação de Aplicações) da Java está dividida em: • Java Standard Edition – JSE: versão fundamental da Java, usada para o desenvolvimento de aplicações Desktop. O conhecimento dessa versão é essencial para o entendimento e desenvolvimento de aplicações Móveis e Web. Nesta apostila, apresentamos conceitos da JSE necessários ao desenvolvimento de Android Apps; • Java Enterprise Edition – JEE: versão da API Java para o desenvolvimento de aplicações distribuídas. Essa versão traz ferramentas e conceitos necessários para o desenvolvimento de aplicações Web baseadas e Java; • Java Micro Edition – JME: Versão da API Java para o desenvolvimento de sistemas embarcados em microcontroladores ou Android 9 Android 10 telefones celulares. Atualmente, o desenvolvimento para dispositivos móveis está limitado a alguns modelos da série 60 de telefones Nokia. 6. Meu primeiro programa Java Agora que tivemos uma visão geral acerca da linguagem Java, vamos iniciar o desenvolvimento do nosso primeiro programa. É um costume entre os programadores que o primeiro programa desenvolvido em uma nova linguagem seja chamado de Hello World (ou olá, mundo). Seguindo essa tradição, vamos criar o nosso arquivo HelloWorld.java, no qual queremos apenas imprimir uma mensagem “Hello, world!” no terminalou console da máquina do usuário. Um programa Java é fundamentalmente composto por: A figura 3 apresenta detalhes do nosso primeiro programa Java. Android 10 Figura 3 - HelloWorld.java • Classe pública: Classe principal do sistema, no qual vamos executar o nosso código fonte. A classe e o arquivo .java em que ela foi escrita devem possuir o mesmo nome; • Blocos de comandos: conjunto de linhas de programa, no qual implementamos a lógica da nossa aplicação. Iniciam com “{” e terminam com “}”; • Linhas de comando: Linha contendo comandos que devem ser executados em nosso programa. Ao �nal de uma linha de comando, devemos incluir “;”; • Métodos: representam funções ou procedimentos da programação estruturada. Para facilitar o desenvolvimento e a manutenção dos nossos programas, dividimos a aplicação em vários métodos distintos, nos quais cada um tem um papel bem de�nido. 11Android UNIDADE 2Orientação a Objetos Neste capítulo, apresentamos aspectos fundamentais da Programação Orientada a Objetos em Java. Android 12 1. Declaração de Variáveis e Tipo de Dados A definição de varáveis em Java segue o mesmo padrão adotado em linguagens com C e C++: Precisamos definir o tipo da variável e o seu nome. Para atribuir um valor para uma determinada variável usamos o sinal de igualdade: “=” A figura, a seguir, apresenta um exemplo de como definir e atribuir valores às nossas variáveis: Segundo o manual de “Boas práticas de programação”, devemos escolher nomes de variáveis que sejam intuitivos, a fim de aumentar a legibilidade do nosso código fonte. Contudo, quando trabalhamos com Java, precisamos seguir mais algumas regras para nomenclaturas de: • Classes: devem iniciar com a primeira letra maiúscula • Métodos, atributos e variáveis: inicial minúscula. • Caso o nome seja composto por duas ou mais palavras, a inicial de cada nova palavra deve ser maiúscula. Como exemplo, temos o método puxarCorda() e a classe ContaBancaria. Os tipos primitivos de variáveis em Java são apresentados na tabela 1: Figura 4 - Declaração e Atribuição de Valores Sintaxe: tipoVariavel nomeVariavel; Exemplo: int idade; Atribuição de valor = 15; § § § Tabela 1 - Tipos Primitivos Classi�cação Tipo Intervalo de Valores Lógico boolean true (verdadeiro) ou false (falso) byte - 128 a 127 (8 bits) short - 32768 a 32767 (16 bits) int - 2147483648 a 2147483648 (32 bits) long - 263 a (263) -1 (64 bits) �oat 1.40239846-46 a 3.40282347-38 (32 bits) Inteiro Ponto Flutuante double 4.9406564584-324 a 1.7976931348-308 (64 bits) Caracter char Caracteres Unicode (16 bits) 13Android 2. Estruturas Condicionais A tomada de decisão é um aspecto que está presente no nosso dia a dia. Por exemplo, se temos um dia de sol, vamos à praia; Se não, ficamos em casa. Neste caso do cotidiano, executamos uma ação (ficar em casa ou ir à praia) de acordo com uma condição (hoje é dia de sol). Em Java, as estruturas condicionais são if-else e switch-case e seguem o padrão da linguagem C, conforme apresentado na figura 5. 3. Laços de Repetição A fim de facilitar a repetição de um determinado bloco de comandos, as linguagens de programação oferecem estruturas conhecidas como laços de repetição. Em Java, os laços de repetição seguem o formato da linguagem C, conforme apresentado na figura 6. 13 Figura 5 - Sintaxe de Estruturas Condicionais Sintaxe: if (expressão boolena) { bloco de instruções } else if (expressão booleana) { instruções } else { instruções } Sintaxe: switch (seletor_inteiro) { case valor_inteiro_1: instruções; break; case valor_inteiro_2: instruções; break; (...) default: instruções; } Figura 6 - Sintaxe de Laços de Repetição em Java while ( expressão boolena ) { instruções; } do { instruções; } while ( expressão boolena ); for ( inicialização; expressões booleanas; passo da repetição ) { instruções; } Android 14 4. Classes, Objetos e Métodos Agora que concluímos a parte estruturada do Java, vamos conhecer um pouco das teorias acerca da Orientação a Objetos – OO, através das quais resolveremos problemas do mundo real a partir da interação de seus objetos. Objetos são “coisas” do mundo real, que podem realizar ações, chamadas de métodos e possuem características próprias, chamadas de atributos, e são agrupadas de acordo com seus tipos, chamados de classes. A tabela 2 apresenta um exemplo da relação entre os três componentes de um objeto, na qual podemos perceber que todo objeto da classe Pessoa possui Nome, E-mail, Endereço, RG, CPF e pode executar as ações de acordar, dormir e comer. Ou seja, qualquer objeto da classe pessoa tem o mesmo grupo de características e pode executar o mesmo conjunto de ações. Em projetos de software, classes são representadas através de diagramas e implementadas em códigos fonte. Na figura 7, apresentamos representações da classe Conta Bancária, geradas a partir de uma ferramenta de modelagem de sistemas (à esquerda) e uma ferramenta de criação de código fonte (à direita). Figura 7 - Representações das Classes Conta Bancária Conta Bancaria - agencia : string - numero : string - saldo : double + sacar() : void + depositar() : void + transferir () : void Tabela 2 - Relação entre Classes, Atributos e Métodos Classe Atributos (Características) Métodos (Ações) Pessoa Nome, Endereço, E-mail, RG, CPF Acordar, Dormir, Comer Conta Bancaria Agência, Número da Conta, Saldo Sacar, Transferir, Depositar Carrro Marco, Cor, Modelo, Ano, Motor Ligar, Parar, Acelerar 15Android 5. Encapsulamento e Modificadores de Acesso O uso de OO em desenvolvimento de sistemas se tornou popular por oferecer um conjunto de vantagens como: Aproximar os dados (atributos) das ações que podem ser executadas (métodos) e garantir maior segurança dos dados. Encapsulamento é um conceito de OO em que a segurança dos atributos é feita através da limitação de acesso. Nesse conceito, apenas métodos da própria classe podem manipular seus atributos. A limitação de acesso em Java é feita a partir do modificador de acesso “private”. O acesso externo a atributos de uma classe ocorre a partir de métodos públicos, conhecidos como GET e SET, em que métodos de GET devolvem o valor do atributo e métodos de SET são usados para atualizar seu valor. A figura 8 apresenta um exemplo da implementação de encapsulamento. Android 15 Figura 8 - Encapsulamento na Classe ContaBancaria Android 16 Após a implementação da classe ContaBancaria, com a definição de seus métodos e atributos, podemos criar seus objetos. Para isso, utilizamos a palavra reservada “new”, que indica para a JVM que um novo objeto deve ser criado na memória. No exemplo da Figura 9, a variável “conta” é usada para acesso ao objeto criado. 6. Herança e Poliformismo Outra vantagem de OO é o reuso de código, no qual podemos definir classes genéricas, com métodos e atributos comuns, e reaproveitar esse código em classes filhas, que herdam as características de sua classe pai. A implementação de herança em Java é feita a partir o uso da palavra reservada “extends”,que indica para a JVM quem é a classe pai, de onde devem ser herdados métodos e atributos. Imagine que em um sistema de cadastros, temos usuários que são engenheiros e outros que são médicos. Todos os usuários possuem Nome, E-mail e senha. Além desses dados, Engenheiros possuem o número do CREA e Médicos possuem CRM. Para resolver o problema exposto acima, vamos criar uma classe Usuario com os dados comuns a todos os usuários e duas classes filhas, Medico e Engenheiro, que implementam apenas o código necessário a cada uma delas. A figura 10 apresenta um diagrama de classes com a nossa arquitetura e o código fonte para as classes Usuario, Medico e Engenheiro. Figura 9 - Manipulação de Conta Bancária 17Android 7. Interfaces e Classes Abstratas Em Java, podemos criar classes especiais que não podem ser instanciadas com “new”, servindo apenas de modelo para classes filhas. Nessas classes, podemos criar métodos especiais que as classes filhas são obrigadas a implementar. A essa parte da teoria chamamos de Classe Abstrata. A definição de classes e métodos abstratos em Java ocorre com o uso da palavra “abstract”. Ao marcar uma classe como abstrata, informamos à JVM que a classe pode ser estendida por outras, mas não instanciada. Já na marcação de métodos abstratos, usamos a palavra “abstract“ e definimos apenas a assinatura do método, pois a sua implementação será feita pela classe filha. Figura 10 - Implementação da Herança em Java Usuário + autenticar(senha : int) : boolean - nome : string - email : string - senha : double Engenheiro - crea : int Medico - crm : int public class Usuario { private String nome; private String email; private int senha; //Método para autenticação de usuários public boolean autenticar (int senha){ return this.senha == senha; } //Método de get e set omitidos //Classe �lha da classe Usuário public class Engenheiro extends Usuario { //Atributos especí�cos de Engenheiro private int crea ; //Método de get e set omitidos //Classe �lha da classe Usuário public class Medico extends Usuario { //Atributos especí�cos de Medico private int crm ; //Método de get e set omitidos Android 18 Vez por outra, precisamos assinar um contrato entre os programadores do nosso sistema. Em OO, esse contrato é assinado a partir de Interfaces. Quando uma classe declara que implementa uma interface, essa classe é obrigada a implementar todos os métodos assinados na interface. Em Java, não temos o conceito de herança múltipla, ou seja, uma classe só pode ter uma classe pai. Contudo, uma classe pode implementar várias interfaces. A figura 11 mostra que a classe Engenheiro é filha da classe abstrata Usuario e implementa a interface Jogador. 8. Coleções, Listas e Mapas Em desenvolvimento de aplicações, é comum a necessidade de agrupar dados em vetores estáticos ou dinâmicos, a fim de facilitar o acesso e a manipulação. A Java traz uma API chamada Collection, que possui a interface List, utilizada para armazenamento de objetos em memória. A implementação de List mais utilizada para a manipulação de Objetos é a classe ArrayList, em que os objetos são agrupados de acordo com a ordem de inclusão na lista. Figura 11 - Criação de Interfaces e Classes Abstratas Usuário + autenticar(senha : int) : boolean - nome : string - email : string - senha : double Engenheiro - crea : int Medico - crm : int public class Usuario { private String nome; private String email; private int senha; //Método para autenticação de usuários public boolean autenticar (int senha){ return this.senha == senha; } //Métodos de get e set omitidos //Classe �lha da classe Usuário e //Implenta a interface Jogador public class Engenheiro extends Usuario implements Jogador { private int crea; //Implentação do método da interface Jogador @Override public void malhar () { System. out.println (”Hora de Malhar”); } //De�nição da Interface public interface Jogador { //Método a ser implementado public void malhar( ) ; } Jogador 19Android O trabalho com coleções de dados é composto pelos seguintes comportamentos essenciais: • Definição da variável do tipo List; • Criação do Objeto ArrayList; • Inclusão de Objetos na lista; • Exclusão de Objetos da lista; • Acesso a um determinado objeto; • Percorrer a lista, acessando todos os objetos. A figura 12 apresenta um trecho de código Java que implementa o acesso a uma lista de objetos do Tipo Engenheiro. Android 19 Figura 12 - Manipulação de Coleção de Engenheiros Android 20 UNIDADE 3Visão Geral de Desenvolvimento Mobile A evolução tecnológica e aumento do poder de processamento de dispositivos móveis, como smartphones e tablets, levou a humanidade a uma nova era de comunicações, em que o acesso à informação é facilitado e amplamente divulgado. Neste cenário, empresas do setor de telecomunicações têm buscado oferecer serviços de infraestrutura de maior qualidade, visando garantir o fluxo constante de informações. 21Android 1. Desenvolvimento de Aplicativos para Dispositivos Mobile Com maior poder de processamento, os dispositivos móveis se tornaram alvo de outra grande evolução: A corrida para desenvolvimento de aplicativos móveis. Hoje em dia, é comum encontrarmos pessoas utilizando celulares ou tablets para acessar e-mails, serviços de envio de mensagem ou mesmo para se divertir com algum novo jogo eletrônico. A indústria de desenvolvimento de aplicativos móveis tem realizado campanhas para disseminar suas tecnologias de desenvolvimento e aumentar o número de desenvolvedores, buscando impulsionar o número e a qualidade de aplicativos disponíveis para download em suas lojas virtuais. A tabela 3 apresenta dados de uma pesquisa do Gartner Group (importante instituto de pesquisas internacionais), publicada em fevereiro de 2014, na qual podemos verificar o elevado número de smartphones vendidos entre os anos de 2013 e 2012, agrupados por sistema operacional. 2. Coleções, Listas e Mapas Ao iniciarmos no desenvolvimento de aplicativos (APP), precisamos nos lembrar de algumas premissas essenciais ao projeto de softwares, que aumentam as chances de sucesso das aplicações. Tabela 3 - Vendas de Smartphones para Usuários Finais por Sistema Operacional Sistema Operacional 2013 2012 Android 758,719.9 451,621.0 iOS 150,785.9 130,133.2 Microsoft 30,842.9 16,940.7 Total 967,775.8 680,108.2 Outro SOs 8,821.2 47,203.0 BlackBerry 18,605.9 34,210.3 Android 22 Arquitetura robusta e incremental Na criação de aplicativos, é comum o aumento do escopo do projeto, ao longo dos ciclos de desenvolvimento do produto, em que novas funcionalidades podem ser agregadas, como a necessidade de integração com o site do fabricante. A arquitetura da App deve ser elaborada de forma que a inclusão de novos requisitos não implique grande esforço e retrabalho. Padrões de Projeto e de Boas Práticas de Programação Muitos dos problemas encontrados ao longo do desenvolvimento de aplicativos já foram resolvidos pela comunidade científica, e as soluções foram registradas como Padrões de Projetos, por indicarem as melhores práticas para resolver problemas, como o tratamento da persistência de tabelas de um banco de dados. Padrões Uso de Frameworks para Aumento de Produtividade É comum que empresas de desenvolvimento de software busquem a produção de mais aplicações,no menor tempo possível. Para ajudar nesse processo, grupos de desenvolvimento criam ferramentas que automatizam parte do trabalho dos programadores, chamadas frameworks. 3. Apresentação do Android Entre os Sistemas Operacionais – SO para dispositivos móveis, o Google Android é o que mais se destaca pelo seu crescimento nos últimos anos, conforme demonstrado na tabela 4, onde são apresentados os percentuais de mercado de cada um dos principais SOs. Tabela 4 - Percentuais de Mercado por SO Sistema Operacional 2013 (%) 2012 (%) Android 78.4 66.4 iOS 15.6 19.1 Microsoft 3.2 2.5 Total 100.0 100.0 Outro SOs 0.9 6.9 BlackBerry 1.9 5.0 Android 22 23Android O crescente número de dispositivos rodando Android tem atraído o interesse de empresas desse segmento, aumentando a demanda por profissionais especialistas em desenvolvimento de aplicativos Android. Neste curso, apresentamos os conceitos fundamentais para desenvolver aplicativos para o SO que mais tem crescido em número de dispositivos. 4. Dispositivos Android O SO Android foi desenvolvido inicialmente para rodar em smartphones, e disputou mercado com outro sistemas como iOS e Windows Phone. Contudo, o projeto inicial foi evoluído para atender outros dispositivos como tablets, óculos, relógios, TVs e veículos. A figura 13 mostra exemplos de dispositivos nos quais podemos encontrar o Android rodando. Figura 13. Dispositivos Android Android 24 5. Conhecendo as Ferramentas de Desenvolvimento O desenvolvimento de aplicações Android ocorre a partir de um Ambiente Integrado de Desenvolvimento – IDE, no qual encontramos as ferramentas necessárias para facilitar a produção de aplicativos. Entre os ambientes de desenvolvimento pagos, encontramos o IntelliJ IDEA (https://www.jetbrains.com/idea/), que apresenta uma interface amigável e ferramentas de apoio ao desenvolvimento que o tornaram IDE padrão para Android Apps em muitos países. No Brasil, a IDE padrão ainda é o Eclipse (http://eclipse.org/), por ser uma ferramenta de código aberto, grátis, inicialmente proposta pela Google para o desenvolvimento de aplicativos Android. No final de 2014, a Google lançou a sua própria IDE para criação de aplicativos, conhecida como Android Studio, com uma proposta inovadora e baseada em características importantes do IntelliJ, como uso de ferramenta integrada para a criação de builds automáticos. 6. Coleções Instalação e Configuração do Ambiente de Desenvolvimento A Google utilizou a Java como base para o desenvolvimento Android. Com isso, entrou no mercado de aplicativos com um grande número de potenciais programadores, que só precisavam entender como a API do Android funcionava com a Java. Por isso, como pré-requisito, precisamos baixar e instalar o JDK, no site: http://www.oracle.com/technetwork/java/ javase/downloads/index.html. A figura 14 mostra a tela para download do JDK. Figura 14 - Tela para Download do JDK Build, no contexto do desenvolvimento de software, é uma versão “compilada” de um software ou parte dele que contém um conjunto de recursos que poderão integrar o produto final. Fonte: Wikipedia 25Android Agora, podemos baixar e instalar a nova IDE para desenvolvimento Android da Google, no site oficial: http://developer.android.com/sdk/ index.html, conforme exibido na figura 15. Após o download, execute a instalação do Android Studio e crie a sua 1a App. Na figura 16, apresentamos as telas de Início da instalação e Boas-vindas. Figura 15 - Tela para Download do Android Studio Figura 16. Tela iniciais do Android Studio Android 25 Android 26 UNIDADE 4Programação Móvel com Google Android Neste capítulo, iniciamos o desenvolvimento utilizando Android, onde vamos criar uma aplicação para cadastrar contatos de uma agenda telefônica, com os seguintes dados: Nome, Telefone, E-mail, Site, Endereço e Foto. Usaremos o banco de dados SQLite, que já vem instalado em aparelhos (devices) Android. 27Android A figura 17 apresenta as funcionalidades da nossa aplicação de cadastro de Contatos, onde, além de manipular os dados de contatos, precisaremos trabalhar com a câmera do device e exibir os dados do contato em um mapa. 1. Meu Primeiro Projeto Android Agora que sabemos os requisitos que devem ser atendidos pela nossa aplicação, vamos criar o nosso projeto no Android Studio. Para isso, inicie a IDE e selecione a opção “Start a new Android Studio Project”. Ao final de cada comando a seguir, clique no botão Next. Na tela “Configure your new project”, informe que o nome da aplicação (Application Name) é Agenda. Na tela “Select the form factors your app will run on” selecione a opção “Phone and Table”. Na tela “Add an activity to Mobile”, selecione a opção “Blank Activity”. Na última tela, “Choose options for your new file”, preencha os campos e clique em “Finish”: • Activity Name: FormularioContatoActivity • Layout Name: formulariocontatolayout Figura 17 - Funcionalidades do Projeto Android 28 • Title: Dados do Contato • Menu Resource Name: menuformulariocontato Com a execução dos passos acima, o Android Studio cria os arquivos necessários à nossa aplicação, exibe a estrutura de pastas (à esquerda), uma paleta de componentes (ao centro) e uma tela de device com a visualização da app (à direita), conforme exibido na figura 18. 2. Conceitos Fundamentais da Estrutura de Projetos Android Agora que criamos nossa primeira Android App, vamos entender a estrutura de pastas e arquivos gerados. A pasta manifests armazena o arquivo AndroidManifest.xml, onde descrevemos as configurações da nossa App, como, por exemplo, o título e o logotipo da aplicação. A tela de uma aplicação tem a função de servir de interface entre o usuário e o sistema. No Android, a tela é composta por dois arquivos Figura 18 - Tela Inicial de Desenvolvimento do Android Studio 29Android principais: uma Activity, para representar o código fonte da tela, e o seu Layout, que indica como os componentes visuais devem ser exibidos na tela. A classe android.app.Activity é responsável por implementar as regras de negócio de uma tela, como criação de componentes e carga de menus. O Android Studio usa a classe ActionBarActivity, filha de Activity, como classe padrão, por implementar a compatibilidade da App com versões anteriores do Android. Na pasta Java, o Android Studio guarda o código fonte do nosso projeto. É nessa pasta que fica a nossa classe FormularioActivity, filha da classe ActionBarActivity, responsável pela implementação das regras de negócio da tela de cadastro de contatos. A pasta res é responsável pelo armazenamento de arquivos de recursos da nossa aplicação e é composta pelas seguintes subpastas: • Drawable: pasta de figuras da nossa App. O Arquivo ic_launcher. png é usado como logotipo da nossa aplicação; • Layout: armazena os arquivos de tela da nossa App, onde descrevemos os componentes que devem ser exibidos em cada tela. Nessa pasta, o Android Studio criou a nossa tela formulariocontatolayout. xml; • Menu: pasta que armazena os arquivos XML que contém as opções de menus da nossa App. O menuformulariocontato.xml está nessa pasta. • Values: pasta que armazena arquivos de propriedades da aplicação: • Values/Dimens.xml: arquivo de propriedade de dimensões de componentes. • Values/Strings.xml: arquivo de internacionalização (i18n), utilizado para descrevermos os textos que desejamos exibir na App,de acordo com o idioma configurado no device. • Values/Styles.xml: arquivo de definição de propriedade de estilos da App, contendo padrões de cores e formas. Android 30 3. Componentes de Tela Agora que sabemos o que foi gerado pelo Android Studio, vamos criar o nosso formulário de cadastro de Contatos, onde o usuário da aplicação poderá informar os dados que serão salvos no banco de dados. Telas de aplicativos Android são criadas a partir da combinação de conjuntos de componentes visuais, utilizados para facilitar a interação entre usuário e sistema. Nesse ponto do desenvolvimento o time de projeto, mais especificamente o designer de interfaces, deve se preocupar em garantir que a interface seja simples, e intuitiva, de forma a garantir uma boa experiência para o usuário. A tela de cadastro da nossa aplicação deve exibir um componente de imagem, onde será exibida a foto do contato e permitir que o usuário informe seus dados: Nome, telefone, endereço e site, conforme exibido na figura 19. Figura 19 - Formulário de Cadastro de Contatos 31Android O agrupamento de componentes visuais em Android fica a cargo dos containers como o LinearLayout, que organiza os componentes conforme sua orientação: vertical ou horizontal. No nosso formulário, queremos que os componentes apareçam um abaixo do outro. Para isso, usaremos o LinearLayout na orientação Vertical. A foto do contato será carregada do device e exibida em um componente ImageView. Esse componente tem a propriedade android:src, onde o programador informa o caminho para a imagem que deve ser exibida. A edição de dados será realizada a partir de caixas de texto, onde o usuário da aplicação poderá informar os dados de cada contato. Essas caixas de texto são componentes do tipo EditText, onde podemos informar características de estilo da fonte (android:ems), o tipo de dado a ser informado pelo usuário (android:inputType) e uma mensagem de ajuda (android:hint), que desaparece quando o usuário inicia a digitação. A fim de facilitar a interação com o usuário, utilizaremos um título para cada campo de texto. Os títulos são componentes TextView e possuem a propriedade android:text, usada para informar o texto que deve ser exibido na tela do android. O último elemento da nossa tela é um componente Button, que tem a propriedade android:text, utilizada para informar o título do botão. As propriedade android:id (código), android:layout_height (altura) e android:layout_width (largura) são comuns a todos os componentes de tela. Contudo, android:id é optativa e as demais obrigatórias. A propriedade android:id define uma chave para acesso a componentes. Componentes de projeto iniciam com “@+id/” e os nativos iniciam com “@id/” As propriedade de altura e largura informam se o componente deve ocupar toda a área disponível (match_parent) ou apenas a área necessária à exibição do seu conteúdo (wrap-content). O número de componentes exibidos é um problema comum em devices com telas pequenas. Uma boa estratégia para garantir que todos os componentes serão exibidos é adotar o componente ScrollView, que cria barras de rolagem quando o conteúdo é maior que a área disponível para exibição. Android 32 No Android, as figuras de uma App ficam armazenadas na pasta /res/ drawable. Para especificar o tipo de imagem, de acordo com a resolução da tela do device, utilizamos qualificadores (qualifiers) que indicam ao Android a figura que deve ser carregada. As resoluções das telas são definidas de acordo com o número de pontos que podem ser exibidos por polegada (DPI - Dots Per Inch). A tabela 5 apresenta a relação entre nomes de pastas, resoluções, tamanhos de telas e tamanho de ícones da aplicação. Em nossa aplicação, precisaremos de uma figura para representar o logotipo da nossa aplicação (ic_laucher.png) e outra para ser exibida enquanto não for criada uma foto para o contato (ic_no_image.png). A figura 20 mostra a estrutura de pastas de imagens do Android Studio. Tabela 5 - Qualifiers e Resoluções de Telas de Devices Pasta Resolução Área Aproximada (DPI) Tamanho do Ícone (Pixel) /res/drawable-ldpi Baixa 120 36 x 26 /res/drawable-mdpi Media 160 48 x48 /res/drawable-hdpi Alta 240 96 x 96 /res/drawable-xhdpi Alta (Extra) 320 144 x 144 Tabela 20 - Estrutura de Pastas de Figuras 33AndroidAndroid 33 A figura 21 apresenta um trecho do código fonte gerado para o arquivo res/layout/formulariocontatolayout.xml, necessário à criação da tela de Cadastro de Contatos, onde exibimos apenas os componentes para Foto, Nome e Botão salvar. Os demais campos, seguem o mesmo padrão de TextView e EditText usado no campo Nome. Figura 21 - Trecho de Código da Tela formulariocontatolayout.xml Android 34 4. Implementação das Regras de Negócios Agora que a tela está pronta para ser utilizada, vamos nos preocupar com as regras de negócio da aplicação. A princípio, o usuário deve digitar os dados do contato e clicar no botão salvar. Com o clique, deve ser exibida uma mensagem com os dados informados e os campos do formulário voltam a ficar vazios, esperando nova digitação. As regras de negócio de uma tela são implementadas a partir de suas classes de controle. A classe FormularioContatoActivity.java é responsável pelas regras de negócio da nossa tela de cadastro. A figura 22 mostra a atualização da classe FormularioContatoActivity, onde criamos atributos para capturar os valores digitados pelo usuário (EditText) e programar a exibição da mensagem e limpeza dos campos da tela (Button). Toda classe filha de Activity possui um método chamado onCreate(), que é executado no momento em que a tela é criada. Nesse método, associamos componentes de controle a componentes de tela. A associação do controlador com a tela ocorre com o método setContentView() e a associação de campos da tela a atributos do controlador ocorre com o método findViewById(). O Android permite que o ícone da aplicação seja exibido na barra de títulos da aplicação. A nossa classe FormularioContatoActivity é filha de ActionBarActivity e a exibição do ícone ocorre a partir do método getSupportActionBar().setIcon(). Utilizamos a classe R, gerada automaticamente pelo Android Studio, para informar a figura que deve ser exibida como ícone do sistema, conforme figura 23. Figura 22 - Atributos da Classe de Controle FormularioContatoActivity 35AndroidAndroid 35 A lógica de negócio dessa fase da nossa aplicação está quase pronta. Agora, precisamos exibir uma mensagem com os dados informados pelo usuário e limpar os campos da tela, quando o usuário clicar no botão de Salvar dados. O Android trata o clique de um botão como um evento. Podemos utilizar o método setOnClickListener() para escrever o trecho de código que será executado sempre que o evento de click ocorrer. A figura 24 mostra que, no final do método onCreate(), incluímos a implementação do evento de click do botão. Figura 23 - Método onCreate() da classe FormularioContatoActivity Figura 24 - Atualização do Final do Método onCreate() Android 36 5. Depoly: Rodando a Aplicação no Celular O Android Studio permite que você teste sua aplicação em um device real, a fim de validar se o layout da aplicação está de acordo com o planejado. Para isso, conecte o cabo de dados do seu aparelho celular à porta USB do seu computadore selecione a opção Run / Run ‘app’, no Android Studio, conforme a figura 25. Na tela Choose Device, selecione a opção Choose a running device, marque o device onde você deseja executar a App e clique em Ok, conforme a figura 26. Com isso, a aplicação será instalada no device e executada automaticamente. 6. Salvando Dados do Contato no Banco de Dados SQLite Agora que criamos uma tela onde o usuário pode informar os dados do contato, vamos criar os códigos necessários para salvar o contato em um banco de dados. Para armazenamento, utilizaremos o SQLite, nativo do Android. Figura 25 - Executar Aplicação no Celular Figura 26 - Tela de Seleção de Dispositivo para Executar a App 37Android Na camada de persistência da nossa App, usaremos o padrão de projeto Data Access Object (DAO), onde, para cada tabela do banco de dados, criamos uma classes de persistência específica. Assim, como temos que armazenar os dados de contatos, vamos criar as classes Contato (Figura 27) e ContatoDAO (Figura 28), para representar os dados da tabela de contatos e manipular os dados dessa tabela, respectivamente. Figura 27 - Classe Contato.java Figura 28 - Início da Classe ContatoDAO Android 38Android 38 O Android traz a classe SQLiteOpenHelper para ajudar na implementação da camada de persistência. Essa classe já oferece os principais métodos para atualização de registros do banco de dados. Seus métodos onCreate() e onUpgrade() são utilizados para criação e atualização das estruturas do banco de dados. Após a criação da base, precisamos de um método para cadastrar novos registros na tabela de contatos, conforme a figura 29. Agora que nossa camada de modelo está preparada para cadastrar contatos, vamos atualizar a camada de controle, para que o click do botão chame o método cadastrar() da classe ContatoDAO, conforme exibido na figura 30. Figura 29 - Método para Cadastro de Contatos no Banco de Dados Figura 30 - Atualização da Camada de Controle 39AndroidAndroid 39 Rode novamente a aplicação e teste a nova funcionalidade de cadastro. Se tudo deu certo, devem ser exibidas duas mensagens no console, após o clique do botão: “Tabela criada: Contatos” e “Contato cadastrado: Nome informado”. 7. Listagem de Contatos Agora que conseguimos cadastrar contatos no banco de dados, vamos melhorar a funcionalidade da App e criar uma tela de listagem de contatos. Para isso, clique com botão direito na raiz do projeto e siga os passos da figura 31. Em seguida, informe os nomes dos arquivos gerados para a nova tela, conforme a figura 32, e clique no botão Finish. Figura 31 - Menu para Criação de Nova Activity em Branco Figura 32 - Dados da Nova Activity Android 40Android 40 A nova tela de listagem será a tela inicial da nossa aplicação, onde exibiremos a lista de contatos cadastrados e o menu principal da aplicação, conforme exibido na figura 33. Até aqui, o formulário é a tela inicial da App. Precisamos avisar ao Android que a tela de listagem é a nova tela inicial. Para isso, vamos atualizar o arquivo de configurações do nosso sistema, o AndroidManifest. xml, que fica na pasta manifests. O AndroidManifest.xml é o arquivo que armazena as configurações que devem ser carregadas pelo Android, quando a nossa aplicação for carregada. Nele encontramos a lista de Activities da App. Para que a ListagemActivity seja a primeira chamada pelo Android, ela precisa ser marcada com as opções MAIN e LAUNCHER, conforme a figura 34. Figura 33 - Tela Inicial da Aplicação Figura 34 - Tela Inicial da Aplicação 41Android Sempre que solicitamos uma nova Activity, o Android Studio cria também um menu para a nova tela. Quando criamos a tela de listagem, foi criado o arquivo res/menu/listagemmenu.xml, para agrupar os itens do nosso menu principal. O menu da nossa aplicação exibirá ícones para novo cadastro, exibição de mapas e atalho para o submenu de opções, conforme figura 35. Por padrão, o Android exibe apenas duas opções de menu. Caso sejam necessárias mais opções, devemos utilizar a estratégia de submenu, onde podemos criar uma hierarquia de itens de menu. Na figura 36, o terceiro item do menu é representado por uma seta de “Mais opções”, onde, após o clique do usuário, são exibidas mais três opções de menu: Enviar dados, Receber dados e Preferências. Figura 35 - Arquivo res/menu/listagemmenu.xml Figura 36 - Atualização do Menu Principal Android 42Android 42 Agora que o menu principal está pronto para ser utilizado e a tela inicial foi atualizada no AndroidManifest, vamos atualizar a tela de listagem e incluir os componentes necessários à exibição de uma lista de contatos. No Android, temos o componente ListView, especialista em exibir dados de listas de objetos. Sendo assim, vamos incluir na tela listagemlaytou.xml uma ListView, que ficará dentro de um LinearLayout, que servirá de container principal da nossa tela, conforme exibido na figura 37. Com a tela de listagem pronta, podemos planejar os próximos passos. Precisamos atualizar a camada de modelo, para nos retornar uma lista de contatos salvos no banco de dados. Para isso, vamos criar o método listar() na classe ContatoDAO, conforme a figura 38. Figura 37 - Tela de Listagem de Contatos Figura 38 - Método para Retorno da Lista de Contatos do Banco de Dados 43Android Agora que temos a tela pronta e a lista de contatos que vem do banco de dados, vamos atualizar a classe ListagemActivity, a fim de exibir o menu principal da nossa App e os nomes dos contatos na tela. O Android utiliza métodos de callback (métodos invocados pelo próprio Android) para facilitar a interação com seus aplicativos. Dentre esses métodos, temos o método onCreateOptionsMenu(), que é disparado pelo Android para criar o menu da aplicação e o método onOptionsItemSelected(), disparado sempre que uma opção do menu é clicada. Quando o usuário da App clicar na opção menu_novo, queremos chamar a tela de formulário, para que seja informados os dados do novo contato. No Android, essa transição de telar ocorre a partir do uso de Intents, onde podemos informar a tela de origem (this) e a tela de destino (FormularioContatoActivity.class). Para iniciar a tela de destino, utilizamos o método startActivity(). A figura 39 apresenta o código fonte necessário para trabalharmos com o menu principal da nossa App. A exibição de uma listagem de contatos depende de alguns atributos: lista de nomes que será exibida (List<String>), componente de controle da ListView, um adaptador (ArrayAdapter<String>) para imprimir a lista e um layout de exibição (simple_list_item_1). Figura 39 - Novos Métodos da Classe ListagemActivity Android 44Android 44 A figura 40 traz o código necessário à exibição da lista de nomes de contatos, onde: a) o método carregarLista() faz a chamada à camada de modelo e gera a lista de nome; b) o método onResume(), executado sempre que a tela vai ser exibida, solicita a atualização da listagem de nomes. Para finalizar o nosso cadastro de contatos, precisamos fazer uma atualização no método onCreate() da classe FormulárioContatoActivity. Após a edição de todos os dados do novo contato, o usuário deve clicar no botão salvar e, ao invés de limpar os dados da tela, nossa aplicação deve encerrar a dela de formulário e retornar à tela de listagem. Para encerrar uma Activity, podemos clicar no botão Back do aparelho ou invocar o método finish(), conforme exibido na figura 41. Figura 40 - Atributos e Métodos da Classe ListagemActivity.java 45AndroidAndroid 45 8. Câmera e um Pouco do Sistema de Arquivo Agora que nossa aplicação tem uma telade cadastros e outra para listagem, vamos criar a funcionalidade que permite que o usuário inclua fotos de seus contatos. Para isso, seguiremos uma estratégia onde os arquivos físicos das fotos ficam armazenados no sistema de arquivos do device e armazenamos apenas o caminho para a foto no banco de dados. A fim de melhorar a organização do nosso código fonte, vamos implementar um padrão de projetos conhecido como Helper, onde criamos uma classe para ficar responsável pela sincronização de dados de um formulário. Para isso, criaremos a classe FormularioHelper, que ficará responsável pelo retorno e atualização de dados da tela. Figura 41 - Atualização do Evento de Clique do Botão Salvar Android 46 A nova classe FormularioHelper define atributos de nome, telefone, email, endereço, site, foto (que antes ficavam na classe Formulario), além de um método construtor, que recebe a Activity que controla a tela de edição dos dados de Contatos. Em seu método carregarFoto(), implementamos a lógica necessária para acessar o sistema de arquivos, carregar o arquivo na memória do device e exibir a figura correspondente. A figura 42 apresenta os métodos citados. O método getContato() da classe FormularioHelper é usado para criarmos um objeto Contato, a partir dos dados exibidos na tela do device, enquanto o método atualizarTela() recebe um objeto Contato e atualiza os componentes de tela. A figura 43 apresenta os métodos getContato(), atualizarTela() e getFoto(). Figura 42 - Classe de Implementação do Padrão de Projeto View Helper 47AndroidAndroid 47 Em nossa aplicação, permitiremos que o usuário adicione foto aos contatos. Para isso, precisamos acessar a câmera do device, salvar a imagem capturada em uma pasta do sistema de arquivos e carregar a foto em nossa aplicação. Quando instalamos um novo aplicativo em nosso smartphone, é comum que seja exibida uma lista informando quais componentes do device serão acessados pela App. Isso ocorre porque o acesso a componentes como câmera e sistema de arquivos é restrito e deve ser autorizado pelo usuário. Para pedir a autorização necessária, atualize o AndroidManifest.xml, conforme a figura 44. Figura 43 - Últimos Métodos da Classe FormularioHelper Android 48 Precisamos atualizar nossa classe FormularioContatoActivity, a fim de incluir a interação com o Helper e o tratamento de fotos. Para isso, vamos remover os antigos componentes de tela e incluir atributos para controle do Helper, câmera e sistema de arquivos, conforme a figura 45. A troca da foto de um contato acontece a partir do click no ImageView do formulário, quando invocamos a Intent MediaStore.ACTION_IMAGE_ CAPTURE, usada para carregar a câmera do aparelho, passando como parâmetro o local onde queremos armazenar a foto. A execução dessa nova Activity é realizada a partir do método startActivityForResult() e o seu resultado é capturado em onActivityResult(). O trabalho no desenvolvimento de aplicativos móveis traz uma peculiaridade, não encontrada em aplicações web ou desktop. Quando giramos a tela do device, o layout pode ser reconfigurado, para se adequar às novas dimensões de apresentação. Contudo, durante esse processo, podemos perder alguns dados da tela. Para evitar a perca do caminho Figura 44 - Inclusão de Permissões de Acesso no AndroidManifest.xml Figura 45 - Atualização da Classe FormularioContatoActivity 49Android da imagem, vamos implementar o método onSaveInstanceState(), para salvar o caminho na memória e recuperá-lo no método onCreate(), conforme a figura 46. Avançando nas atualizações do nosso código fonte, vamos atualizar o método onCreate() da classe FormularioContatoActivity, onde precisamos: (1) remover as linhas com método findViewById(); (2) criar o objeto helper responsável pelas regras de tela; e (3) atualizar o click do botão salvar, para solicitar serviço do helper, conforme a figura 47. Figura 46 - Método onSaveInstanceState da classe FormularioContatoActivity Figura 47 - Atualização do método onCreate() da classe FormularioContatoActivity Android 50 Para completar a atualização do método onCreate, vamos incluir, apos o comentário “//Continua...”, o código para carregar a foto, caso o device tenha sido rotacionado e a implementação do click no ImageView, que chama a câmera, conforme a figura 48. Agora que já abrimos a câmera para que o usuário capture a nova foto do contato, precisamos recuperar a imagem gerada e atualizar a figura exibida no ListView do formulário. Para isso, vamos implementar o método onActivityResult, que chama o método carregarFoto() do helper, passando o caminho para a imagem. A figura 49 apresenta o código do método de retorno da câmera. Atualize o código fonte e teste a nova funcionalidade em um device. Figura 48 - Continuação do Método onCreate() 51Android 9. Componentes Customizados Agora que capturamos a foto, vamos atualizar a tela de listagem para exibir a foto e o nome dos contatos, onde cada contato será exibido com uma cor diferente. Para chegarmos a esse efeito, vamos começar pela criação do arquivo /res/values/colors.xml, conforme a figura 50. As linhas da nossa listagem devem exibir a foto e o nome do contato. Vamos criar o arquivo /res/layout/item.xml para organizar os componentes de imagem e texto, conforme a figura 51. Figura 49 - Método onActivityResult da Classe FormularioContatoActivity Figura 50 - Arquivo de Definição de Cores Android 52 Agora, precisamos criar uma classe, filha de BaseAdapter, para processar e configurar adequadamente a exibição de cada contato da listagem, conforme a figura 52. Figura 51 - Layout de Cada Contato da Listagem Figura 52 - Adapter Customizado Para Exibição de Contatos 53Android Continuando nossa classe ContatoAdapter, precisamos implementar o método getView(), responsável pela exibição do Contato, conforme a figura 53. A figura 54 apresenta o resultado da exibição da listagem de contatos. Figura 53 - Método de Configuração de Cada Linha da Listagem Figura 54 - Resultado dos Componentes Customizados Android 54 10. Trabalhando com Serviços em Background O Android nos possui uma série de serviços de segundo plano (background), que rodam independentes das nossas aplicações, oferecendo recursos como recebimento de notificações e SMS. Para acesso a esses serviços, precisamos criar uma classe filha da classe abstrata BroadcastReceiver e implementar o método onReceive(). Após a criação da classe, precisamos registrar nosso novo receiver no AndroidManifest.xml. A figura 55 mostra a nossa classe SMSReceiver(à esquerda), a atualização do AndroidManifest (à direita) e o resultado das gerado (a baixo). 11. Trabalhando com Mapas e GPS O trabalho com mapas em Android chama a atenção dos desenvolvedores pela facilidade de integração com dos aplicativos desenvolvidos, com a Google Maps API. Para isso, precisamos criar uma chave, executando os seguintes comandos: • LINUX e MAC: keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android Figura 55 - Trabalhando com BradcastReceiver 55Android • Windows 7: keytool -list -v -keystore “C:\Users\usuario\.android\ debug.keystore” -alias androiddebugkey -storepass android -keypass android A figura 56 apresenta o resultado da execução do comando keytool. Agora, precisamos gerar uma chave de desenvolvimento (API Key) no Maps. Para isso, acesse https://console.developers.google.com/ project, crie um novo projeto e habilite a opção: Google Maps Android API v2. Para finalizar o registro, crie uma nova chave usando o código SHA1 gerado como comando keytool, concatenado com a string “;br. com.cursoandroid.agenda”, conforme a figura 57, onde foi gerada a API Key: AIzaSyCoypm7ATo2UaR2YgLunDYXRTfg1C5P-v8 Figura 56 - Resultado do Comando Keytool no Mac Figura 57 - API Key Gerada pelo Google Maps Android 56Android 56 Agora, vamos criar nossa Activity para mapas, conforme a figura 58. Informe os nomes da Activity = “MapsActivity” e do arquivo de layout = “mapslayout” e clique em Finish. Além da Activity e do layout, o Android Studio gerar o arquivo /res/values/google_maps_api.xml, onde devemos incluir a nossa API KEY gerada pelo Google, conforme a figura 59. Abra o AndroidManifest e veja as linhas incluídas pelo Android Studio, para controle da tela de mapas. Em seguida, atualize o método onOptionsItemSelected() da classe ListagemActivity, para chamar a Activity de mapas, conforme a figura 60. Figura 58 - Criação da Tela de Mapas Figura 59 - Atualização do Arquivo Google_maps_api.xml 57Android A configuração padrão do mapa, mostra os continentes, e uma marcação onde longitude e latitude são iguais a zero. Vamos atualizar o método setUpMap() da classe MapsActivity para marcar o endereço da FUCAPI e aumentar o zoom da câmera, conforme figura 61. Figura 60. Exibir tela de mapas Figura 60 - Exibir Tela de Mapas Figura 61 - Atualização da Classe Maps Activity Android 58 Embora o uso de coordenadas de latitude e longitude seja simples, nem sempre temos esses dados à disposição, sendo mais comum termos a informação de endereço que desejamos marcar. A figura 62 mostra uma função que recebe uma string com o endereço a ser marcado e devolve um objeto LatLng com as respectivas coordenadas. Vamos atualizar o método setUpMap() da classe MapsActivity para marcarmos o endereço de um vizinho da FUCAPI, conforme a figura 63. Figura 62 - Exibir Tela de Mapas Figura 63 - Marcação de Pontos Utilizando o Endereço 59AndroidAndroid 59 Para finalizar, a Figura 64 apresenta a tela de mapas atualizada com a nova marcação. Figura 64 - Resultado da Marcação por Endereço Android 60 Palavras do Coordenador Neste módulo você teve a oportunidade de aprender sobre como começar a desenvolver aplicativos de software utilizando a linguagem Java para a plataforma Android, uma plataforma de código aberto cujo desenvolvimento de programas é amplamente incentivado pelo Google. Como isso, você tem possiblidade de programar para uma gama enorme de dispositivos móveis, muito utilizados por usuários do mundo inteiro, como por exemplo: PDAs, tablets, smartphones, consoles de jogos, players de MP3/MP4 entre outros. No próximo módulo, veremos quais são os conceitos e tecnologias por traz do desenvolvimento de websites, sejam eles desde uma simples página estática até aplicativos dinâmicos. Vamos precisar que você continue a se dedicar com muita força de vontade no estudo destes módulos. Boas Aulas. Até logo! 61Android Referências Bibliográficas BURTON, Michael. Desenvolvimento de aplicativos Android para leigos. Alta books, Rio de Janeiro, 2014 LECHETA, Ricardo. Google Android, 3a edição, Novatec, São Paulo, 2013 ___________________. Google Android para tablets, 3a edição, Novatec, São Paulo, 2012 Site: d.android.com Android 62 CRIAÇÃO DE CONTEÚDO Márcio Palheta Piedade REVISÃO TÉCNICA Alessandro Carlos Frota Freire ORIENTAÇÃO E REVISÃO DIDÁTICA Débora Claudiano da Silva PROJETO GRÁFICO E EDITORAÇÃO Thiago Lemos ILUSTRAÇÕES Emanuel Braga Ferreira COORDENAÇÃO GERAL Narle SIlva Teixeira 63Android
Compartilhar