Desenvolvimento de Aplicações Profissionais em Android

Page 1

Ricardo Queirós

TM

Desenvolvimento de Aplicações Profissionais em ANDROID

O mercado móvel apresentou em 2013 uma grande hegemonia dos dispositivos Android com mais de metade da quota de mercado na venda de dispositivos móveis. A Google Play, loja online de aplicações Android, registou em 2013 mais de 1 milhão de aplicações e mais de 50 biliões de downloads foram feitos. No fim do ano, a Google lançou o Android KitKat (versão 4.4) juntamente com o seu novo smartphone, o Nexus 5. Estes números impressionam e são o mote para a escrita desta obra, que tem como objetivo partilhar conceitos avançados no desenvolvimento de aplicações profissionais para dispositivos Android. Entre outros, são abordados os seguintes temas: • Desenho avançado de interfaces gráficas (fragmentos, ViewPager, gestos, reconhecimento de voz, cenas e transições, OpenGL ES, etc.); • Armazenamento, Serialização e Backup de Dados (SQLite, JSON, Google Backup Service, Storage Access Framework, Android Print Framework, etc.); • Networking e Web Services (OkHTTP, Volley, WebSockets, Facebook para Android, Parse.com, etc.); • Tecnologias de Conectividade (USB, Wi-Fi Direct, Bluetooth LE, NFC, etc.); • Mapas, localização e reconhecimento de atividade (Google Play Services, Maps v2, Location API, geocoding, geofencing, Activity API, etc.); • Tópicos avançados (Google Chart Tools, Google Cloud Messaging, Google Places e Android Wear). A linguagem de programação usada é o Java e o ambiente de desenvolvimento onde foram escritos todos os exemplos da obra, compatíveis com a versão 4.x do Android, é o Eclipse.

Esta obra disponibiliza ainda a correspondência dos principais termos técnicos para o Português do Brasil.

Exemplos em Java disponíveis em www.fca.pt, até o livro se esgotar ou ser publicada nova edição atualizada ou com alterações.

ISBN 978-972-722-796-9

www.fca.pt

RICARDO QUEIRÓS – (ricardo.queiros@gmail.com) – Docente na Escola Superior de Estudos Industriais e Gestão (ESEIG), onde é responsável por disciplinas na área das Linguagens e Técnicas de Programação e Bases de Dados. Autor da obra Android – Introdução ao Desenvolvimento de Aplicações, publicada pela FCA. Ver currículo completo no interior do livro.

Google Cloud Messaging, Maps v2 e Location API, NFC, Android Wear Ricardo Queirós

No seguimento da obra anterior do mesmo autor, Android – Introdução ao Desenvolvimento de Aplicações, esta é, também, uma obra fundamental e de leitura obrigatória para profissionais da área da programação móvel; professores e alunos de disciplinas de computação móvel que queiram obter um suporte teórico-prático sobre a programação para dispositivos móveis; e para todas as pessoas que se interessam pelas novas tecnologias e queiram tirar partido do seu dispositivo móvel.

Programação em Java através do Eclipse Exemplos completos disponíveis em www.fca.pt


ÍNDICE GERAL AGRADECIMENTOS ........................................................................................... XIII 1. A PLATAFORMA ANDROID ................................................................................... 1

1.1 A Plataforma Android ..................................................................................................... 1 1.2 Requisitos para Desenvolvimento ................................................................................. 5 1.3 Componentes principais.................................................................................................. 7 1.3.1 Activity .................................................................................................................... 7 1.3.2 Service .................................................................................................................... 11 1.3.3 BroadcastReceiver ........................................................................................... 14 1.3.4 ContentProvider ............................................................................................... 19 2. DESENHO AVANÇADO DE INTERFACES GRÁFICAS .................................................... 23

2.1 Adaptabilidade ............................................................................................................... 24 2.1.1 Fragmentos........................................................................................................... 25 2.1.2 Múltiplos ecrãs .................................................................................................... 38 2.2 Navegação ....................................................................................................................... 41 2.2.1 Atividades, Tarefas e a Back Stack ..................................................................... 41 2.2.2 Navegação Ancestral e Temporal ..................................................................... 44 2.2.3 Navegação Lateral – usando o widget ViewPager .......................................... 47 2.3 Personalização ................................................................................................................ 55 2.3.1 UI do sistema ....................................................................................................... 55 2.3.1.1 Barras de Sistema transparentes ......................................................... 55 2.3.1.2 Ecrã Full-Screen ...................................................................................... 58 2.3.2 UI da aplicação .................................................................................................... 60 2.3.2.1 Custom Views .......................................................................................... 61 2.3.2.2 Compound Views ..................................................................................... 66 2.4 Acessibilidade ................................................................................................................. 72 2.4.1 Boas práticas ........................................................................................................ 73 2.4.2 Text-to-speech ........................................................................................................ 75 2.4.3 Speech-to-text......................................................................................................... 79 2.4.4 Gestures ................................................................................................................. 83 2.4.5 Multitoque............................................................................................................ 87 2.5 Animação e Gráficos ...................................................................................................... 94 2.5.1 Cenas e Transições .............................................................................................. 94 2.5.1.1 O método beginDelayedTransition() ........................................... 94 2.5.1.2 Cenas....................................................................................................... 95 2.5.1.3 Transições............................................................................................... 98 2.5.2 Desenho de gráficos com o OpenGL ES......................................................... 101 © FCA – Editora de Informática


