Utilização de JSON no Desenvolvimento de Aplicativos Multimídia para Dispositivos Android

1.      Introdução

O Modelo computacional Cliente-Servidor é utilizado para a troca de informações através de um ou mais serviço fornecido pelo servidor e onde o cliente representa uma entidade que consome os serviços de outra entidade servidora. O modelo cliente-servidor se tornou uma das ideias centrais de computação de rede ganhando mais força com a internet.
Hoje, a grande maioria dos aplicativos de negócios utiliza o modelo cliente-servidor. O serviço JSON que iremos apresentar neste artigo assim como o software desenvolvido para Android estão enquadrados neste modelo tornando-o mais flexível na distribuição dos dados gerados.
O Android é um sistema operacional baseado em Linux desenvolvido inicialmente para dispositivos móveis pela Google. Android conta com o Linux versão 2.6 para o sistema central de serviços, como segurança, gerenciamento de memória, gestão de processos, pilha de rede e modelo de driver. O núcleo também atua como uma camada de abstração entre o hardware e o resto da pilha de software.
As aplicações Android são escritas na linguagem de programação Java, todos seus códigos compilados são armazenados em um único arquivo com sufixo APK. O Android permite aos desenvolvedores escrever softwares na linguagem Java através do SDK fornecido pela Google. SDK é a sigla de Software Development Kit, o Android SDK inclui documentação, código e utilitários para que programadores consigam desenvolver as suas aplicações de acordo com um padrão de desenvolvimento. Cada aplicação Android roda em seu próprio processo, com sua própria instância da máquina virtual.
JSON (JavaScript Object Notation) é um formato para troca de dados que tem como sua maior característica a leveza, ou seja, é de fácil escrita e leitura. O JSON é baseado em um subconjunto do JavaScript (Standard ECMA-262 3rd Edition - December 1999), completamente independente de linguagem porém usando convenções familiares a programadores. Foi criado por Douglas Crockford e é descrito no RFC 4627. Por suas características é tipicamente usado em ambientes onde o tamanho do fluxo de dados entre o cliente e o servidor é de importância relevante. “A simplicidade de JSON tem resultado em seu uso difundido, especialmente como uma alternativa para XML em AJAX.” (Wikipédia, 2011)
Para o desenvolvimento dos aplicativos foram utilizadas algumas ferramentas, dentre elas estão:
A IDE Eclipse, plataforma de desenvolvimento aberta composta por frameworks e ferramentas para construção, gerenciamento e implantação de softwares;
Android SDK e AVD Manager, kit para desenvolvimento de software para o sistema operacional Android;
ADT (Android Developer Tools) é um plugin para Eclipse que fornece um conjunto de ferramentas que são integradas com a IDE Eclipse para ajuda no desenvolvimento de aplicativos Android.


2.      JSON e Servidor JSON

JSON é uma maneira simples baseada em texto para armazenar e transmitir dados estruturados. É um formato de dados compacto nativo do javascript. Usando uma sintaxe simples, podendo facilmente armazenar qualquer coisa de um número único, através de palavras, matrizes e objetos usando nada mais que uma sequência de texto simples. Também pode aninhar arrays e objetos, permitindo a criação de estruturas de dados complexas. O JSON é constituído de duas estruturas, uma coleção de pares nome/valor, (Figura 1) e como um array associativo e uma lista ordenada de valores, (Figura 2).
Uma vez criada, a sequência de dados é fácil enviá-lo para outro aplicativo ou computador, pois se trata de apenas texto simples.
Vantagens do JSON:
  • Formatação de dados compacta;
  • Fácil para pessoas como dois hosts lerem e escreverem;
  • Mapeia muito facilmente as estruturas de dados usadas por muitas linguagens de programação (números, sequências de caracteres, verdadeiro e falso, valores nulos, matrizes e matrizes associativas);
  • A maioria das linguagens de programação contem bibliotecas ou funções que fazem a leitura e também a escrita de estruturas JSON.

O JSON é comumente usado em aplicações para a Web, para o envio de dados de um computador servidor para o navegador, normalmente usando Ajax para esta transferência, permitindo que os dados de aplicativo web troquem mensagens entre o navegador e o servidor sem a necessidade do recarregamento da página. Também há a possibilidade do envio destes dados na forma inversa, ou seja, do navegador para o servidor desde que a cadeia de caracteres no formato JSON esteja devidamente codificada com os parâmetros GET ou POST.
A sintaxe e o tipo de dados básicos para o JSON são os números (inteiros ou decimais), sequência de caracteres (UTF-8 por padrão), booleano (verdadeiro ou falso), matriz (sequência ordenado de valores separadas por vírgula entre colchetes), um objeto (uma coleção não ordenada de chaves, pares de valores, separados por pelo carácter ‘:’ a chave de seu valor os quais são separados dos demais por vírgula e entre chaves as quais devem se sequência de caracteres distintas) e para terminar os valores nulos. Alguns tipos da sintaxe, podemos ver no Exemplo 1.


