sexta-feira, 26 de setembro de 2014

Android - Passando Dados de Webview Para Activity e de Activity Para Webview

Como chamar métodos da sua aplicação Android através de formulários HTML carregados em uma Webview? Eu consigo passar dados capturados da web para minha aplicação Android nativa? Consigo mostrar na web dados enviados da minha Activity?

Sem mais enrolação, vamos ao passo-a-passo!

1) Crie um simples projeto Android com o nome de PocWebView (POC significa Prova de Conceito ou Prove Of Concepts) e nomeie sua Activity principal como MainActivity. Se você tem dificuldades em dar este primeiro passo siga nosso tutorial de como criar um projeto Android aqui.

2) Crie uma simples página HTML com o código abaixo e a salve com o nome "simplesHTML.html" na pasta "res/assets" do seu projeto. Caso a pasta não exista, crie-a.

OBS.: Este arquivo poderia estar contido em um servidor web qualquer, isso não mudaria o código deste tutorial significativamente.


 <html>  
    <head> </head>  
    <body>   
      <div id="resposta" ></div>   
      <div>   
         <form id="form1">   
           <table width="100%" class="mytable">   
              <tr>   
                <td>Nome</td>   
              </tr>   
              <tr>   
                <td><input type="text" id="txt_nome"></td>   
              </tr>   
              <tr>   
                <td>E-mail</td>   
              </tr>   
              <tr>   
                <td><input type="text" id="txt_email"></td>   
              </tr>   
           </table>   
         </form>   
      </div>   
      <button onClick="chamarActivity()">Chamar Activity</button>   
    </body>  
 </html>  

Este é um formulário simples que pede para o usuário digitar um nome e um email.

Verificamos que nosso botão "Chamar Activity" faz a chamada a uma função Javascript chamada "chamarActivity()" a qual não definimos ainda. Também foi definida uma "div" na página com o id "resposta" que utilizaremos para montar a página de resposta com os dados que serão enviados pela Activity.

3) Agora vamos deixar um pouco a página HTML de lado e vamos às configurações em nossa aplicação Android. Modifique seu arquivo "activity_main.xml" (ou correspondente) na sua aplicação Android adicionando um componente "Webview" desta forma:


4) Crie um atributo do tipo "android.webkit.Webview" em sua "MainActivity.java" (ou correspondente) e associe-o ao componente Webview de seu arquivo de layout:


5) Criaremos uma classe privada chamada "MyWebViewClient" que herda de "android.webkit.WebviewClient" apenas para evitarmos que as ações dentro de nossa webview abram o browser de nosso aparelho. Para isso sobrescreva o método "shouldOverrideUrlLoading" e configure esta classe como sendo o "WebViewClient" de sua Webview. Ficará desta forma:


6) Ativaremos o recurso de "JavaScript" em nossa Webview e vamos configurar nossa Activity permitindo acesso a ela através de "Javascript". Isso é feito através do método "addJavascriptInterface" passando como parâmetro o Objeto que será acessado (em nosso caso será nossa própria Activity) e o prefixo que será utilizado na web para encontrar tal Objeto. Iremos também carregar nossa página HTML em nossa Webview. Segue trecho do código responsável por este feito:



7) Neste passo iremos criar o método de nossa Activity que será chamado pelo botão criado em nosso formulário na página HTML. O mesmo método, como resposta, chamará um método declarado em Javascript na nossa página que criará um formulário de resposta com os dados recebidos pela Activity. Segue método comentado para melhor entendimento:


8) Agora acrescente no "head" de sua página html o seguinte javascript:

 <script type="text/javascript">  
    function metodoWebView(data){  
       var obj = eval ("(" + data + ")");   
       var html = "<p><b>Data received</b><br><br>"+   
       "Nome: <span>"+obj.param_nome+"</span><br>"+   
       "E-mail: <span >"+obj.param_email+"</span></p>";  
       var div_resposta=document.getElementById("resposta");   
       div_resposta.innerHTML = html;   
    }  
    function chamarActivity(){  
       var nome = document.getElementById("txt_nome").value;   
       var email = document.getElementById("txt_email").value;   
       var dataObj = new Object();   
       dataObj.param_nome = nome;  
       dataObj.param_email = email;   
       var jsonObj = JSON.stringify(dataObj);   
       pocwebview.metodoActivity(jsonObj);   
    }  
 </script>  

É isso aí!! Se tudo ocorreu bem e você seguiu todo o passo-a-passo, certamente você terá em mãos uma aplicação que conversa com uma Webview!! ;)

Faça download do código fonte desta aplicação AQUI.


quarta-feira, 24 de setembro de 2014