X

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID 2.5.2.1 As classes GLSurfaceView e GLSurfaceView.Renderer .............. 102 2.5.2.2 Exemplo prático .................................................................................. 103

3. ARMAZENAMENTO, SERIALIZAÇÃO E BACKUP DE DADOS ......................................... 109

3.1 Armazenamento de Dados ......................................................................................... 109 3.1.1 Ficheiro de Preferências ................................................................................... 109 3.1.1.1 Leitura e escrita de valores ................................................................ 110 3.1.1.2 Notificações.......................................................................................... 111 3.1.1.3 Associação de UI ................................................................................. 112 3.1.2 Base de Dados SQLite ....................................................................................... 116 3.1.2.1 As classes SQLiteOpenHelper e SQLiteDatabase ........................ 116 3.1.2.2 Exemplo de BD com múltiplas tabelas............................................. 119 3.2 Serialização de Dados .................................................................................................. 130 3.2.1 JavaScript Object Notation (JSON) .................................................................... 131 3.2.1.1 JsonReader e JsonWriter ................................................................ 131 3.2.1.2 Gson ....................................................................................................... 134 3.2.1.3 Minimal-json ......................................................................................... 135 3.2.2 Google Protocol Buffers........................................................................................ 142 3.3 Backup de Dados ........................................................................................................... 145 3.4 Frameworks de acesso e impressão de dados............................................................. 147 3.4.1 Storage Access Framework .................................................................................. 148 3.4.2 Android Print Framework ................................................................................... 155 3.4.2.1 Geração de documentos PDF ............................................................ 155 3.4.2.2 Impressão de imagens ........................................................................ 156 3.4.2.3 Impressão de uma página HTML ..................................................... 158 4. NETWORKING E WEB SERVICES ....................................................................... 165

4.1 Android Networking ................................................................................................... 165 4.1.1 WebView e JSOUP ............................................................................................ 166 4.1.2 HttpUrlConnection e OkHTTP ..................................................................... 170 4.1.3 Usando o Volley ................................................................................................. 174 4.1.3.1 Importação para o Eclipse.................................................................. 175 4.1.3.2 Classes principais ................................................................................ 178 4.1.3.3 Exemplo prático .................................................................................. 179 4.1.4 WebSockets .......................................................................................................... 185 4.2 Integração de Web Services ........................................................................................ 189 4.2.1 Google Static Maps v2 ......................................................................................... 189 4.2.2 Facebook para Android .................................................................................... 191 4.2.3 Parse.com ........................................................................................................... 201 5. TECNOLOGIAS DE CONECTIVIDADE .................................................................... 205

5.1 USB ................................................................................................................................. 205 5.1.1 Obter um dispositivo USB ............................................................................... 206 © FCA – Editora de Informática


ÍNDICE GERAL

XI

5.1.2 Obter permissões............................................................................................... 208 5.1.3 Comunicar com um dispositivo via USB ....................................................... 209 5.2 Bluetooth ......................................................................................................................... 212 5.2.1 Bluetooth Classic.................................................................................................. 212 5.2.2 Bluetooth Low Energy (BLE) .............................................................................. 215 5.3 Wi-Fi ............................................................................................................................... 220 5.3.1 Network Service Directory .................................................................................. 220 5.3.2 Wi-Fi Direct......................................................................................................... 223 5.4 Near Field Communication (NFC) ................................................................................. 227 6. MAPAS, LOCALIZAÇÃO E ATIVIDADE .................................................................. 235

6.1 Google Play Services ....................................................................................................... 235 6.2 Mapas ............................................................................................................................. 239 6.2.1 Configurações iniciais....................................................................................... 239 6.2.1.1 Obter a Maps API Key ......................................................................... 239 6.2.1.2 Definir as configurações da aplicação .............................................. 242 6.2.2 A API Google Maps ............................................................................................ 243 6.2.2.1 Marcadores .......................................................................................... 248 6.2.2.2 Formas .................................................................................................. 252 6.2.2.3 Sobreposições ...................................................................................... 253 6.3 Localização .................................................................................................................... 255 6.3.1 Fused Location Provider ...................................................................................... 256 6.3.2 Tracking de Localização .................................................................................... 257 6.3.3 Geofencing ........................................................................................................... 262 6.3.4 Reconhecimento de Atividade ........................................................................ 266 7. TÓPICOS AVANÇADOS .................................................................................... 271