Figura 1. Estrutura de dados JSON – Objeto Coleção de pares (nome/valor)

Figura 1. Estrutura de dados JSON – Objeto Coleção de pares (nome/valor)


Figura 2. Estrutura de dados JSON – Lista ordenada de valores (array, vetor, lista ou sequência)

Figura 2. Estrutura de dados JSON – Lista ordenada de valores (array, vetor, lista ou sequência)


Exemplo 1. Simples exemplo da estrutura do formato de escrita em JSON
{
 "CodigoVenda": 389,
 "NomeVendedor": "José da Silva,
 "itensVenda": [    
   {
     "CodigoProduto": 55,
     "NomeProduto": "Chinelo Preto",
     "ValorUnitário": "29,99",
     "Quantidade": 1},
   {
     "CodigoProduto": 12,
     "NomeProduto": "Camisa Polo",
     "ValorUnitário": "53,99",
     "Quantidade": 2}
 ],
 "VendaConfirmada": true
}


2.1. JSON e PHP

O pacote do JSON está disponível no PHP a partir da versão 5.2.0, ela foi empacotada e compilada junto com o PHP por padrão ou através do PECL. PECL é um repositório de extensões PHP que fornece um diretório de todas as extensões conhecidas. Ou seja, o suporte a JSON no PHP é nativa, não sendo necessário sua a instalação ou ativação a partir da versão 5.2.0.
Para escrevermos uma representação de dados em JSON, há a função json_enconde, que retorna uma string contendo a representação do valor no formato JSON.
Para lermos uma representação de dados JSON, é usada a função json_decode, a qual pega uma string codificada JSON e converte-a em uma variável PHP.
A estrutura JSON e um array PHP associativo são extremamente semelhantes, ambos representam os mesmos tipos de dados da mesma maneira, e ambos têm uma sintaxe específica para fazê-lo. Portanto, para criar um objeto JSON no PHP, você pode simplesmente criar um array associativo.

Exemplo 2: PHP no lado servidor que faz a sincronização dos dados.
<?php 
$json = file_get_contents('php://input'); 
$data = json_decode($json);
foreach ($data as $id => $jsons) { 
  mysql_query("insert into tabela values(".$jsons->id.",'".$jsons->title."')");
}
?>


2.2. JSON e Android

O JDK Android inclui em suas bibliotecas o suporte para JSON através do pacote org.json.
A criação de um JSON a partir de um objeto Java (POJO) consiste na manipulação da classe org.json.JSONObject e org.json.JSONArray que são as classes principais da API de JSON. Nota-se que respectivamente elas representam as duas estruturas de dados JSON, (Figura 1 e Figura 2).
A classe JSONObject é uma coleção ordenada de pares nome/valor. Sua forma é uma cadeia envolta em chaves com vírgulas entre os nomes e valores, e vírgulas entre os valores e nomes. A forma interna é um objeto ter se e optar por métodos para acessar os valores por nome, e colocar métodos para adição ou substituição de valores pelo nome. Os valores podem ser qualquer um destes tipos: Boolean, JSONArray, JSONObject, Number, String, ou o objeto JSONObject.NULL. Um construtor JSONObject pode ser usado para converter um externo forma de texto JSON em uma forma interna, cujos valores podem ser recuperados com o get, ou para converter valores em um texto JSON usando o put. Um método get retorna um valor se foi encontrado, e lança uma exceção se não for encontrado. Um método opt retorna um valor padrão ao invés de lançar uma exceção, e por isso é útil para obtenção de valores opcionais.
A classe JSONArray é uma sequência ordenada de valores. Sua forma de texto é uma cadeia envolta em colchetes com vírgulas separando os valores. A forma interna é um objeto, tendo que acessar os valores pelo índice, e aplicar os métodos para adição ou substituição de valores. Os valores podem ser qualquer um destes tipos: Boolean, JSONArray, JSONObject, Number, String, ou o objeto JSONObject.NULL.

Exemplo 3. Uso do JSON no Java.
jsonarray = new JSONArray();
json = new JSONObject();
json.put("id", "1");
json.put("title", "Exemplo");
jsonarray.put(json);
StringEntity se = new StringEntity(jsonarray.toString());


3.      Aplicativo Android