Android - Criando Novo Projeto

Como criar um novo projeto Android? Tarefa simples, porém pra quem está iniciando com a tecnologia, está iniciando com o Eclipse ADT, ou mesmo se tem apenas alguma dúvida sobre as configurações existentes na criação de um novo projeto Android, este post será bastante útil!

Sem mais enrolação, vamos ao passo-a-passo!

1) Faça o download do Eclipse ADT que será a IDE de desenvolvimento que utilizaremos na maioria de nossos tutoriais Android. Ao inicia-lo ele irá pedir um "Workspace" que será o local em seu computador onde ficaram armazenados seus projetos. Iniciando a IDE, clique "File" na barra de ferramentas, posicione em "new" e em seguida selecione "Android Application Project":




Na "wisard" que se segue iremos às configurações iniciais de nosso projeto e digamos que a mais importante. Iremos determinar intervalo de versão de Android que nosso aplicativo irá aceitar, nome, pacote, tema, etc.



2) É importante saber o que cada item desses significa e como configura-los para atender a demanda e padrão do mercado. O primeiro e segundo nome talvez sejam os mais intuitivos. 
No primeiro campo será o nome do seu aplicativo sem restrição nenhuma de caracteres especiais (*&¨%$). 
No segundo campo será o nome do seu projeto, que por padrão é o nome do seu aplicativo, porém sem espaços em branco e sem caracteres especiais. 
No terceiro, apesar de o nome também ser intuitivo, pouca gente sabe qual o padrão do mercado. O padrão para seu "Package Name" (nome do pacote da sua aplicação) é "com.nomedaempresa.nomedoaplicativo". Isso mesmo, se você já trabalhou com projetos Java Web já está familiarizado com isso. Muitas pessoas começam a desenvolver aplicativos e não têm ainda uma empresa ou sequer pensam em abrir; nesse caso eu sugiro colocar seu sobrenome ;) . 
Minimun Required SDK (como o nome já diz) será a mínima versão de SDK Android que seu aplicativo irá aceitar. Atente-se para duas dicas: Primeira, quanto menor a versão aceita pelo seu aplicativo maiores adaptações deverão ser feitas para garantir um código compatível e para conseguir utilizar recursos mais sofisticados (até mesmo visual como é o caso a ActionBar que é aquela famosa barrinha de botões); Segunda, apenas 12% dos aparelhos Android distribuídos mundialmente utilizam a versão 2.x do Android, a versão 3.x foi praticamente extinta do mercado (foi a versão que não deu certo, tipo o windows vista da microsoft rsrsrs) e toda a grande maioria utiliza a versão 4.x como é possível conferir aqui no próprio site do Android . Sendo assim, utilizando a SDK de número 14 você já consegue utilizar quase todos os novos recursos ao mesmo tempo que engloba aproximadamente 87% dos aparelhos distribuídos mundialmente. Show de bola! Não?
Target SDK será a versão mais alta de SDK em que seu aplicativo será capaz de ser executado (deixa a última como padrão).
Compile With será a versão com que sua aplicação será compilada (como a ultima versão do SDK que é a Android L ainda está em fase beta, evite dores de cabeça e mantenha a versão 20 rsrs).
Theme será o tema da sua aplicação. Praticamente é uma configuração dispensável pois raramente aplicativos mantém esses temas predefinidos, os desenvolvedores sempre deixam seus aplicativos com sua cara. Ficará assim:



3) Clique em "Next". Na próxima tela iremos deixar as configurações padrões, porém é bom que saibamos o que cada opção significa. 
A primeira opção irá criar um ícone principal para nossa aplicação. Ícone que será mostrado no celular ao instalar a aplicação assim como será mostrado como "home" na nossa "ActionBar" (citada anteriormente).
A segunda irá criar a primeira "telinha" do nosso aplicativo (é bom para exemplo na criação das demais).
A terceira opção marca nossa aplicação como biblioteca para apenas ser usada dentro de outras aplicações. Não utilizaremos essa opção.
A quarta cria seu projeto dentro do seu "Workspace" (que selecionamos na inicialização da IDE Eclipse ADT ).
A quinta e última opção é no caso de termos um conjunto de aplicações onde mostramos em nosso Project Explorer parte de cada uma e neste caso é se quisermos adicionar essa nossa nova aplicação à este conjunto. Não a utilizaremos.

Ficará assim:




4) Clique em "Next" e na próxima tela iremos deixar nosso ícone ser criado conforme o sugerido (depois podemos alterá-lo facilmente para um ícone qualquer que tenhamos criado para nosso aplicativo).