7.1 Google Chart Tools .......................................................................................................... 271 7.2 Google Cloud Messaging ................................................................................................ 274 7.2.1 Arquitetura ........................................................................................................ 275 7.2.2 Configurações Iniciais ...................................................................................... 276 7.2.3 A Aplicação Cliente .......................................................................................... 277 7.2.4 A Aplicação do Servidor .................................................................................. 281 7.3 Google Places API ........................................................................................................... 285 7.4 Android Wear ............................................................................................................... 293 7.4.1 Configurações .................................................................................................... 294 7.4.2 A minha primeira aplicação Wearable............................................................. 298 GLOSSÁRIO DE TERMOS PORTUGUÊS EUROPEU/PORTUGUÊS DO BRASIL......................... 301 ÍNDICE REMISSIVO ........................................................................................... 303

© FCA – Editora de Informática



DESENHO AVANÇADO DE INTERFACES GRÁFICAS

25

Nesta subsecção apresenta-se o conceito de fragmentos que surgiu no Android 3.0 (nível 11 da API) e que veio facilitar a adaptação automática da interface gráfica à multiplicidade de características encontradas nos equipamentos atuais. Ao mesmo tempo, o seu uso vai beneficiar a modularidade e a reutilização da interface gráfica das aplicações Android. Ainda na faceta da adaptabilidade introduz-se a nova API Presentation que surgiu no Android 4.2 (nível 17 da API) e que permite gerir ecrãs secundários com UI separadas.

2.1.1

FRAGMENTOS

Os fragmentos podem ser definidos como módulos de interface gráfica de utilizador permitindo ao programador dividir a interface em peças isoladas e reutilizáveis. Em tempo de execução, as atividades decidem quais os fragmentos que irão usar. Um exemplo clássico (Figura 2.2) é uma aplicação que tem uma lista de itens e quando o utilizador clica num item dessa lista a aplicação mostra os detalhes do item. Neste caso, poderemos ter comportamentos diferentes, se a aplicação for executada num smartphone ou num tablet.

FIGURA 2.2 – Uso de fragmentos numa aplicação para dispositivos móveis heterogéneos

O fragmento A contém uma lista, enquanto o fragmento B contém detalhes de um item selecionado na lista. Quando a aplicação é executada num tablet, ele pode exibir ambos os fragmentos na mesma atividade. Quando a mesma aplicação é executada num smartphone, os fragmentos são armazenados em duas atividades distintas. Os fragmentos A e B são os mesmos em ambos os formatos, mas as atividades que os hospedam são diferentes.

© FCA – Editora de Informática


26

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

Um fragmento está intimamente ligado a uma atividade que o hospeda. Embora um fragmento defina o seu próprio ciclo de vida, este depende da sua atividade: se a atividade é interrompida, os fragmentos dessa atividade são interrompidos, se a atividade é destruída, os fragmentos são destruídos. O ciclo de vida de um fragmento é representado na Figura 2.3.

FIGURA 2.3 – O ciclo de vida do fragmento

A criação de um fragmento despoleta vários eventos que podem ser tratados via código. A lista de métodos é apresentada na Tabela 2.1.

© FCA – Editora de Informática


ARMAZENAMENTO, SERIALIZAÇÃO E BACKUP DE DADOS

3.2.1

131

JAVASCRIPT OBJECT NOTATION (JSON)

O JSON é um acrónimo para JavaScript Object Notation e trata-se de um formato universal para o intercâmbio de dados. É baseado num subconjunto da linguagem de programação JavaScript. O formato é em texto e completamente independente de linguagem, sendo assim ideal para a representação e troca de dados com serviços Web. A partir da versão 3.0, o Android adicionou duas novas classes para leitura e escrita de dados JSON, no pacote android.util, chamadas de JsonReader e JsonWriter.

3.2.1.1 JSONREADER E JSONWRITER

O próximo exemplo mostra um array JSON com dois objetos contendo informação sobre itens a comprar no supermercado. [ { “nome”: “água”, “categoria”: “bebida”, “quantidade”: 3, “estado”: 1 }, { ”nome”: “robalo”, ”categoria”: “peixe”, “quantidade”: 1, “estado”: 0 }, … ]

Para ler os dados JSON numa aplicação Android a partir de um InputStream pode-se usar a API JsonReader, como demonstra o próximo código: public JSONArray readTasksFromInputStream(InputStream stream) { InputStreamReader reader = new InputStreamReader(stream); JsonReader jsonReader = new JsonReader(reader); JSONArray jsonArray = new JSONArray(); try { jsonReader.beginArray(); while (jsonReader.hasNext()) { © FCA – Editora de Informática


132

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID JSONObject jsonObject = readItem(jsonReader); jsonArray.put(jsonObject); } jsonReader.endArray();

} catch (IOException e) { // MANIPULAR EXCEÇÃO

} catch (JSONException e) { // MANIPULAR EXCEÇÃO

} return jsonArray; } private JSONObject readItem(JsonReader jsonReader) throws IOException, JSONException { JSONObject jsonObject = new JSONObject(); jsonReader.beginObject(); JsonToken token; do { String nome = jsonReader.nextName(); if (“nome”.equals(nome)) { jsonObject.put(“nome”, jsonReader.nextString()); } else if (“categoria”.equals(nome)) { jsonObject.put(“categoria”, jsonReader.nextString()); } else if (“quantidade”.equals(nome)) { jsonObject.put(“quantidade”, jsonReader.nextInt()); } else if (“estado”.equals(nome)) { jsonObject.put(“estado”, jsonReader.nextInt()); } token = jsonReader.peek(); } while (token != null && !token.equals(JsonToken.END_OBJECT)); jsonReader.endObject(); return jsonObject; }