O aplicativo proposto é um tomador de notas multimídia. Basicamente o projeto consiste em um aplicativo para dispositivos móveis o qual o usuário poderá lançar notas de memória nos tipos texto, foto e áudio cada qual contendo a geo-localização momentânea ao seu lançamento. O aplicativo terá uma tela de consulta das notas e sua reprodução assim como funções para a sincronização das notas em um servidor JSON.
Um aplicativo Android pode ser observado como uma série de componentes lógicos que interagem entre si em tempo de execução. De forma simplificada, os principais componentes são: Atividades (Activity), Interface gráfica (View), Intents e bibliotecas, classes utilitárias, lógica de negócios, código de banco de dados, código de comunicação com o servidor, etc..
Activity representa todo o código associado a uma tela do aplicativo. Só há uma atividade por tela, e só uma tela por atividade. Cada tela pode contém diversos componentes visuais (views). A Activity contém o código que monta a tela (insere a view principal) e que lida com os eventos. Uma aplicação consiste geralmente de múltiplas activities que estão levemente agrupadas umas as outras. Normalmente, uma activity em um aplicativo é especificada como a atividade "principal", que é apresentada ao usuário ao iniciar o aplicativo pela primeira vez. Cada atividade pode, em seguida, iniciar outra atividade, a fim de executar ações diferentes. Toda Activity deve ser declarada explicitamente no arquivo geral de configuração do aplicativo (AndroidManifest.xml).
Toda activity possui um ciclo de vida (Figura 3), pois em dispositivos móveis como celular, o usuário pode receber uma ligação a qualquer momento e a aplicação terá que tratar o evento garantindo o seu funcionamento. Para isso cada activity possui uma máquina de estados que permitem ao desenvolvedor controlar a aplicação através de métodos como: onCreate(), onStart(), onRestart(), onResume(), onPause(), onStop() e o onDestroy(). “Entender o ciclo de vida de uma Activity Android é muito importante para garantir a criação de uma aplicação robusta.” (José, 2011)


Figura 3. Ciclo de vida de uma Activity
Figura 3. Ciclo de vida de uma Activity

A função onCreate() é responsável pelo carregamento dos parâmetros da tela assim como outras operações na inicialização da activity. É a primeira função executada quando uma activity é chamada, somente sendo executada uma única vez.
A função onStart() é executada logo após a onCreate(), esta sempre será executada quando o foco da aplicação voltar de um estado de espera para a activity.
A função onResume() é bem semelhante a função onStart(), sempre será executada na inicialização a na volta de um estado de espera, porém é chamada sempre na volta do estado de espera enquanto a função onStart() é executada quando a activity não esta mais visível na tela.
A função onPause() é a primeira a ser executada quando uma activity que estava em foco sai de seu estado e outra toma o foco, porém esta activity pode não ter saído se sua visualização ainda.
A função onStop() é executada quando a activity que estava em onPause() sai da visualização de tela ficando esta activity completamente encoberta por outra.
A função onDestroy() é a última a ser executada dentro do ciclo de vida da activity determinando o fim de vida da activity, ou seja, destruindo o objeto.
A função onRestart() é chamada quando uma activity que estava sem visualização retoma o foco. Esta função é sempre chamada antes da função onStart().
View pode ser definida em arquivos XML (definição declarativa), em código Java (definição programática) ou em ambos. Apesar da interface definida via código Java ser mais flexível, via XML é mais fácil de dar manutenção e melhor para separar o que é código do que é design da interface. Algumas views, chamadas de Layouts, podem conter outras views e funcionam como organizadoras das views filhas.
Intents são classes que representam a intenção de se fazer algo. É a forma de um aplicativo chamar outro ou de uma tela do aplicativo chamar outra tela. Pode ser explícito (execute a atividade da classe X) ou pode ser indireto (execute uma atividade que saiba mostrar arquivos PDF).
As bibliotecas, classes utilitárias, lógica de negócios, código de banco de dados, código de comunicação com o servidor, podem ser definidos em arquivos Java ou em pacotes JAR. Geralmente são usados como suporte pelas Activities.
A aplicação tomadora de notas multimídia tem o seguinte escopo:
MainActivity: tela inicial usando um TableLayout contento 4 botões, sendo eles, criar nota de texto, criar nota com foto, criar nota de áudio e ver todas as notas. Cada um abrindo sua respectiva activity. Conta também com menu de opções para entrada na tela de configuração (SetupActivity).
NewNotesActivity: tela para criação de notas de texto usando TableLayout contento um textview onde aparecerá a geo-localização, um campo para texto para o título da nota, um campo texto para a nota, 2 botões, sendo eles: salvar nota criada e cancelar. Para o botão salvar a nota a ação será de salvar e destruir a activity, voltando para a activity principal e para o botão cancelar a ação será de destruir a activity sem o salvamento automático da nota voltando para a activity principal.
NewPhotoActivity: tela para criação de notas com foto usando TableLayout contento um textview onde aparecerá a geo-localização, um campo texto para o título da nota, 1 botão para tirar a foto e um ImageView para visualizar a foto tirada. Além dos botões Salvar e Cancelar. Para o botão salvar a nota a ação será de salvar e destruir a activity, voltando para a activity principal e para o botão cancelar a ação será de destruir a activity sem o salvamento automático da nota voltando para a activity principal.
NewAudioActivity: tela para criação de notas com áudio usando TableLayout contento um textview onde aparecerá a geolocalização, um campo texto para o título da nota, um visualizador de tempo de gravação e 3 botões sendo: Gravar, Tocar e Parar, componente Sound recorder privido com Android SDK 1. Além dos botões Salvar e Cancelar. Para o botão salvar a nota a ação será de salvar e destruir a activity, voltando para a activity principal e para o botão cancelar a ação será de destruir a activity sem o salvamento automático da nota voltando para a activity principal.
MyNotesActivity: tela que mostra a lista de notasarmazenadas através de uma ListView. Cada item da lista será um RelativeLayout com TextViews para título, subtítulo e data além do tipo de nota (Texto, Áudio ou Foto). Quando clicadas as notas usam as próprias activitys de criação para sua visualização, porém com os campos desabilitados. Os itens em lista desta activity terão o título, data e hora e uma imagem identificando qual seu tipo (texto, áudio ou foto). Nesta tela há o menu de opções contento o itens para ativação da sincronização dos dados com o servidor JSON.
SetupActivity: tela para configuração da aplicação onde é armazenada as informações para conectividade com o servidor JSON e a opção de auto sincronização, ou seja, caso ativada a opção, ao escrever a nota em banco de dados o aplicativo conectará com o servidor JSON e enviará automaticamente a nota inserida.