4) Na próxima tela escolheremos o tipo de "telinha" que será criada como nossa primeira tela do aplicativo. Tenha em mente que uma aplicação Android divide uma "tela" em duas partes: layout.xml e TelaActivity.java, onde na primeira você "desenha" o layout da sua tela e na segunda você manipula e altera em tempo de execução cada componente que você "desenhou" em seu layout. Sendo assim, daqui em diante quando falarmos de "Activity" estaremos falando de "tela" e cada "Activity.java" tem seu arquivo "layout.xml" correspondente. Deixe a seleção em "Blank Activity" para que uma Activity simples seja criada.



5) Depois de explicarmos a relação Activity - layout fica fácil saber o que será feita nessa próxima tela. Aqui escolheremos o nome de nossa Activity e arquivo de layout que será criado. Por convenção, toda Activity termina com o nome Activity e todo arquivo de layout tem o prefixo "layout_" acrescentando o nome da Activity correspondente. Para incentivar seguir esta convenção a "wisard" do Eclipse ADT já nos induz a segui-la. Para aprendizado, nomearemos nossa Activity principal para PrincipalActivity. Ficará assim:



Clique em "Finish" e seu primeiro projeto estará criado e pronto para ser executado!





É isso aí pessoal! Se tudo ocorreu bem e você seguiu o "Passo-a-Passo", você acaba de criar sua primeira aplicação Android, e não é só isso, agora você sabe o que faz e o que significa cada opção que é disponibilizada na "wisard" Eclipse ADT de criação de projetos Android! Até a próxima!  ;)

sexta-feira, 12 de setembro de 2014

Android - Capturando Imagens

Como capturar imagens com a câmera para dentro do meu projeto Android? Como selecionar uma imagem já existente em minha galeria?

Sem mais enrolação, vamos ao passo-a-passo!

OBS.: Se você já desenvolve para Android e/ou já tem um bom conhecimento da linguagem e não precisa de todo um passo-a-passo básico, avance direto para o passo 7 deste tutorial. ;)

1) Utilizando o Eclipse ADT como IDE de desenvolvimento, crie um novo projeto Android:

 

Vamos dar o nome de nosso projeto de "ProjetoCapturaImagens". Utilizaremos como como SDK mínima a API 14 (que já é suficiente para englobar a GRANDE quantidade de aparelhos utilizados atualmente segundo o próprio site Android Developer).


Clique em "Next" e certifique-se de "checkar" (odeio esse termo) a opção "Create Activity" e fazendo isso é só clicar em "Next" (dei o nome de "ProjetoCapturarImagemActivity" para a minha Activity principal), "Next" e "Finish"!

2) Como estamos falando de algo relativamente simples, iremos utilizar apenas a própria Activity criada automaticamente pelo Eclipse ADT, mas antes de modificarmos qualquer coisa em nossa Activity, precisamos deixar explicito em nossa aplicação que utilizaremos a câmera do dispositivo ao qual nossa aplicação será instalada. Fazemos isso incluindo o seguinte trecho em nosso arquivo "AndroidManifest.xml":

3) Ainda no mesmo arquivo, informamos que utilizaremos a "feature" de câmera porém ela não será obrigatória para se usar a aplicação (até porque também utilizaremos a galeria). Fazemos isso incluindo no "AndroidManifest.xml" a seguinte instrução:


Por fim, nosso arquivo "AndroidManifest.xml" ficará assim:


OBS.: Note que dei o nome da minha Activity de "CapturaImagemActivity", se você seguiu todos os passos com as configurações padrão na criação do projeto, sua Activity deverá estar nomeada como "MainActivity" e seu arquivo de layout como "activity_main.xml". Isso não interfere em nada ;)

4) Agora vamos montar o layout de nossa aplicação. Fazemos isso modificando o nosso arquivo de layout que se encontra no diretório de nosso projeto na pasta "res/layout". Vamos montar a seguinte tela:


Onde teremos uma área que servirá para mostrar a imagem capturada (seja da câmera ou da galeria), um botão para capturar a imagem ativando a câmera, um segundo botão para capturar a imagem direto da galeria e um terceiro para remover da tela a imagem capturada.
Nosso arquivo de layout "activity_main.xml" (no meu caso "activity_projeto_capturar_imagens") ficará assim:


Note que todos os textos da tela estão sendo referenciados do arquivo de "strings" do projeto que se encontra no diretório do projeto na pasta "res/values/strings.xml". Essa é uma boa prática e eu fortemente recomendo para além da questão de organização, facilitar o trabalho de tradução do aplicativo para outros idiomas (caso queira). Seu arquivo "strings.xml" deve ficar assim:


5) Agora sim, podemos em fim ir para o código da nossa Activity! Vamos começar criando objetos relativos aos componentes que temos em nosso arquivo de layout (botões e imagem) e vinculando-os para manipularmos tais componentes através do código em nossa Activity.

Crie atributos globais para sua Activity referentes aos três botões da tela e à imagem que será mostrada. Crie também dois atributos constantes que utilizaremos mais tarde para distinguir se a imagem foi capturada pela câmera ou selecionada da galeria. Ficará assim:


Vamos criar um método chamado "inicializarComponentes" que será responsável por vincular nossos objetos com os componentes de nosso layout:


E chamamos esse método dentro de nosso método "onCreate" criado automaticamente pelo Eclipse ADT. Caso não tenha feito isso, crie-o trocando o layout "activity_projeto_capturar_imagens" pelo nome do seu arquivo de layout. Ficará assim:


Pronto, agora que temos como manipular os componentes de nosso layout (os três botões e a imagem), vamos definir "ações e comportamentos" para nossos componentes, começando pelos botões. 

6) Ao clicar em qualquer dos botões de nosso layout (câmera, galeria ou deletar imagem), um evento é disparado e é através desse evento (click) que identificamos qual botão foi clicado e o qual ação executar a partir desse clique. Para que nossa Activity esteja apta á capturar e tratar esses eventos de clique temos que implementar uma interface chamda "OnClickListener" do pacote "android.view" (cuidado para não utilizar a interface do pacote "android.content"). Adicione a declaração de que está implementado tal interface junto à assinatura de sua classe Activity:


Feito isso, sobrescreva o método "onClick" (obrigatório para implementação desta interface).:


 Agora vamos declarar a nossa Activity como sendo a classe responsável por tratar o evento de clique de nossos botões através do método "setOnClickListener" alterando o nosso método "inicializarComponentes" deste modo:


Percebe-se que os três botões de nosso layout terão seus eventos de "clique" tratados pela mesma classe (nossa Activity) e pelo mesmo método ("onClick" que sobrescrevemos). Devemos então distinguir dentro de nosso método "onClick" qual botão está sendo clicado. Verificamos isso desta forma:


7) Finalmente, o pulo do gato! Até aqui fizemos nada mais que montar e configurar uma tela em Android que até o momento nada faz! Agora vamos ao que interessa. 
Como tudo em Android é feito através de "Intents", aqui não vai ser diferente. Criaremos um objeto "Intent" onde sua ação dependerá de qual botão de nosso layout foi clicado. Caso o botão clicado tenha sido o de capturar imagem através da câmera utilizaremos a ação de "MediaStore.ACTION_IMAGE_CAPTURE", caso tenha sido o botão de capturar imagem direto da galeria quem tenha disparado o evento utilizaremos a ação "Intent.ACTION_PICK" e a Uri "android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI", ambos "Intents" sendo "startados" (outro termo que odeio) para retornarem com algum resultado. Para o botão de deletar apenas anularemos o "bitmap" do nosso objeto relativo ao componente de imagem de nosso layout. 

Bom, chega de texto e vamos à imagem de como fica tudo isso no nosso método "onClick":


8) Estamos quase lá! Do jeito que está já conseguimos tirar a foto com a câmera de nosso dispositivo e também já conseguimos selecionar a imagem direto de nossa galeria, a questão é, o que estamos fazendo com a imagem capturada? Nada! Se iniciamos (melhor que "startamos" rsrs) nosso "Intent" com o método "startActivityForResult" devemos implementar o método "onActivityResult" para recuperarmos o retorno (imagem) relativo ao nosso "Intent".

Primeiro para o caso de usarmos a câmera, temos que identificar qual "Intent" que está nos retornando algo (para isso que criamos aquelas duas constantes lá no início, lembra? rsrs) depois recuperamos o "Bitmap" relativo à foto tirada pela câmera e por último mostramos a foto disponibilizando-a através de nosso objeto relativo ao componente de imagem de nosso layout. Desta forma:


Como a parte de selecionar a imagem direto da galeria é um pouco mais complicada (por incrível que pareça), comentei linha por linha do código que ficou auto explicativo e por isso vou poupar texto novamente e dar lugar à imagens:


É isso aí!! Se tudo ocorreu bem e você seguiu todo o passo-a-passo, certamente você terá em mãos uma aplicação que captura imagens tanto da câmera quanto direto da galeria! ;)

Faça download do código fonte desta aplicação AQUI.

Bem didático (até demais eu sei) mas a medida que os tutoriais vão ficando mais complexos eu irei focando mais na solução específica do que o projeto como um todo. Prometo! rsrsrs.