Para criar um parser para os dados JSON define-se um método de entrada que cria um objeto JsonReader. Em seguida, criam-se métodos manipuladores para cada estrutura dos seus dados JSON: © FCA – Editora de Informática


ARMAZENAMENTO, SERIALIZAÇÃO E BACKUP DE DADOS

3.3

145

BACKUP DE DADOS

Uma prática comum e recomendada quando lidamos com dados é a possibilidade de fazer backup dos mesmos. O Android possui um serviço de backup que permite copiar os dados persistentes de uma aplicação para um armazenamento remoto na "nuvem". Se um utilizador realiza uma reposição de fábrica ou se adquire um novo dispositivo Android, o sistema restaura automaticamente os dados de backup quando a aplicação for reinstalada. Desta forma, os utilizadores não necessitam de reproduzir os seus dados ou configurações da aplicação. Este processo é completamente transparente para o utilizador, não afetando a funcionalidade ou a experiência do utilizador com a sua aplicação. Para fazer backup dos dados da aplicação é necessário implementar um agente de backup. O agente de backup é chamado pelo Backup Manager do Android para fornecer os dados para cópia. O mesmo é também chamado para restaurar os dados de backup quando a aplicação é reinstalada. Para implementar um agente de backup é necessário: 1)

Declarar o agente de backup no ficheiro de manifesto;

2)

Registar a aplicação no serviço de backup Android Backup Service (Figura 3.6);

3)

Definir um agente de backup estendendo a classe BackupAgent ou BackupAgentHelper.

O serviço de backup e as API a usar para fazer backup dos dados de uma aplicação estão disponíveis apenas para dispositivos com suporte para a API nível 8 (Android 2.2) ou superior.

Comece por criar uma nova aplicação através da criação de um novo projeto Android no Eclipse chamado Backup. De seguida, declare o agente de backup no ficheiro de manifesto através do atributo android:backupAgent no elemento <application>: <application … android:backupAgent=”MyAgent”>…</application/>

Posteriormente, registe a aplicação num serviço de backup. A Google oferece um serviço de backup chamado de Android Backup Service (ABS) para as aplicações Android que obriga a um registo prévio15. Para efetivar o registo deve aceitar as condições de uso e identificar o pacote da aplicação (com.example.backup).

15 Para se registar no serviço Android https://developer.android.com/google/backup/signup.html.

Backup

Service

aceda

ao

seguinte

link:

© FCA – Editora de Informática


146

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

FIGURA 3.6 – Android Backup Service

Após o registo obtém-se uma chave e a descrição de um elemento <metadata> que inclui a chave gerada e que deve ser incluído no ficheiro de manifesto da aplicação. Se tiver várias aplicações, deve registar cada uma através do nome do pacote respetivo. Inclua o próximo excerto no ficheiro de manifesto da aplicação. <meta-data android:name="com.google.android.backup.api_key" android:value="AEdPqrEAAAAIErlxFByGgNz2ywBeQb6TsmLpp5Ksh1PW-ZSexg" />

Por fim deve implementar um agente de backup. A implementação pode ser feita a dois níveis: estendendo a classe BackupAgent ou a classe BackupAgentHelper. A primeira opção usa a classe BackupAgent. A classe disponibiliza uma interface sob a qual a aplicação comunica com o Backup Manager. A extensão obriga à implementação dos métodos onBackup() e onRestore(). Esta abordagem é recomendada quando se quer fazer o backup de uma base de dados SQLite, fazer o backup parcial de ficheiros ou mesmo para controlar versões dos ficheiros de dados. A segunda opção usa a classe BackupAgentHelper. A classe disponibiliza um wrapper da classe BackupAgent que minimiza a quantidade de código necessária para implementar o agente. Na instância de um BackupAgentHelper deve-se usar um ou mais objetos helper, que automaticamente fazem o backup/restore dos dados sem necessidade de implementar os métodos onBackup() e onRestore(). O Android suporta helpers para fazer backup de ficheiros completos oriundos quer de objetos SharedPreferences quer do armazenamento interno. Neste exemplo, vamos fazer o backup do ficheiro de preferências gerado por omissão através do método PreferenceManager.getDefaultPreferences(). O nome do ficheiro é <package-name>_preferences. © FCA – Editora de Informática