4.      Conclusão

Trafegar dados é a maneira que podemos fazer para que sistemas se comuniquem e transpareçam falar a mesma língua. A tecnologia mais difundida para esta comunicação é o XML (Extensible Markup Language), que através de seus padrões de leitura e escrita, podemos trafegar informações entre aplicativos, os quais podem ser desenvolvidos em diferentes linguagens de programação. Com o mesmo objetivo, a tecnologia JSON proporciona aos desenvolvedores o trabalho com volume de dados com maior eficiência levando em conta o tamanho do tráfego de dados e a simplicidade no tratamento das informações, pois as API´s (Application Programming Interface) para JSON são bem mais simples, no que se refere à utilização. O seu uso surge da necessidade de trafegar o mínimo de informação em requisições AJAX. Comparativamente, um arquivo de informações JSON tem menos bytes por não precisar usar as tags do formato XML.
A tendência do uso desta tecnologia vem aumentando devido a grande troca de informações com crescente uso das redes sociais. Aplicativos e utilitários que queiram compartilhar informações com estas redes tendem a ser ágeis e suportar o formato para a troca de dados. Um exemplo é o Twitter que utiliza a tecnologia para envio e recebimento das informações nele armazenadas.
Visto que o JSON é um formato nativo do Javascript e as versões mais recentes das principais linguagens de programação como Java, PHP, ASP, já contêm bibliotecas para o tratamento do formato JSON, o desenvolvimento de aplicações que utilizaram a funcionalidade de troca de informações através de JSON é simples devido aos métodos e funções encapsuladas na linguagem de programação.


5.      Referências

[THE INTERNET SOCIETY 2006], “RFC 4627 application/json.”, http://dev.mysql.com/doc/refman/5.5/en/replication.html.
[JSON.org], “Introducing JSON”, http://www.json.org.
[GOOGLE INC.], “Android Developers”, http://developer.android.com.
[JOSÉ, P. 2011], “Entenda o ciclo de vida de uma Activity Android.”, http://www.petherjose.com/2011/07/entenda-o-ciclo-de-vida-de-uma-activity-android/
[WIKIPÉDIA 2011], “JSON.”, http://pt.wikipedia.org/wiki/JSON

Abstract. The simplicity of using JSON has resulted in wide spread of its use in applications requiring data exchanges quickly and efficiently. This article aims to demonstrate the creation of an application for the Android platform and technology utilization JSON, covering writing, reading and sending data through the application and also the development of a server for storage of JSON data.
Resumo. A simplicidade do uso do JSON tem resultado na grande difusão de seu uso em aplicações que requerem trocas de dados de forma rápida e eficiente. Este artigo tem por objetivo demonstrar a criação de uma aplicação para plataforma Android e a utilização da tecnologia JSON, abordando escrita, leitura e o envio dos dados através do aplicativo e também o desenvolvimento de um servidor JSON para armazenamento destes dados.

Autor: Victor Hugo Manata Pontes
Pós-graduação em Redes e Aplicações Distribuídas – Universidade Católica de Minas Gerais Campus de Poços de Caldas
Poços de Caldas – MG – Brasil

twitch.tv/lechuck311