ARMAZENAMENTO, SERIALIZAÇÃO E BACKUP DE DADOS

147

public class MyAgent extends BackupAgentHelper { public static final String PREFS_BACKUP_KEY = “prefs”; @Override public void onCreate() { super.onCreate(); SharedPreferencesBackupHelper sharedPreferencesBackupHelper = new SharedPreferencesBackupHelper(this, getPackageName() + “_preferences”); addHelper(PREFS_BACKUP_KEY, sharedPreferencesBackupHelper); } }

A implementação da classe BackupAgentHelper deve usar um ou mais helpers. Um helper de backup é um componente especializado que executa ações de backup/restore para tipos de dados particulares. O Android disponibiliza dois: SharedPreferencesBackupHelper

– para operações em ficheiros de

preferências; FileBackupHelper – para operações em ficheiros de armazenamento

interno. Só necessita de um helper para cada tipo de dados. Para cada helper deve incluir no método onCreate(): instanciar o helper indicando no construtor o ficheiro e invocar o método addHelper() para adicionar o componente à implementação da classe BackupAgentHelper. Quando o BackupManager chamar os métodos onBackup() ou onRestore(), a implementação do BackupAgentHelper chama o helper definido para executar as operações de backup/restore do tipo de dados especificado. Para lidar com o processo de backup/restore de outros ficheiros deve usar a classe FileBackupHelper.

3.4

FRAMEWORKS DE ACESSO E IMPRESSÃO DE DADOS

A 31 de outubro de 2013, a Google lançou o Nexus 5 equipado com a nova versão 4.4 KitKat do Android. O Android 4.4 inclui melhorias de desempenho, novas API e novos recursos a usar nas aplicações Android. De entre as API destacam-se duas relacionadas com a gestão de documentos: a Storage Access Framework e a Print Framework.

© FCA – Editora de Informática


148

3.4.1

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

STORAGE ACCESS FRAMEWORK

Atualmente, a capacidade de armazenamento interno de um smartphone/tablet em comparação com um PC é ainda bastante inferior. Sendo assim, a necessidade do armazenamento remoto contínuo de ficheiros é um requisito fundamental para muitas aplicações móveis. Perante este facto, a Google introduziu a Storage Access Framework (SAF) no Android SDK 4.4. A SAF simplifica o acesso dos utilizadores a qualquer tipo de ficheiro proveniente de vários fornecedores de documentos (document providers). Através de uma UI simples (Figura 3.7) os utilizadores podem aceder aos documentos de uma forma consistente.

FIGURA 3.7 – Componente Picker da SAF

Os serviços de armazenamento local ou remotos podem participar implementando a classe DocumentsProvider que encapsula os seus serviços. As aplicações cliente que necessitam do acesso aos documentos podem integrar a SAF através de poucas linhas de código. A SAF é constituída por: Fornecedor de documentos – permite que um serviço de armazenamento (como o Google Drive) revele os ficheiros que gere. É implementado como uma subclasse da classe DocumentsProvider;

© FCA – Editora de Informática


ARMAZENAMENTO, SERIALIZAÇÃO E BACKUP DE DADOS

149

Aplicação cliente – uma aplicação personalizada que invoca as intents ACTION_OPEN_DOCUMENT e/ou ACTION_CREATE_DOCUMENT e recebe os ficheiros

enviados pelos fornecedores de documentos; Picker – a interface que permite que os utilizadores acedam aos documentos de todos os fornecedores que satisfazem os critérios de pesquisa da aplicação cliente. O fluxo da informação é representado pelo diagrama da Figura 3.8. Na SAF, os fornecedores e os clientes não interagem diretamente. Um cliente pede permissão para interagir com ficheiros (isto é, ler, editar, criar ou remover ficheiros). A interação começa quando a aplicação cliente invoca a intent ACTION_OPEN_DOCUMENT ou ACTION_CREATE_DOCUMENT. A intent pode incluir filtros para refinar ainda mais a pesquisa (por exemplo, “dá-me todos os ficheiros que podem ser abertos e que têm o tipo MIME image”). De seguida, o Picker (um componente gráfico controlado pelo sistema) vai a cada fornecedor de documentos registado (por exemplo, Google Drive, USB) e mostra ao utilizador os conteúdos correspondentes numa interface única.

FIGURA 3.8 – Arquitetura SAF

Para trabalhar com ficheiros na SAF deve invocar um conjunto de intents, dependendo da ação específica a ser executada. Independentemente da ação, a framework exibirá um Picker de modo que o utilizador possa especificar o local de armazenamento (como uma pasta no Google Drive e o nome de um ficheiro). Quando o trabalho da intent é concluído, a aplicação é notificada por uma chamada ao método onActivityResult(). Para exemplificar o uso da SAF vamos criar uma aplicação que permite a criação e armazenamento de ficheiros de texto. Execute os seguintes passos: 1)

Crie um projeto Android denominado SAF.

2)

No campo Target SDK selecione a opção API nível 19. © FCA – Editora de Informática


212

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

} catch (IOException e) { // TRATAMENTO DE ERROS

} finally { driver.close(); } }

5.2

BLUETOOTH

A especificação Bluetooth foi desenvolvida em 1994 por Jaap Haartsen e Sven Mattisson quando trabalhavam para a Ericsson, na Suécia. Atualmente, a especificação Bluetooth é gerida pelo Bluetooth Special Interest Group (SIG). O SIG definiu a especificação Bluetooth versão 4.0 (chamado Bluetooth Smart) a 30 de junho de 2010. Esta nova versão inclui entre outros o Bluetooth clássico e um novo protocolo chamado de Bluetooth Low Energy (BLE) para comunicações com baixo consumo de energia. O Bluetooth Classic é a escolha certa para operações que consomem muita bateria como streaming e comunicação entre dispositivos Android. Para os dispositivos Bluetooth com requisitos de energia baixos, o Android 4.3 (API Nível 18) introduz o suporte de API para o BLE.

5.2.1

BLUETOOTH CLASSIC

O Bluetooth é uma tecnologia de conectividade que permite a um dispositivo partilhar dados, sem cabo, com outros dispositivos Bluetooth. As API Bluetooth estão disponíveis no pacote android.bluetooth. A Tabela 5.2 descreve as classes mais importantes. CLASSE BluetoothAdapter

BluetoothDevice

DESCRIÇÃO É o ponto de entrada para toda a interação Bluetooth. Através dele é possível descobrir outros dispositivos Bluetooth, consultar uma lista de dispositivos ligados (emparelhados), instanciar um BluetoothDevice usando um endereço MAC conhecido e criar uma BluetoothServerSocket para escutar as comunicações de outros dispositivos. Representa um dispositivo Bluetooth. Utilize-o para solicitar uma conexão com um dispositivo através de um BluetoothSocket ou consultar informações sobre o dispositivo, tais como nome, endereço e estado de ligação.

TABELA 5.2 – Classes principais do pacote android.bluetooth © FCA – Editora de Informática


TECNOLOGIAS DE CONECTIVIDADE

213

Para exemplificar o uso de Bluetooth apresenta-se o desenho e implementação de uma aplicação que permite ligar/desligar o Bluetooth, listar os dispositivos emparelhados e pesquisar outros dispositivos Bluetooth. A Figura 5.1 ilustra o seu layout.

FIGURA 5.1 – Exemplo de aplicação usando o Bluetooth clássico

O Android fornece a classe BluetoothAdapter para interagir com o Bluetooth. Para criar um objeto desta classe usa-se o método estático getDefaultAdapter(). Private BluetoothAdapter btAdapter = BluetoothAdapter.getDefaultAdapter();

Caso o método devolva um valor nulo significa que o dispositivo não suporta Bluetooth, caso contrário podemos verificar se o mesmo está ativo através do método isEnabled(). Para ativar o Bluetooth (Figura 5.2) é necessário definir uma intent com a constante ACTION_REQUEST_ENABLE. Intent turnOnIntent = new Intent(btAdapter.ACTION_REQUEST_ENABLE); startActivityForResult(turnOnIntent, REQUEST_ENABLE_BT);

A resposta a este pedido é recebida no método onActivityResult() da atividade. Para desativar o Bluetooth usa-se o método disable(). © FCA – Editora de Informática


214

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

FIGURA 5.2 – Ativação do Bluetooth do dispositivo

Antes do procedimento de descoberta de dispositivos Bluetooth é boa prática consultar o conjunto de dispositivos emparelhados, já que muitas vezes o dispositivo desejado já pode ser conhecido. Os dispositivos emparelhados são dispositivos previamente conectados cujas informações são armazenadas e reutilizadas pela API Bluetooth. Para obter os dispositivos emparelhados usa-se o método getBondedDevices()que devolve um conjunto de dispositivos Bluetooth sob a forma de objetos BluetoothDevice. private Set<BluetoothDevice> pairedDevices = btAdapter.getBondedDevices();

Esta lista pode ter diversos fins, como por exemplo, ser exibida num objeto ListView (Figura 5.3). for(BluetoothDevice device : pairedDevices) BTArrayAdapter.add(device.getName()+ "\n" + device.getAddress()); private ArrayAdapter<String> BTArrayAdapter; BTArrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1); myListView.setAdapter(BTArrayAdapter);

FIGURA 5.3 – Item da lista com os dispositivos Bluetooth emparelhados

A deteção de novos dispositivos é feita através da invocação do método startDiscovery(). Para receber todas as informações dos objetos BluetoothDevice que são descobertos, devemos registar um BroadcastReceiver para a intent com a constante ACTION_FOUND. Recomenda-se também anular o procedimento de descoberta (método cancelDiscovery()) porque o BluetoothAdapter consome muitos recursos.

Tipicamente usa-se este método durante um processo de procura de novos dispositivos. if (myBluetoothAdapter.isDiscovering()) { myBluetoothAdapter.cancelDiscovery(); } else { BTArrayAdapter.clear(); © FCA – Editora de Informática


7

TÓPICOS AVANÇADOS

7

Este capítulo cobre várias tecnologias comuns (bibliotecas, frameworks, API) à maioria das aplicações Android que têm surgido nos últimos tempos. Estas tecnologias emergentes estão relacionadas com a implementação de gráficos (Google Chart Tools), a comunicação via pushing entre aplicações servidor-cliente (Google Cloud Messaging), a georreferenciação de locais para efeitos empresariais ou turísticos (Google Places) e a implementação de soluções para dispositivos wearable, como por exemplo, os relógios inteligentes (Android Wear).

7.1

GOOGLE CHART TOOLS

Nas aplicações atuais existe uma necessidade crescente de apresentar os dados em forma de gráficos, já que este tipo de media facilita a interpretação dos dados e auxilia na tomada de decisões. Existem várias bibliotecas para Android que permitem a manipulação de gráficos, tais como: AFreeChart, AChartEngine, Google Chart Tools, etc. A biblioteca da Google, Google Chart Tools, permite desenhar vários tipos de gráficos no formato HTML5/SVG tornando a geração e a visualização de gráficos mais sofisticada e interativa (Figura 7.1). A biblioteca é suportada por dispositivos com o Android 3.x ou superior.

FIGURA 7.1 – Alguns tipos de gráficos do Google Chart Tools © FCA – Editora de Informática


272

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

Para usar esta biblioteca é necessário incluir código HTML/JavaScript que pode ser gerado através do Google Code Playground33 e posteriormente visualizado num navegador Web. A biblioteca é extensa, pelo que nesta obra foca-se apenas um tipo de gráficos: o gráfico de barras. A próxima aplicação Android demonstra os passos básicos para a criação e visualização de gráficos em aplicações Android. Crie um novo projeto Android, adicione um controlo WebView e inclua o próximo código no método onCreate() da atividade principal. WebView webview = (WebView) findViewById(R.id.webView1); String content = "<html><head>" + "

<script type=\"text/javascript\" src=\"jsapi.js\"></script>"

+ "

<script type=\"text/javascript\">"

+ "

google.load(\"visualization\", \"1\", {packages:[\"corechart\"]});"

+ "

google.setOnLoadCallback(drawChart);"

+ "

function drawChart() {"

+ "

var data = google.visualization.arrayToDataTable(["

+ "

['Ano', 'PT', 'EN'],"

+ "

['2011', 500, 1000],"

+ "

['2012', 750, 460],"

+ "

['2013', 800, 1220]" + "]);"

+ "

var options = {"

+ "

title: 'Exemplo Google Chart Tools',"

+ "

hAxis: {title: 'Ano', titleTextStyle: {color: 'red'}}"

+ "

};"

+ " var chart = new google.visualization.ColumnChart(document.getElementById('cdiv'));" + "

chart.draw(data, options);"

+ "

}"

+ "

</script>"

+ "

</head>"

+ "

<body>"

33

Link: https://code.google.com/apis/ajax/playground/?type=visualization#column_chart.

© FCA – Editora de Informática


TÓPICOS AVANÇADOS + "

<div id=\"cdiv\" style=\"width:250px; height:250px;\"></div>"

+ "

</body></html>";

273

WebSettings webSettings = webview.getSettings(); webSettings.setJavaScriptEnabled(true); webview.requestFocusFromTouch(); webview.loadDataWithBaseURL( "file:///android_asset/", content, "text/html", "utf-8", null );

Este excerto de código define uma string com código JS/HTML gerado através do Google Code Playground. O mesmo pode ser modificado em tempo de execução de forma a ser possível gerar gráficos Scalable Vector Graphics (SVG) dinamicamente no dispositivo Android. Os dados são carregados para a WebView através do método loadDataWithBaseURL(). webview.loadDataWithBaseURL( "file:///android_asset/", content, "text/html", "utf-8", null );

Um dos parâmetros do método loadDataWithBaseURL é o URL base que referencia a pasta assets do projeto Android. Nessa pasta inclua a biblioteca JSAPI que pode ser descarregada através do link https://www.google.com/jsapi. Desta forma usa-se uma referência local à biblioteca JSAPI, em detrimento do URL da Google. O resultado da execução da aplicação no emulador é demonstrado na Figura 7.2.

FIGURA 7.2 – A aplicação Graphs © FCA – Editora de Informática


274

7.2

DESENVOLVIMENTO DE APLICAÇÕES PROFISSIONAIS EM ANDROID

GOOGLE CLOUD MESSAGING

No modelo cliente-servidor existem duas técnicas básicas de notificação que permitem às aplicações cliente manterem-se atualizadas com dados vindos do servidor. As técnicas são o pulling e pushing. A primeira é uma técnica simples de implementar, onde o dispositivo cliente consulta regularmente o servidor a fim de obter os dados atualizados. Contudo, estes pedidos constantes prejudicam a autonomia da bateria, bem como o tarifário móvel associado, já que esta técnica aumenta abruptamente o tráfego móvel. Para se ter uma ideia, fazer requisições a cada cinco minutos pode consumir aproximadamente 10% da bateria do dispositivo por dia. Para além disso, a técnica de pulling gerará sempre um atraso da notificação, pois o dispositivo faz “pedidos cegos” ao servidor sem saber exatamente quando existem novos dados. A alteração da periodicidade dos pedidos é uma alternativa, estando, no entanto, a mesma diretamente relacionada com o problema da eficiência versus dados sincronizados. A segunda técnica chama-se de pushing e permite que o servidor tome a iniciativa e notifique o cliente assim que tiver novos dados. Esta solução é bem mais eficiente já que apenas usa a rede (e bateria) quando necessário. O pushing pode ser implementado de várias formas, tais como, o envio de SMS, usando uma conexão permanente ou através de serviços mediadores residentes na cloud. A estratégia de pushing através do envio de SMS é simples de implementar, contudo existem poucos serviços que permitem o envio de SMS de forma gratuita ou sem qualquer limitação (por exemplo, número de mensagens ou de caracteres). A implementação de pushing através de uma conexão permanente é outra solução, mas implica alguns condicionalismos técnicos, como, por exemplo, uma prévia ligação do cliente ao servidor, a identificação e diferenciação dos dispositivos, o envio/receção das mensagens, a definição de estratégias a implementar caso o dispositivo esteja desligado, etc. Outra técnica é através de serviços na cloud tal como o Google Cloud Messaging for Android (GCM). O GCM é um serviço gratuito que permite o envio de dados de aplicações no servidor para servidores GCM que depois difundem as mensagens pelas aplicações cliente Android registadas. As aplicações cliente não precisam de estar em execução para receber mensagens. Os servidores GCM tratam de todos os aspetos relacionados com a fila de mensagens para envio, embora não façam tratamento dos dados nem forneçam interface gráfica. O GCM requer que os dispositivos tenham a versão Android 2.2 (ou superior) com o Google Play Store, ou um emulador com as API Google. É necessária uma conta Google no dispositivo se o Android for inferior à versão 4.0.4.

© FCA – Editora de Informática


TÓPICOS AVANÇADOS

7.2.1

275

ARQUITETURA

Uma implementação GCM inclui um servidor de conexão GCM e duas aplicações (cliente e servidor). A Figura 7.3 ilustra a arquitetura GCM com todos os componentes envolvidos.

FIGURA 7.3 – Componentes na comunicação GCM

O servidor GCM serve de mediador na comunicação entre cliente e servidor. O servidor recebe mensagens da aplicação do servidor e envia as mesmas para as aplicações cliente registadas. Atualmente, a Google fornece servidores de conexão GCM baseados nos protocolos HTTP e Extensible Messaging and Presence Protocol (XMPP). O XMPP difere do HTTP já que permite a comunicação bidirecional. A aplicação do servidor é um componente do servidor responsável pelo envio de mensagens para aplicações cliente através de um servidor de conexão GCM. A aplicação cliente é um componente do lado do cliente (tipicamente uma aplicação instalada num dispositivo Android). Para a aplicação cliente poder receber mensagens GCM, a mesma tem de se registar no servidor GCM e obter um ID de registo que é, posteriormente, partilhado com a aplicação do servidor (por exemplo, via HTTP POST). Para melhor exemplificar o ciclo de vida de uma mensagem numa arquitetura GCM apresenta-se na Figura 7.4 o seu fluxo de informação.

© FCA – Editora de Informática


TÓPICOS AVANÇADOS

285

FIGURA 7.8 – Recebimento de mensagens oriundas do servidor

7.3

GOOGLE PLACES API

A API do Google Places é um serviço que obtém informações sobre localizações geográficas ou pontos de interesse conhecidos via HTTP. Os pedidos especificam locais representados como coordenadas de latitude/longitude. Estão disponíveis quatro pedidos de locais básicos: Pesquisas de local – devolvem uma lista de locais próximos com base na localização de um utilizador; Pedidos de detalhes do lugar – devolvem informações mais detalhadas sobre um local específico, incluindo comentários de utilizadores; Ações no local – permitem complementar as informações da base de dados do Google Places com dados da sua aplicação. As ações no local permitem agendar eventos, classificar o local de acordo com dados de check-in, adicionar e remover locais, entre outras opções; Preenchimento automático do Google Places – pode ser usado para oferecer a funcionalidade de preenchimento automático para pesquisas geográficas baseadas em texto, devolvendo locais à medida que o utilizador digita. A solicitação de pesquisa de local é um URL HTTP do seguinte formato: https://maps.googleapis.com/maps/api/place/search/output?parameters © FCA – Editora de Informática


Turn static files into dynamic content formats.

Create a flipbook
Issuu converts static files into: digital portfolios, online yearbooks, online catalogs, digital photo albums and more. Sign up and create your flipbook.