universidade tecnolÓgica federal do paranÁ curso de...
TRANSCRIPT
UNIVERSIDADE TECNOLÓGICA FEDERAL DO PARANÁ CURSO DE TECNOLOGIA EM ANÁLISE E DESENVOLVIMENTO DE SISTEMAS
CLEVERSON MACHADO
APLICATIVO ANDROID PARA MAPEAMENTO DE ROTAS PERCORRIDAS
TRABALHO DE CONCLUSÃO DE CURSO
PATO BRANCO 2017
CLEVERSON MACHADO
APLICATIVO ANDROID PARA MAPEAMENTO DE ROTAS PERCORRIDAS
Trabalho de Conclusão de Curso de graduação, apresentado à disciplina de Trabalho de Diplomação, do Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas, da Universidade Tecnológica Federal do Paraná, Câmpus Pato Branco, como requisito parcial para obtenção do título de Tecnólogo. Orientadora: Profa. Beatriz Terezinha Borsoi
PATO BRANCO 2017
Ministério da Educação Universidade Tecnológica Federal do Paraná
Câmpus Pato Branco Departamento Acadêmico de Informática
Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
TERMO DE APROVAÇÃO
TRABALHO DE CONCLUSÃO DE CURSO
APLICATIVO ANDROID PARA MAPEAMENTO DE ROTAS PERCORRIDAS
por
CLEVERSON MACHADO
Este trabalho de conclusão de curso foi apresentado no dia 19 de junho de 2017,
como requisito parcial para obtenção do título de Tecnólogo em Análise e
Desenvolvimento de Sistemas, pela Universidade Tecnológica Federal do Paraná. O
acadêmico foi arguido pela Banca Examinadora composta pelos professores abaixo
assinados. Após deliberação, a Banca Examinadora considerou o trabalho
aprovado.
Banca examinadora:
Profa Dra Beatriz Terezinha Borsoi Orientadora
Profa Me. Andreia Scariot Beulke
Prof. MSc. Robison Cris Brito
Prof. Dr. Edilson Pontarolo Coordenador do Curso de Tecnologia em Análise e Desenvolvimento de Sistemas
Profª Dra Beatriz Terezinha Borsoi Responsável pela Atividade de Trabalho de
Conclusão de Curso
A Folha de Aprovação assinada encontra-se na Coordenação do Curso.
AGRADECIMENTOS
A Deus pоr ser essencial еm minha vida, autor dе mеu destino, mеυ guia, socorro presente nа hora dа angústia.
À minha família, especialmente a meu pai, Leonildo e minha mãe Irene pela dedicação de uma vida inteira de ensinamentos e por sempre me incentivarem ao estudo.
À minha Orientadora, professora Beatriz T. Borsoi, primeiramente, pela confiança depositada em mim, ao me acompanhar nessa jornada de desenvolvimento deste trabalho, pelo incentivo, por todo o tempo dedicado e conhecimentos transmitidos, não só nessa etapa, mas em todo o
decorrer do curso. A todos os excelentíssimos professores, com quem tive a oportunidade de conviver e
aprender, que não mediram esforços para transmitirem seus conhecimentos de forma fácil e didática.
À minha namorada Simelli, pessoa com quem compartilho todos os momentos de minha vida, com você me sinto mais vivo a cada dia. Obrigado pelo carinho e incentivo, pela paciência,
pelo ombro amigo e pelo incondicional apoio e compreensão nos momentos em que não pude te dar a devida atenção, para que este projeto pudesse ser finalizado.
Ao Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas, da Universidade Tecnológica Federal do Paraná, Câmpus Pato Branco, е às pessoas cоm quem
convivi nesse espaço ао longo desses anos. Agradeço a todos aqueles qυе, foram ou não aqui citados, mas que dе alguma forma,
estiveram е estão próximos dе mim, me incentivando e fazendo a vida valer cada vеz mais а pena.
RESUMO
MACHADO, Cleverson. Aplicativo Android para mapeamento de rotas percorridas. 2017. 59f. Monografia (Trabalho de Conclusão de Curso) - Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas, Universidade Tecnológica Federal do Paraná, Câmpus Pato Branco. Pato Branco, 2017. Os dispositivos móveis possuem um uso bastante amplo, pois suas aplicações são muitas e diversificadas, de entretenimento a ferramenta de trabalho utilizada pelas empresas. Dados estatísticos confirmam o elevado número de pessoas que possuem esses dispositivos. Equipamentos originalmente criados para realizar ligações telefônicas, atualmente eles são utilizados para as mais diversas finalidades de entretenimento e tem se tornado cada vez mais uma ferramenta indispensável em negócios. Os recursos oferecidos por esses equipamentos, planejados, inicialmente, para telefonia móvel, atualmente incluem, entre outros, câmeras, acelerômetro, Global Positioning System (GPS), leitura de impressão digital, sensores e reconhecimento de movimentos. Considerando a quantidade desses dispositivos existentes e os muitos recursos que eles oferecem, propõe-se o desenvolvimento de um aplicativo Android para mapeamento de rotas percorridas pelo usuário. O uso inicialmente pensado é para esportistas e amadores que percorrem caminhos (trilhas, por exemplo) desconhecidos e que possam retornar dessas trilhas com segurança e refazer o trajeto em outras ocasiões (repercorrer). Esse uso não se aplica somente a lugares de difícil identificação, como pântanos, matas e regiões desérticas, mas pode ser usado por turistas em cidades desconhecidas. Contudo, o aplicativo, com os devidos ajustes, pode ser utilizado para diversos fins comerciais e pessoais que requeiram o registro do caminho percorrido, como roteamento de frotas e de entregas. O aplicativo desenvolvido permite definir a granularidade de marcação dos pontos da rota em termos de distância (a cada quantos metros inserir um marcador) ou em tempo (a cada quantos minutos inserir um marcador da rota). Palavras-chave: Aplicação Android. GPS. Dispositivos móveis.
ABSTRACT
MACHADO, Cleverson. Android device app for mapping traveled routes. 2017. 59f. Monografia (Trabalho de Conclusão de Curso) - Curso Superior de Tecnologia em Análise e Desenvolvimento de Sistemas, Universidade Tecnológica Federal do Paraná, Câmpus Pato Branco. Pato Branco, 2017. Mobile devices are widely used. Statistical data confirm the high number of people who have these devices. The mobile applications are also many and diversified. The features offered by these devices, initially planned for mobile telephony, today include, among others, cameras, accelerometer, Global Positioning System (GPS), fingerprint reading, sensors and motion recognition. Considering the number of these devices and the many features they offer, it is proposed to develop an Android application for mapping routes traveled by the user. The initial use is intended for athletes and amateurs who walk unknown paths (trails, for example) and who can safely return from these trails and re-record them. This use does not apply only to places of difficult identification such as marshes, forests and desert regions, but can be used by tourists in unknown cities. However, the application, with the appropriate adjustments, can be applied to various commercial and personal uses that require registration of the path traveled. The application allows the user to specify the granularity of the route points (in distance or time) Keywords: Android application. GPS. Mobile devices.
LISTA DE FIGURAS Figura 1 – Uso de dispositivos Mobile ................................................................................. 12
Figura 2 – Arquitetura do sistema operacional Android........................................................ 18
Figura 3 – Diagrama de casos de uso.................................................................................... 25
Figura 4 – Diagrama de entidades e relacionamentos do banco de dados.............................. 30
Figura 5 – Tela splash .......................................................................................................... 32
Figura 6 – Página principal .................................................................................................. 33
Figura 7 – Alert Dialog de início de captura de rota ............................................................. 34
Figura 8 – Tela principal com rastreador ativo ..................................................................... 35
Figura 9 – Lista de rotas....................................................................................................... 36
Figura 10 – Exibindo pontos de rota..................................................................................... 37
Figura 11 – rota sendo repercorrida...................................................................................... 38
Figura 12 – Informações de ponto ........................................................................................ 39
Figura 13 – Exclusão de rotas .............................................................................................. 40
Figura 14 – Tela de preferências .......................................................................................... 41
LISTA DE QUADROS Quadro 1 - Ferramentas e tecnologias utilizadas................................................................... 20
Quadro 2 – Requisitos funcionais......................................................................................... 24
Quadro 3 – Requisitos não funcionais .................................................................................. 25
Quadro 4 – Caso de uso armazenar rota ............................................................................... 26
Quadro 5 – Caso de uso visualizar rota atual ........................................................................ 27
Quadro 6 – Caso de uso exibir lista de rotas ......................................................................... 27
Quadro 7 – Caso de uso excluir dados.................................................................................. 28
Quadro 8 – Caso de uso visualizar configurações................................................................. 28
Quadro 9 – Caso de uso rastrear service ............................................................................... 29
Quadro 10 – Caso de uso repercorrer rota ............................................................................ 30
Quadro 11 – Campos da tabela rota...................................................................................... 30
Quadro 12 – Campos da tabela pontos_rota.......................................................................... 30
Quadro 13 – Descrição da classe rota ................................................................................... 31
Quadro 14 – Descrição da classe pontos_rota....................................................................... 31
LISTAGEM DE CÓDIGO
Listagem 1 – rotina de captura de dados do banco SqLite..................................................... 42
Listagem 2 – cálculo da distância entre dois pontos de GPS ................................................. 42
Listagem 3 – Verificação de conexão com a rede de dados................................................... 43
Listagem 4 – Permissão de verificação de conexão com a rede............................................. 43
Listagem 5 – Busca de dados de localização com Geocoder API.......................................... 43
Listagem 6 – Update de uma rota na base de dados .............................................................. 44
Listagem 7 – Adapter personalizado .................................................................................... 45
Listagem 8 – Método de captura de opção selecionada......................................................... 46
Listagem 9 – Adição de item em componente Spinner ......................................................... 46
Listagem 10 – Inserção de nova rota .................................................................................... 46
Listagem 11 – Chamada do serviço de captura de pontos GPS ............................................. 47
Listagem 12 – onStartCommand .......................................................................................... 48
Listagem 13 – Início do serviço de captura de dados GPS .................................................... 48
Listagem 14 – Solicitação de permissão de captura de geoposição ....................................... 49
Listagem 15 – Método onLocationchanged() ....................................................................... 49
Listagem 16 – Thread de gravação....................................................................................... 50
Listagem 17 – Método onMapaReady() ............................................................................... 50
Listagem 18 – Inserindo pontos e linhas no mapa................................................................. 51
Listagem 19 – calculo de distância entre pontos ................................................................... 52
Listagem 20 – validação de atualização de mapa.................................................................. 52
Listagem 21 – Exclusão de rotas .......................................................................................... 53
Listagem 22 – Layout de preferências .................................................................................. 54
Listagem 23 – Recuperando dados de preferências............................................................... 55
LISTA DE SIGLAS API Application Programming Interface
CDMA Code Division Multiple Access
CRM Customer Relationship Management
CSS Cascade Style Sheet
DAO Data Access Object
GPS Global Positioning System
GSM Global System for Mobile communications
HTML Hypertext markup Language
PDA Personal Digital Assistent
RF Requisito Funcional
RNF Requisito Não Funcional
TI Tecnologia de Informação
XML eXtensible Markup Language
SUMÁRIO
1 INTRODUÇÃO............................................................................................................... 11
1.1 CONSIDERAÇÕES INICIAIS ...................................................................................... 11
1.2 OBJETIVOS.................................................................................................................. 13
1.2.1 Objetivo Geral............................................................................................................. 13
1.2.2 Objetivos Específicos .................................................................................................. 13
1.3 JUSTIFICATIVA .......................................................................................................... 13
1.4 ESTRUTURA DO TRABALHO ................................................................................... 14
2 REFERENCIAL TEÓRICO .......................................................................................... 15
2.1 CONCEITOS................................................................................................................. 15
2.2 CLASSIFICAÇÃO DE APLICAÇÕES MÓVEIS.......................................................... 16
2.3 A PLATAORMA ANDROID ........................................................................................ 17
3 MATERIAIS E MÉTODO ............................................................................................. 20
3.1 MATERIAIS.................................................................................................................. 20
3.2 MÉTODO ...................................................................................................................... 20
4 RESULTADO ................................................................................................................. 23
4.1 ESCOPO DO SISTEMA................................................................................................ 23
4.2 MODELAGEM DO SISTEMA...................................................................................... 24
4.3 APRESENTAÇÃO DO SISTEMA ................................................................................ 31
4.4 IMPLEMENTAÇÃO DO SISTEMA ............................................................................. 41
5 CONCLUSÃO................................................................................................................. 56
REFERÊNCIAS................................................................................................................. 58
11
1 INTRODUÇÃO
Este capítulo apresenta as considerações iniciais, os objetivos e a justificativa do
trabalho e a apresentação dos capítulos subsequentes.
1.1 CONSIDERAÇÕES INICIAIS
Em 2013, o número de celulares alcançou 6,8 bilhões, representando 96% do total da
população (GLOBAL..., 2014), se considerado apenas um aparelho por habitante, mas esse
não é o caso. É comum que pessoas possuam chip de operadoras distintas em um mesmo
aparelho celular e que uma pessoa possua mais de um aparelho. Estudo realizado pelo Gartner
Group (2015) indicou que o sistema operacional que dominaria em 2015 seria o Android, com
praticamente 50% do mercado. Em 2016 o número superou 1,5 bilhão de smartphones no
mundo (MOBILE TIME, 2017a). Estudo do Emarheter projeta que haverá 2,56 bilhões de
pessoas sendo usuários de smartphones em 2018.
Considerando que atualmente os smartphones estão se tornando mais rápidos, com
telas maiores e processadores múltiplos, eles também estão permitindo realizar atividades
costumeiramente destinadas aos computadores pessoais, seja no campo da educação, dos
negócios ou doméstico (NAGESH; CAICEDO, 2012).
Alguns dos dispositivos móveis (smartphones e tablets, por exemplo) mais populares
incluem (PAVLIĆ; PAVLIĆ; JOVANOVIĆ, 2012): iPhone, iPad, Eee Pad, Blueberry e Slate
PC. Esses mesmos autores destacam que no campo dos smartphones quatro sistemas
operacionais são atualmente dominantes no mercado: Symbian (Nokia), Android (Google),
iOS (Apple) e Windows Mobile (Microsoft).
Pesquisa realizada pela Stat Counter, em março de 2017, apresenta que foi a primeira
vez o sistema operacional Android ultrapassou o Sistema Operacional Windows em tráfego
online (MOBILE TIME, 2017b), indicando o real crescimento do uso de dispositivos móveis
pela população mundial. A Figura 1 apresenta percentuais de utilização de smartphones pela
população mundial.
12
Figura 1 – Uso de dispositivos Mobile Fonte: Cnova Marktplace (2015, p.s.n.).
As tecnologias móveis tais como os smartphones estão definindo uma nova geração de
consumidores e de aplicações de negócio (TENG; HELPS, 2010). Esses autores destacam
que a partir do surgimento da web, com uso de email para acesso remoto a Customer
Relationship Management (CRM), não há limite para o que pode ser realizado com
dispositivos móveis.
Para os profissionais de Tecnologia de Informação (TI) esse nível sem precedentes de
mobilidade é tanto uma oportunidade como um desafio (TENG; HELPS, 2010). A adoção de
tecnologias móveis pode ser um processo complexo, não somente por causa do grande
número de tipos de dispositivos existentes com um crescente número de sistemas operacionais
(como, por exemplo, BlackBerry OS, Windows Mobile, Symbian OS e iPhone OS), mas,
também, porque desenvolver aplicativos para esses dispositivos envolve diversos sistemas
backend e uma variedade de tecnologias sem fio, como, Code Division Multiple Access
(CDMA), Global System for Mobile communications (GSM), Wi-Fi, WiMax, 3G e 4G
networks.
Os dispositivos móveis também podem ser utilizados para finalidades de
geolocalização. Aplicativos como Google Maps fazem uso de Global Positioning System
(GPS) e os aplicativos que executam nos dispositivos móveis podem utilizar recursos que
permitem obter a localização geográfica atual do usuário, por exemplo. Duas formas básicas
de localização são consideradas atualmente: localização por GPS e triangulação do sinal GSM
(EICHLER; LUKE; REUFENHEUSER, 2009).
O GPS é um sistema de posicionamento que tem como base os sinais enviados por
uma rede de satélites. O receptor GPS calcula o tempo que o sinal, de pelo menos três
satélites, leva para chegar e, a partir desse tempo calcula sua posição com alta precisão, tendo
uma probabilidade de erro de poucos metros (MORIMOTO, 2010). A localização por
triangulação de sinal GSM consiste em fornecer a localização atual do usuário baseado na
13
intensidade do sinal deste para com as torres próximas a sua localização atual. Quanto mais
torres existirem próximas à localização do usuário, maior será a precisão de sua localização
(MORIMOTO, 2010).
Utilizando recursos como GPS, neste trabalho, é reportando o desenvolvimento de um
aplicativo para dispositivos móveis Android. Esse aplicativo permitirá o registro de rotas
realizadas pelo usuário.
1.2 OBJETIVOS
A seguir são apresentados o objetivo geral e os objetivos específicos alcançados com a
realização deste trabalho.
1.2.1 Objetivo Geral
Desenvolver um aplicativo para dispositivos móveis Android para a marcação de
pontos registrando uma rota realizada pelo usuário.
1.2.2 Objetivos Específicos
• Permitir que o usuário possa refazer uma rota, com a indicação de
distância/proximidade do usuário dessa rota.
• Possibilitar que o usuário possa configurar a distância ou o tempo para marcação
dos pontos da rota.
• Obter a distância da rota por meio do cálculo da distância entre os pontos que
foram marcados e que compõem uma rota.
1.3 JUSTIFICATIVA
A marcação de rotas pode ser vista com duas funcionalidades básicas quando para uso
não vinculado a negócio. Uma delas é a definição de um caminho que possa ser
posteriormente percorrida. Por exemplo: marcar uma rota ou caminho de uma trilha ecológica
e que ela possa ser posteriormente percorrida (usuário retornar ao ponto inicial) com a ajuda
do aplicativo. Outra aplicação básica é realizar a medição da distância entre o início e o final
14
da rota percorrida. Por exemplo: uma pessoa quer saber a distância que andou a pé, de
bicicleta ou de carro em um determinado trajeto marcado pelo aplicativo.
A definição de rotas pode ser bastante útil para profissionais e amadores que se
deslocam em locais com trilhas ou estradas não definidas, não devidamente marcadas,
desconhecidas ou de acesso e localização difíceis, como matas, pântanos, áreas desérticas ou
mesmo em uma cidade ou local desconhecido. As rotas, definidas quando o caminho foi
realizado, podem ser utilizadas para o retorno. Essas rotas também podem ser utilizadas pela
própria pessoa ou por outras que desejam fazer (repercorrer) o mesmo trajeto.
Em termos de aplicações comerciais são diversos os usos de mapeamento de rotas,
como para empresas de logística, entrega e transportadoras, por exemplo.
1.4 ESTRUTURA DO TRABALHO
O texto a seguir está organizado em capítulos. O Capítulo 2 apresenta a
fundamentação conceitual para o aplicativo desenvolvido que é para dispositivos móveis
Android. No Capítulo 3 são apresentadas as tecnologias, as ferramentas e as principais
atividades realizadas para desenvolver o trabalho. No Capítulo 4 é apresentado o sistema
desenvolvido por meio da modelagem realizada, das telas implementadas e de exemplos de
códigos desenvolvidos. Por fim estão as considerações finais seguidas das referências
utilizadas no texto.
15
2 REFERENCIAL TEÓRICO
Este Capítulo apresenta o referencial teórico que fundamenta o aplicativo
desenvolvido como resultado da realização deste trabalho. O capítulo apresenta conceitos
sobre aplicações móveis e a plataforma Android. O aplicativo desenvolvido é para
dispositivos móveis Android.
2.1 CONCEITOS
Um aplicativo móvel é um software que pode ser executado em um dispositivo
eletrônico móvel, como os telefones celulares, os Personal Digital Assistent (PDA) e os
smartphones.
As aplicações móveis são caracterizadas como as que fornecem suporte à
interoperabilidade e à mobilidade (CHA; BERND; DU, 2009). Para esses autores
interoperabilidade é a capacidade de uma aplicação executar em diversas plataformas móveis
e mobilidade é a capacidade de a aplicação ser transferida entre redes heterogêneas.
Existem diversas plataformas ou sistemas operacionais para dispositivos móveis,
como Android, iOS, Windows Phone e BlackBerry. Dados de 2012 indicavam o Android com
67% do mercado de dispositivos móveis (JORDÃO, 2012) e dados de 2013 indicam Android
e iOS com 92,3% das vendas de smartphones (JORDÃO, 2013).
Android é o nome do sistema operacional baseado em Linux para celulares
(smartphones), netbooks e tablets (SIGNIFICADOS, 2017). Esse sistema operacional é
projetado para ser utilizado, principalmente, em dispositivos móveis com tela sensível ao
toque (para manipulação de objetos e uso de teclado virtual) como smartphones e tablets. Há,
ainda, a possibilidade de uso das interfaces específicas para televisão (Android TV), veículos
(Android Auto) e relógios (Android Wear). Além disso, pode ser utilizado em consoles de
videogames, câmeras digitais, computadores e dispositivos eletrônicos.
16
2.2 CLASSIFICAÇÃO DE APLICAÇÕES MÓVEIS
Nagesh e Caicedo (2012) categorizam as aplicações móveis genericamente em três
categorias, embora Lionbridge (2012), as categorizem apenas como nativas e web:
a) Aplicações móveis nativas – essas aplicações são construídas para hardware e
sistema operacional específico, assim, elas podem obter vantagem dos recursos tecnológicos
mais recentes desenvolvidos para os respectivos dispositivos móveis e podem integrar
aplicativos on-board como calendário, agenda e email (LIONBRIDGE, 2012).
b) Aplicações móveis baseadas na web – essas aplicações são acessadas por meio de
um navegador web para dispositivos móveis (LIONBRIDGE, 2012). Como ocorre com as
aplicações web, uma aplicação web móvel é construída com três tecnologias essenciais:
Hypertext Markup Language (HTML) para os textos estáticos e as imagens; Cascade Style
Sheet (CSS) para definir estilos e apresentação e JavaScript para implementar as interações e
as animações.
c) Aplicações móveis híbridas – essas aplicações são desenvolvidas utilizando
bibliotecas de código fonte aberto e também possuem acesso aos recursos nativos dos
dispositivos como câmera, GPS, acelerômetro e sistema de arquivos (NAGESH; CAICEDO,
2012). É possível utilizar tecnologias web para o desenvolvimento de aplicações com acesso
nativo a recursos dos dispositivos (SINGH, 2013).
Já Unhelkar e Murugesan (2010) classificam as aplicações móveis no contexto
empresarial em cinco categorias:
a) m-broadcast - broadcast móvel – aplicações que transmitem diferentes tipos de
conteúdo para um grande grupo de usuários. Facilita divulgação de informação em larga
escala (broadcast) como avisos e promoções.
b) m-information - informação móvel – aplicações que apresentam informações
solicitadas pelo usuário e o fluxo é unidirecional, no sentido da não iteração do usuário com o
aplicativo, ou seja, somente do aplicativo para o usuário Provê informações para usuários de
dispositivos móveis.
c) m-transaction - transação móvel – facilita a execução de transações, gerenciamento
de relacionamento com o consumidor, vendas e marketing. Por meio desses aplicativos os
usuários podem rastrear compras e vendas realizadas.
d) m-oppeation - operação móvel – suportam aspectos operacionais de um negócio que
não envolve interação direta com clientes ou compradores. Essas aplicações facilitam os
17
aspectos operacionais de negócio da empresa. Elas oferecem acesso às informações, como de
estoque, agenda de produção, de folha de pagamento e balanços.
e) m-collaboration colaboração móvel – mantém colaboração entre empregados e
unidades funcionais em uma empresa. Essas aplicações suportam colaboração dentro e fora da
empresa. Além disso, facilitam a colaboração com outras empresas de interesse ou parceiras
de negócio. Exemplos de aplicações que pertencem a essa categoria são aplicações de redes
sociais que podem auxiliar a criar e gerenciar grupos de pessoas (empregados, clientes,
fornecedores).
Para Unhelkar e Murugesan (2010) as aplicações das três últimas categorias que
necessitam de requisitos e desafios diferentes dos necessários às aplicações das duas primeiras
categorias.
Karadimce e Bogatinoska (2014) ressaltam que considerando as diferenças inerentes
nessas tecnologias, cada abordagem possui benefícios e desvantagens. Para esses autores as
aplicações móveis nativas são construídas para dispositivos móveis específicos e seu
respectivo sistema operacional. As aplicações web móveis são, geralmente, obtidas por
dowload de um servidor web a cada vez que são executadas, embora aplicações construídas
com HTML5 podem ser executadas no dispositivo móvel de forma offline (LIONBRIDGE,
2012). Com as aplicações web móveis, o grau de acesso dos recursos dos dispositivos não é
comparável com as aplicações móveis nativas, mas é melhor que o acesso das aplicações web
móveis (NAGESH; CAICEDO, 2012).
2.3 A PLATAORMA ANDROID
A plataforma Android é caracterizada como uma pilha (camadas) de software
composta por um sistema operacional, middleware e aplicações de base (ANDROID, 2016).
Com um viés centrado em aplicabilidade, Guana et al. (2012) definem Android como é um
sistema operacional visto como um conjunto de serviços de software especialmente
desenvolvidos para dispositivos móveis.
A arquitetura da plataforma Android é composta por cinco camadas com
funcionalidades e comportamentos específicos que são: aplicações, framework, bibliotecas,
runtime e kernel Linux. A base dessa arquitetura é o kernel do Linux, que funciona como uma
18
camada de abstração entre o hardware e os aplicativos que executam na plataforma (GUANA
et al. 2012).
Na plataforma Android, as aplicações são escritas em Java e executadas em sua
própria máquina virtual, a Dalvik, que por sua vez é executada em seu próprio processo no
Linux, isolando-a de outras aplicações e facilitando o controle de recursos (ANDROID
DEVELOPER, 2012). A Figura 2 apresenta a organização da arquitetura do Android.
Figura 2 – Arquitetura do sistema operacional Android
Fonte: Android Developer (2016, p.s.n.).
A seguir uma breve descrição das camadas da arquitetura do sistema operacional
Android apresentada na Figura 2 (GUANA et al., 2012, MAJI et al., 2010):
a) Applications – camada que contém um conjunto de aplicações como clientes de
emails, aplicativos de mensagens, calendário, navegador de mapa e navegadores de jogos que
estendem as funcionalidades do sistema operacional. Essas aplicações são disponibilizadas
com a distribuição do Android.
b) Application framework – contém elementos que visam o uso de componentes no
Android. Com os elementos desse framework, tais como intents, content providers, views e
managers, é possível construir aplicações para executar no kernel Android e interoperar entre
si e com outras aplicações.
19
c) Libraries – contém bibliotecas compostas por um conjunto de pacotes C/C++
usados pelo framework de aplicação para gerenciar a renderização da interface, prover
segurança dos aplicativos no dispositivo e a persistência de aplicações, entre outros. Essa
camada inclui bibliotecas C do sistema, gerenciadores de interface, engine gráfica 2D e 3D,
codecs de mídia, a base de dados SQLite e a engine LibWebCore do navegador web.
d) Android Runtime – contém a máquina virtual Dalvik e as bibliotecas básicas
Android que especificam o ambiente de execução da aplicação dentro do sistema operacional.
As bibliotecas básicas provem a maioria das funcionalidades disponíveis em Java. Dalvik
opera como um tradutor entre a aplicação e o sistema operacional. Toda aplicação Android
executa em seu próprio processo, com sua própria instância da máquina virtual Dalvik.
e) Linux kernel – é um kernel Linux customizado usado para prover as
funcionalidades de baixo nível do sistema operacional tais como gerenciamento de memória e
agendamento de processos.
20
3 MATERIAIS E MÉTODO
A seguir estão os materiais e o método utilizados para a modelagem e a
implementação do sistema obtido resultado deste trabalho.
3.1 MATERIAIS
No Quadro 1 estão as ferramentas e as tecnologias utilizadas na análise e no
desenvolvimento da aplicação mobile.
Ferramenta / Tecnologia
Versão Referência (site) Finalidade
Google Maps API 24.0.2 https://developers.google.com/maps/documentation/android-api/?hl=pt-br
Application Programming
Interface (API) de integração com mapas.
Google Goecoder API V2
1.2.2 https://developers.google.com/maps/documentation/geocoding/intro?hl=pt-br
Captura de descrição de localização atraves de coordenadas.
Android Studio V2.0 https://developer.android.com/studio/index.html?hl=pt-br
Ferramenta de desenvolvimento Android.
Android SDK V2.0 http://developer.android.com/sdk Kit de desenvolvimento de software do Android.
SQLite 3.19 https://www.sqlite.org/ Armazenamento de dados no dispositivo móvel.
Quadro 1 - Ferramentas e tecnologias utilizadas
3.2 MÉTODO
O método consiste nas atividades de levantamento de requisitos, modelagem desses
requisitos e na implementação do aplicativo. A seguir descrita sucintamente a realização
dessas etapas.
Levantamento de requisitos
A ideia da implementação do aplicativo surgiu a partir do desenvolvimento de outra
aplicação para monitoramento de localização. No desenvolvimento dessa aplicação verificou-
se a utilidade de uma ferramenta capaz de gravar caminhos percorridos e possibilitar refazer
esses caminhos com o auxílio de indicação se a rota está ou não sendo seguida.
21
As funcionalidades foram desenvolvidas a partir da análise de como as pessoas ficam
confusas (como vendedores em uma cidade nova) ao visitar locais desconhecidos e não
saberem exatamente como chegar a determinado local para poder voltar posteriormente, ou
mesmo para saberem como efetuar o retorno para o local de origem.
Outra motivação e circunstância de análise para definição dos requisitos foi a
observação que pessoas acabam se perdendo em trilhas por não saberem o caminho de volta,
ou por ficar caminhando em círculos em locais desconhecidos.
Para o levantamento de requisitos complementares e visando um viés prático para
usuários não empresariais, foram consideradas indicações de funcionalidades que seriam úteis
em uma aplicação desse tipo realizadas pela Profa. Beatriz T. Borsoi e pelo Prof. Robson C.
Brito.
Análise e projeto
A análise e o projeto consistiram na modelagem dos requisitos. A modelagem dos
requisitos é bastante simples em termos de casos de uso e de persistência de dados. O
aplicativo ficará armazenado no dispositivo móvel do usuário e não haverá necessidade de
controle de permissões de acesso ou de restrição de acesso às funcionalidades, até porque
haverá apenas um perfil de acesso. O banco de dados consiste de apenas duas tabelas para
persistência das rotas (os caminhos percorridos).
Implementação
A implementação da aplicação foi dividida em oito etapas:
1) Interface inicial e preferências
A etapa inicial de implementação foi focada no desenvolvimento da interface de
abertura do aplicativo (splash), da interface de menu de opções com uso de Adapter próprio,
na implementação de listas personalizada de itens e de dialogs.
2) Captura de posições GPS e apresentação em mapa
Na segunda etapa, o foco foi o desenvolvimento de rotina de captura de sinal GPS por
meio da API Google Maps com o processamento dos dados recebidos e exibição em tela de
mapa no dispositivo Android. E na interface de mapa foram implementados botões para
facilitar a aplicação de zoom.
3) Desenvolvimento de tabelas SQLite para persistência
A terceira etapa foi voltada para a projeção das tabelas necessárias buscando suprir as
necessidades de persistências da aplicação. Foram projetadas duas tabelas sendo uma delas
com chave estrangeira buscando maior integridade e referenciamento de registros de rotas
salvas.
22
4) Identificação e persistência de rotas
Nessa etapa foi adaptada a interface do aplicativo para solicitar uma descrição de rota
ao iniciar o rastreamento, também foi desenvolvida a interface Data Access Object (DAO)
para persistência e recuperação de dados da base SQLite.
5) Listagem de rotas salvas
Na quinta etapa foi desenvolvido um novo Adapter para uma nova tela de listagem
para exibir as rotas salvas no SqQLite, disponibilizando opção para o usuário excluir uma rota
ou visualizar a rota percorrida em uma interface de mapa.
6) Serviços de captura de posição GPS e busca de localização
Nessa etapa foi migrada a rotina de captura de localização para função de serviço do
Android, possibilitando iniciá-lo de outras telas. Também foi implementado um serviço que
percorre as posições persistidas na base SQLite e busca a descrição da localização utilizando a
API Google Geocoder.
7) Cálculo de distâncias
Nessa etapa, no serviço de busca de descrição foi incluída uma funcionalidade para
efetuar o cálculo das distâncias percorridas em cada rota, bem como a inclusão desse cálculo
na carga dos pontos da rota para exibição no mapa.
8) Funcionalidade para repercorrer (refazer) uma rota
Nessa última etapa foi implementada opção para o usuário realizar novamente uma
rota, repercorrer, utilizando como referência os pontos capturados quando essa rota foi
percorrida anteriormente. Essa opção está disponível ao visualizar uma rota específica, no
mapa, e pode ser acessada pelo botão ‘Guiar’.
23
4 RESULTADO
Este capítulo apresenta o resultado da realização deste trabalho.
4.1 ESCOPO DO SISTEMA
O aplicativo desenvolvido tem a finalidade principal de ser um rastreador que
armazenará rotas percorridas pelo usuário, recuperando, posteriormente, posições marcadas
na rota, horário de ocorrência das marcações, locais de marcação (pontos geográficos que
definem a posição no mapa físico com marcador), velocidade aproximada de deslocamento e
distância percorrida. A cada intervalo de pontos marcados pelo usuário, o aplicativo medirá a
distância e, assim, ao final do trajeto será obtida por somatório a distância total, ou somatórias
parciais de acordo com o avanço do deslocamento.
O aplicativo permite ao usuário repercorrer uma rota já realizada, ou seja, o aplicativo
indicará, por meio dos pontos armazenados para a rota marcada no mapa, a direção que o
usuário deverá seguir para realizar o caminho indicado pela rota. A distância parcial, ou seja,
a que é apresentada à medida que o usuário se desloca possibilita orientar o usuário a fazer um
retorno (repercorrer a rota do ponto final para o ponto inicial) ou refazer a rota do ponto
inicial para o ponto final que foi marcado com mais precisão.
O sistema desenvolvido como resultado deste trabalho, permitirá que o usuário grave
todos os caminhos pelos quais passou, auxiliando-a a refazer o caminho ou retornar ao ponto
de partida em segurança, sem o risco de errar o caminho. Como exemplos de utilização dessa
aplicação pode-se citar: caminhadas, trilhas ecológicas, trajetórias em cidades ou bairros
desconhecidos e até com registros de onde o(s) veículo(s) da frota passaram. A solução
proposta considera o contexto apresentado a seguir:
Um usuário pode percorrer mais de um caminho e manter registros separados desses
caminhos para posterior deslocamento de retorno. O aplicativo funciona mesmo sem sinal de
internet (WiFi) e sem estar em conexão com a rede de operadora. Contudo, o dispositivo deve
ter módulo GPS (que é presente na maioria dos dispositivos móveis), também é necessário,
para um melhor desempenho e precisão, que o usuário tenha boa visada do céu para que o
sistema GPS obtenha os sinais dos satélites de triangularização de posição.
Ao abrir a aplicação será efetuada uma varredura na base de dados dos pontos
armazenados que estejam sem informação de descrição bem como a tentativa de conexão com
24
a base de dados Google Maps, para a recuperação das descrições dos pontos percorridos.
Também será efetuado o recálculo, por meio de uma API, das distâncias de cada rota
armazenada na base de dados local do aplicativo.
Após aberta a aplicação, é apresentado ao usuário um menu de opções com
possibilidade de iniciar ou continuar uma rota, acessar as configurações da aplicação,
visualizar uma lista com as rotas salvas, excluir todos os pontos salvos e visualizar a rota atual
com atualização automática do percurso que se está sendo realizado.
A listagem com as rotas percorridas e armazenadas é exibida no respectivo mapa para
que o usuário possa selecionar uma rota visando verificar os pontos que a compõem, a
distância do trajeto e outros dados armazenados.
As rotas serão armazenadas em base SQLite no próprio dispositivo móvel para que
elas possam ser recuperadas posteriormente. A recuperação se refere à funcionalidade de re-
percorrer uma rota ou de consultar dados que foram armazenados. O usuário também pode
excluir uma rota especifica ou todas as rotas armazenadas.
4.2 MODELAGEM DO SISTEMA
O Quadro 2 apresenta a listagem dos requisitos funcionais identificados para o
sistema. Nesse Quadro RF significa Requisito Funcional.
Identificação Nome Descrição RF01 Armazenar rota É solicitado um nome para a rota e posteriormente
iniciado um serviço de captura de localização gravando em base de dados SQLite.
RF02 Ver rota atual Exibe um mapa com os pontos já capturados e acrescenta novos pontos conforme o avanço no deslocamento.
RF03 Visualizar rotas Exibe um mapa com todos os pontos de cada uma das rotas já percorridas ou de uma rota especifica.
RF04 Excluir dados Exclui fisicamente todas as rotas e respectivos pontos já armazenados.
RF05 Ver configurações Exibe a tela na qual é possível executar várias configurações do aplicativo.
RF06 Rastrear service Serviço iniciado, ao iniciar um rastreamento, ele e responsável pela rotina de captura dos pontos e chamada dos métodos de gravação no banco de dados.
RF07 Repercorrer rota Escolher uma rota registrada e refazer a rota. O aplicativo vai indicando se o usuário está se deslocando fora da rota.
Quadro 2 – Requisitos funcionais
25
A listagem que está no Quadro 3 apresenta os requisitos não-funcionais identificados
para o sistema como um todo, também denominados de requisitos suplementares. Os
requisitos não funcionais explicitam regras de negócio, requisitos de qualidade, desempenho
dentre outros. Nesse Quadro RNF significa Requisito não Funcional.
Identificação Nome Descrição RNF01 Tela splash Ao iniciar o aplicativo é exibida uma tela do tipo splash.
Nessa tela é iniciado um serviço de atualização de cálculo de distância de rota bem como atualização das descrições dos pontos caso exista conexão com a Internet.
RNF02 Thread GravaDados Thread responsável pela persistência dos dados na base, utilizada para evitar travamento da aplicação.
Quadro 3 – Requisitos não funcionais
O diagrama de casos de uso apresentado na figura 3 contém as funcionalidades
essenciais do sistema realizadas pelos seus usuários e pelo próprio aplicativo em rotinas de
disparo automático.
Figura 3 – Diagrama de casos de uso
No quadro 4 está a descrição do caso de uso Armazenar rota.
26
Caso de uso: Armazenar rota Descrição:
Inicia processo de captura de coordenadas de localização, e efetua a persistência dos dados em banco de dados. Evento Iniciador:
Click no botão iniciar ou continuar rota. Atores:
Usuário. Pré-condição:
Ter sido inserido um nome para a nova rota ou ter sido selecionado uma rota já existente para continuar.
Sensor GPS do dispositivo estar ativo ou dispositivo com conexão a rede de dados moveis. Sequência de Eventos: 1. Iniciado um serviço que será responsável por gerenciar a captura dos dados. 2. O sistema verifica se já esta sendo feita a captura dos dados. 3. Sistema verifica se o sensor GPS está ativo ou se há conectividade de dados moveis. 5. Sistema inicia a captura de pontos por meio da API do Google Maps no qual é iniciado um método assíncrono que verifica a posição atual. 6. Quando um novo ponto é encontrado, um objeto location é retornado do método de captura. Esse objeto contém vários dados como posição, altitude, velocidade dentre outros. Esses dados são recuperados e uma nova thread é iniciada para persistir os dados, sendo o ciclo de captura repetido. Pós-Condição: Dados do ponto capturado inseridos no banco de dados.
Nome do fluxo alternativo (extensão) Descrição
Linha 2: verificação de sistema ativo 2.1 se já estiver ativo o rastreamento, então o sistema desativa a captura dos dados de GPS e retorna para a tela principal da aplicação.
Linha 3: Verificação de sensor GPS 3.1 se sensor GPS estiver inativo e nenhuma rede móvel conectada, então sistema exibe mensagem informativa e abre tela de configurações do dispositivo para usuário ativar o sistema de GPS. 3.2 se sensor não for ativo, sistema aborta operação e retorna para o menu principal.
Quadro 4 – Caso de uso armazenar rota
O caso de uso Visualizar rota atual é apresentado no quadro 5.
Caso de uso: Visualizar rota atual. Descrição:
Esse caso de uso exibe um mapa com os pontos já percorridos da rota atual ou da rota selecionada, se a captura de novos pontos estiver ativa então a opção de repercorrer a rota e desabilitada no mapa e caso novos pontos sejam capturados o mapa é automaticamente atualizado. Caso o rastreio não esteja ativo, então o usuário terá a opção de repercorrer a rota exibida através de um botão no mapa. Evento Iniciador:
Escolha da opção correspondente à ação visualizar rota atual. Atores:
Usuário Pré-condição:
Existir rota(s) gravada(s) ou que tenha sido selecionada pelo usuário. Sequência de Eventos: 1. Ator seleciona opção para visualizar rota atual.
27
2. Sistema inicia nova tela com componente de mapa. 3. Sistema recupera da base de dados os pontos referentes a rota a ser exibida. 4. Sistema insere no mapa os marcadores de cada ponto. 5. Sistema insere traçado entre os pontos. 6. Sistema verifica se rastreador está ativo. Pós-Condição: não há.
Nome do fluxo alternativo (extensão) Descrição
Linha 6: Ver rastreador 6.1 Se rastreador estiver ativo então sistema inicia rotina de sincronização e inserção de novos pontos ao mapa.
Quadro 5 – Caso de uso visualizar rota atual
O caso de uso Exibir lista de rotas é apresentado no quadro 6.
Caso de uso: Exibir lista de rotas. Descrição:
Esse caso de uso apresenta a lista de rotas cadastradas, necessárias para que um rastreamento possa ser iniciado ou para que um percurso de rota seja refeito. Evento Iniciador:
Escolha da opção ver lista de rotas no menu principal. Atores:
Usuário Pré-condição:
Existir rota(s) gravada(s). Sequência de Eventos: 1. Ator seleciona opção de visualizar lista de rotas. 2. Sistema busca na base de dados todas as rotas salvas. 3. Sistema exibe mensagem caso nenhuma rota seja encontrada. 4. Sistema inicia nova tela de listagem com a lista das rotas recuperadas. 5. Sistema apresenta opção de excluir uma rota da lista. 6. Sistema apresenta opção de visualizar em um mapa a rota da lista. Pós-Condição: .Operação de visualização ou exclusão de uma rota.
Nome do fluxo alternativo (extensão) Descrição
Linha 6: Ver Mapa 6.1 Ao clicar em ver rota é exibida nova tela com um componente de mapa onde são inseridos todos os pontos da rota selecionada.
Linha 5: Exclusão de registro de rota. 5.1 Se solicita exclusão de registro, o sistema chama o método de exclusão passando via parâmetro o ID da rota selecionada.
Quadro 6 – Caso de uso exibir lista de rotas
O caso de uso Excluir dados é apresentado no quadro 7.
28
Caso de uso: Excluir dados. Descrição:
Esse caso de uso se refere à operação para excluir todas as rotas cadastradas e salvas na base de dados do aplicativo. Evento Iniciador:
Escolha da opção para excluir dados. Atores:
Usuário Pré-condição:
Existir rota(s) gravada(s). Sequência de Eventos: 1. Ator seleciona opção de excluir todas as rotas. 2. Sistema solicita a confirmação de exclusão da rota. 3. Usuário confirma exclusão. 4. Sistema recupera uma lista das rotas salvas. 5. Sistema percorre essa lista, excluindo os pontos de rotas relacionados a cada rota. 4. Sistema exclui a rota. Pós-Condição: . Rotas excluídas.
Nome do fluxo alternativo (extensão) Descrição
Linha 4: excluir rota. 4.1 Sistema verifica se a rota excluída está sendo gerada no momento da exclusão, e caso esteja, encerra o serviço de captura da rota.
Quadro 7 – Caso de uso excluir dados
O caso de uso Visualizar configurações é apresentado no quadro 8.
Caso de uso: Visualizar configurações. Descrição: Exibição da tela de configurações do aplicativo, onde o usuário pode efetuar parametrizações de como o aplicativo deve se comportar para a captura dos dados de uma rota e exibição da rota no mapa. Evento Iniciador:
Usuário selecionar opção de visualizar configurações no menu principal ou no menu suspenso. Atores:
Usuário Pré-condição:
Não há. Sequência de Eventos: 1. Ator seleciona opção de visualizar configurações. 2. Sistema exibe tela de configurações. 3. Ator seleciona parâmetro a ser ajustado/alterado. 4. Sistema habilita campo para que o valor possa ser alterado. 5. Ator altera e solicita salvamento dos dados. 5. Sistema salva dados de preferência para posterior utilização. Pós-Condição: . Sistema verifica se foi solicitado que rastreador seja ativado e, caso seja afirmativo, dá início ao processo descrito no caso de uso Armazenar rota. Quadro 8 – Caso de uso visualizar configurações
29
O caso de uso Rastrear service é apresentado no quadro 9.
Caso de uso: Rastrear service. Descrição:
Serviço interno do sistema, responsável pela captura dos pontos de localização e persistência dos pontos recuperados em base de dados. Evento Iniciador:
Caso de uso armazenar rota. Atores:
Sistema. Pré-condição:
Usuário solicitar início de captura de rota. Sequência de Eventos: 1. Sistema Instancia objeto LocationManager. 2. Sistema verifica disponibilidade de captura de dados de GPS. 3. Sistema inicia escuta de serviço de captura de novos pontos. 4. Resposta recebida na escuta. 5. Sistema valida dados retornados na escuta. 6. Sistema gera objeto de ponto de rota. 7. Sistema instancia rotina de persistência dos dados do objeto na base de dados. Pós-Condição: . Sistema bloqueia na escuta enquanto novos dados não sejam retornados. Quadro 9 – Caso de uso rastrear service
O caso de uso Repercorrer rota é apresentado no Quadro 10.
Caso de uso: Repercorrer rota. Descrição:
Quando um mapa é exibido apresentando os pontos de uma rota já percorrida e o rastreamento de novos pontos não esteja em execução, é exibido um botão na tela do mapa com a descrição guiar. Quando essa opção é selecionada, uma nova rotina da captura do ponto atual de localização do usuário é iniciada, e a cada ponto capturado, é inserido no mapa um marcador diferenciado com a posição atual do usuário, bem como é exibido os pontos da rota original para servirem de referência para que o usuário saiba para onde deve se deslocar.
Ao clicar em um dos marcadores são exibidas informações da localização como data e hora, descrição da localização, velocidade e distância percorrida. Evento Iniciador:
Ator seleciona botão Guiar. Atores:
Usuário Pré-condição:
Existir rota já percorrida e não existir nenhuma rota em percurso. Sequência de Eventos: 1. Ator seleciona botão para repercorrer. 2. Sistema captura os pontos da rota armazenados no banco. 3. Sistema renderiza mapa na tela e insere os pontos recuperados da base de dados. 4. Sistema inicia processo assíncrono que captura o ponto atual do usuário de acordo com tempo ou distância de deslocamento configurados pelo usuário em tela de preferência, e apresenta no mapa o ponto exato para visualização do usuário. 5. Ator seleciona ponto de localização e informações sobre o ponto são exibidas. Pós-Condição: Ator solicitar parada do processo.
30
Nome do fluxo alternativo (extensão) Descrição
Linha 4: processo assíncrono 4.1 Sistema executa esse processo indeterminadas vezes até que o Ator solicite a parada por clique.no botão parar.
Quadro 10 – Caso de uso repercorrer rota
A figura 4 apresenta o diagrama de entidades e relacionamentos que representam o
banco de dados da aplicação. O atributo “id” e “id_Rota” da tabela pontos-Rota é necessário
para o tratamento de relacionamento entre a tabela de rotas e a tabela de pontos de rota.
Figura 4 – Diagrama de entidades e relacionamentos do banco de dados
No quadro 11 estão os campos da tabela de rota. Uma rota possuirá pontos
relacionados a ela (quadro 12) que serão utilizados para sua exibição no mapa, bem como um
nome e uma distância total do ponto inicial ao final.
Campo Tipo Nulo Chave primária Chave estrangeira id Numérico Não Sim Não
rota Texto Não Não Não
distancia Texto Sim Não Não
Quadro 11 – Campos da tabela rota
O Quadro 12 apresenta os campos da tabela de pontos_rota.
Campo Tipo Nulo Chave primária Chave estrangeira id Numérico Não Sim Não
Id_rota Numérico Não Não Sim
Latitude Numérico Não Não Não
longitude Numérico Não Não Não
Altitude Numérico Não Não Não
precisao Numérico Não Não Não
velocidade Numérico Não Não Não
dataHora Texto Não Não Não
localização Texto Sim Não Não
Quadro 12 – Campos da tabela pontos_rota
31
As tabelas apresentadas na figura 3 representam, também, as classes de persistência. A
seguir são apresentadas as classes rota e pontos-rota que se referem às classes persistentes do
sistema.
O Quadro 13 apresenta a classe Rota.
Identificação: Rota Descrição: Registros de Rotas e distancia total das mesmas
Requisitos: RF01 Atributos: id (número): identificador único, auto incremento para vincular os
registros de pontos da rota. nome (string): nome da rota. distancia (número): Distancia total percorrida da rota.
Quadro 13 – Descrição da classe rota
No Quadro 14 está a apresentação da classe pontos_Rota
Identificação: Pontos_Rota Descrição: Pontos de referências das rotas percorridas, identificadas por um ID de
rota e uma sequência cronológica de gravação auto incremento. Requisitos: RF01 Atributos: id (número): ID identificador único do ponto na tabela, utilizado como
sequenciador dos pontos salvos. id_rota : identificador de qual rota o ponto pertence. latitude (numérico): latitude da localização. longitude(numérico): longitude da localização. altitude(numérico): altitude da localização. precisão(numérico): valor de 1 a 10 representando uma escala de quão exato é o ponto capturado com a posição real do usuário. É definido pela intensidade do sinal GPS e da quantidade de satélites usados na triangularização do ponto. velocidade(numérico): velocidade de deslocamento no momento da captura. dataHora(String): data e hora da captura do ponto. localizacao(String) descrição do ponto de localização.
Quadro 14 – Descrição da classe pontos_rota
4.3 APRESENTAÇÃO DO SISTEMA
O leiaute do sistema é composto por 5 telas: a primeira, que é apresentada ao iniciar o
aplicativo, é conhecida como splash (figura 5). Essa é uma tela simples, somente com o logo
do sistema e fica ativa apenas por um segundo. Nesse período de tempo é iniciado um serviço
que atualizará o cálculo das distâncias das rotas gravadas no banco, caso existam. Também
neste serviço são atualizadas as descrições dos pontos de rotas salvos que ainda não possuem
32
a descrição da localização. Essa descrição é obtida por meio de uma conexão com o servidor
da Google e necessita de conexão com a Internet.
Figura 5 – Tela splash
Após um segundo, a tela splash é automaticamente fechada e a tela principal da
aplicação é exibida. Nessa tela é apresentado menu de opções básicas para utilização da
aplicação. A Figura 6 apresenta a página principal da aplicação.
33
Figura 6 – Página principal
A tela da página principal é composta por 6 (seis) opções. A primeira delas é a
responsável por iniciar um rastreamento (uma rota) ou continuar uma já existente. Ao
selecioná-la será exibido um componente alert-Dialog no qual serão carregados, em um menu
drop-down, as rotas já salvas, e o usuário poderá selecionar uma rota já existente para
continuar ou iniciar uma nova. Nesse caso, no campo de texto disponível é necessário
informar um nome para a rota e selecionar a opção ‘Criar’. Caso não existam rotas salvas, a
opção continuar é desabilitada. O componente alert-Dialog é exibido na Figura 7.
34
Figura 7 – Alert Dialog de início de captura de rota
Após selecionada a opção Continuar ou a opção Criar Nova, a tela principal é
reapresentada com o ícone da opção Ativo/Inativo em cor verde, representando que o serviço
de captura de rota está em funcionamento. Também é exibido na barra de status do
dispositivo um ícone representando a atividade do sensor GPS (no caso da captura ser via
sensor). A Figura 8 apresenta como é exibida a tela principal quando o rastreamento se
encontra ativo.
35
Figura 8 – Tela principal com rastreador ativo
A segunda opção da página inicial exibe, por meio de uma lista ou ListView, todas as
rotas salvas na base de dados (Figura 9), bem como a informação da distância percorrida de
cada rota.
36
Figura 9 – Lista de rotas
Ao lado de cada rota são disponibilizadas duas opções em forma de botão. O primeiro
botão, com a descrição ‘Ver’, exibe os pontos da rota selecionada em um mapa (Figura 10). O
segundo, com a descrição ‘Excluir’, apresenta uma caixa de mensagem solicitando
confirmação para efetuar a exclusão da rota selecionada.
37
Figura 10 – Exibindo pontos de rota
Na exibição do mapa após selecionar a opção ‘Ver’, são inseridos os pontos da rota
selecionada e, para facilitar a visualização, cada ponto do mapa é interligado com seu
subjacente e subsequente por uma linha. O mapa também possui dois botões de zoom, um
para aumentar e outro para diminuir o nível de zoom de visualização.
No mapa também existe um terceiro botão com a descrição inicial ‘Guiar’. Esse botão
fica visível somente quando nenhuma rota está sendo capturada. A função desse botão é
possibilitar que o usuário possa repercorrer a rota que está sendo visualizada. Ao ser clicado,
sua descrição muda para ‘Parar’ e um novo processo interno é iniciado. Esse processo executa
em paralelo e captura o ponto que o usuário se encontra. Após a captura, esse ponto é inserido
no mapa com uma coloração diferente dos demais marcadores da rota original. Esse processo
de captura dos pontos e adição no mapa fica em execução até que o usuário saia da aplicação
ou selecione a opção ‘Parar’. A Figura 11 apresenta uma rota sendo repercorrida. Nessa tela
podem ser visualizados os marcadores diferenciados.
38
Figura 11 – rota sendo repercorrida
Ao ser visualizada uma rota, selecionando-se um marcador, serão exibidas
informações como, data e hora da captura da posição, descrição do endereço, velocidade
aproximada de deslocamento e a distância do ponto de partida até o ponto selecionado. A
Figura 12 apresenta essas informações em um ponto de uma rota.
39
Figura 12 – Informações de ponto
Na tela principal existem duas opções que exibem o mesmo mapa da Figura 9, ‘Ver
rota atual’ e ‘Ver onde estive’. A opção ‘Ver rota atual’ apresenta a última rota percorrida ou
a rota que está sendo percorrida, sendo que, neste caso, novos pontos que venham a ser
capturados serão automaticamente inseridos ao mapa, possibilitando que o usuário acompanhe
de forma gráfica o deslocamento. Nesse modo não é possível utilizar a opção ‘Guiar’. Já a
opção ‘Ver onde estive’ exibe todos os pontos de rotas percorridas no mapa de uma única vez,
possibilitando visualizar de forma ampla todos os caminhos rastreados. Nessa forma de
visualização também não está disponível a opção ‘Guiar’.
Ainda na tela principal existe uma opção ‘Limpar Dados’, que, quando selecionada,
exibe uma mensagem de confirmação para excluir todas as rotas armazenadas no dispositivo.
Na Figura 13 pode-se visualizar essa mensagem de confirmação.
40
Figura 13 – Exclusão de rotas
Finalizando as opções da tela de menu inicial está a opção de acesso às configurações
do aplicativo. Quando selecionada, uma tela de preferências é exibida como mostra a Figura
14. Nessa tela são realizados ajustes, como distância de captura de posição entre dois pontos,
tempo mínimo entre cada captura, precisão de captura, zoom de visualização inicial do mapa e
início do serviço de rastreamento.
41
Figura 14 – Tela de preferências
4.4 IMPLEMENTAÇÃO DO SISTEMA
Como apresentado na seção 4.3, o aplicativo Minhas Rotas conta com 5 (cinco) telas,
sendo uma tela inicial e uma tela principal com link de acesso para as demais telas
operacionais do sistema.
Quando a tela inicial é apresentada, também é iniciado um serviço que realiza uma
varredura nas rotas armazenadas na base de dados. A listagem 1 apresenta a rotina
responsável por capturar os dados na base de dados SQLite.
List<Rota> retorno = null; DbHelper database = new DbHelper(); try { Cursor cursor = database.rawQuery("select * from Rota " + where, null); retorno = new ArrayList<Rota>(); if(cursor.getCount() == 0 ) return retorno; cursor.moveToFirst();
Rota rs = null; while (cursor.isAfterLast() == false) { rs = new Rota(); rs.setID(cursor.getInt(cursor.getColumnIndex("ID")));
42
rs.setRota(cursor.getString(cursor.getColumnIndex("rota"))); rs.setDistancia(cursor.getDouble(cursor.getColumnIndex("distancia"))); retorno.add(rs);
cursor.moveToNext();
}cursor.close();
}catch (Exception e){ Log.e("erro (BD)","Problema ao recuperar Lista de rotas. \n" + e.getMessage());
e.printStackTrace();
}
Listagem 1 – rotina de captura de dados do banco SqLite
Inicialmente é criado um objeto database do tipo DbHelper. Em seguida é instanciado
um objeto Cursor que receberá os dados resultantes e é, também, iniciado um método
construtor que recebe um parâmetro de contexto proveniente de consulta na base de dados.
Posteriormente esse cursor é percorrido recuperando as rotas e adicionando-as em um list do
tipo Rotas. Esse procedimento de recuperação de rotas do banco SQLite é utilizado em todas
as outras leituras que o aplicativo necessitar fazer e qualquer filtragem necessária será
efetuada pela parametrização contida na variável ‘where’ do procedimento de leitura que está
na Listagem 1.
DbHelper, na listagem 1, é a classe responsável pela manipulação das Data Definition
Language (DDLs) e também é a interface de acesso ao banco de dados. Essa DLL estende
SQLiteOpenHelper que obriga a implementação de dois métodos: onCreate(), método
responsável pela DDL de criação das tabelas do banco de dados e o onUpgrade(), responsável
pelas atualizações da estrutura do banco de dados.
Com os dados das rotas recuperados em uma lista, ela é percorrida recuperando os
pontos de rota relacionados a cada rota em uma leitura semelhante à da listagem 1, porém, na
tabela pontos-Rota. Nessa leitura é passado o parâmetro ‘where’ valorizado com o ID da rota
a ser recuperada.
Após os pontos de rota serem recuperados, é efetuada a leitura deles em ordem de
inserção e por meio do código apresentado na listagem 2 é efetuado o cálculo da distância
entre cada dois pontos da rota, calculando, assim, a distância total da rota percorrida.
private Double calcDistancia(LatLng a, LatLng b){ double distance = 0; Location location = new Location("posicao 1"); location.setLatitude(a.latitude); location.setLongitude(a.longitude); Location location2 = new Location("posicao 2"); location2.setLatitude(b.latitude); location2.setLongitude(b.longitude); distance = location.distanceTo(location2);
return distance; }
Listagem 2 – cálculo da distância entre dois pontos de GPS
43
O cálculo da distância entre os pontos é realizado com o uso da ferramenta Location
que está disponível na API do Google Maps. Ela recebe dois objetos do tipo LatLng (Latitude,
Longitude) e devolve o valor correspondente entre os dois pontos que é a distância em metros.
Ao ler os pontos da rota para efetuar o cálculo da distância, também é verificado se há
descrição da localização, caso não possua, utilizando a API GeoCoder do Google é buscado
nos servidores do Google Maps a descrição do ponto do mapa (listagem 5). Antes de efetuar
essa busca, é verificado se o dispositivo está conectado à rede de dados móveis por meio do
código apresentado na listagem 3.
ConnectivityManager cm = (ConnectivityManager)
atualizaDescricaoService.this.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo nf = cm.getActiveNetworkInfo();
if ((nf == null) ||(!nf.isConnected())) return; Listagem 3 – Verificação de conexão com a rede de dados
Para efetuar essa consulta é necessário solicitar permissão de acesso às propriedades
do dispositivo pela adição ao arquivo Manifest.xml com o código apresentado na listagem 4.
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> Listagem 4 – Permissão de verificação de conexão com a rede
A listagem 5 apresenta o uso da API GeoCoder do Google para buscar nos servidores
do Google Maps a descrição de pontos no mapa.
Geocoder con = new Geocoder(atualizaDescricaoService.this, Locale.getDefault());
try { List<Address> enderecos =
con.getFromLocation(pontosRota.getLatitude(), pontosRota.getLongitude(),
1);
Address local = enderecos.get(0);
if(local.getAddressLine(0) != null) pontosRota.setDescLocalizacao(local.getAddressLine(0) + "\n"); if(local.getAddressLine(1) != null) pontosRota.setDescLocalizacao(pontosRota.getDescLocalizacao() +
local.getAddressLine(1) + "\n"); if(local.getAddressLine(2) != null) pontosRota.setDescLocalizacao(pontosRota.getDescLocalizacao() +
local.getAddressLine(2).toString());
if(local.getAddressLine(3) != null) pontosRota.setDescLocalizacao(pontosRota.getDescLocalizacao() + " - " + local.getAddressLine(3)); break; } catch (Exception e) { Log.e("Service ", "Erro ao buscar dados no GEOCODER \n" + "Latitude " + pontosRota.getLatitude()+ "Longitude " + pontosRota.getLongitude() + "\n"); e.printStackTrace();
}
Listagem 5 – Busca de dados de localização com Geocoder API
44
Quando todos os pontos da rota foram percorridos, o sistema efetua a persistência dos
dados novamente na base de dados com as distâncias de rota atualizadas e a descrição dos
pontos de rotas atualizados. A listagem 6 apresenta a rotina de gravação dos dados da rota no
banco de dados. A atualização dos pontos de rota ocorre de forma semelhante.
try{ ContentValues contentValues = new ContentValues(); contentValues.put("distancia", rs.getDistancia().toString()); database.update("Rota", contentValues, " ID = ? ", new String[]{"" + rs.getID()});
}catch (Exception e){ Log.e("ERRO (BD)","PROBLEMA AO ATUALIZAR ROTA!! \n" + e.getMessage()); }
Listagem 6 – Update de uma rota na base de dados
O processo descrito no parágrafo anterior ocorre de forma assíncrona por meio da
instanciação de um serviço, que não gera travamento da aplicação enquanto é executado. A
tela inicial executa a chamada desse serviço e em seguida, abre a tela principal da aplicação
em paralelo com a execução do serviço.
A tela principal da aplicação é desenhada utilizando um leiaute do tipo ListView. O
sistema possui modelos de lista pré-definidas, porém esses modelos são interfaces limitadas
em termos de recursos. Por isso a tela principal foi desenhada utilizando métodos
personalizados com a criação de um componente do tipo Adapter, possibilitando maior
flexibilidade na adição de componentes à tela de listagem. O componente Adapter
desenvolvido é apresentado na listagem 7.
public MenuInicialAdapter(Context context, MatrixCursor cursor, Boolean ativo) { this.context = context; this.cursor = cursor; this.ativo = ativo; inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() { return cursor.getCount(); @Override
public Object getItem(int position) { cursor.moveToPosition(position); return cursor; } @Override
public long getItemId(int position) { cursor.moveToPosition(position); return cursor.getInt(0); } @Override
public View getView(final int position, View convertView, ViewGroup parent) {
View elemento_lista = inflater.inflate(R.layout.menu_inicial, null); setView(elemento_lista);
TextView tvOpcao = (TextView)
elemento_lista.findViewById(R.id.tvOpcao);
TextView tvDescricao = (TextView)
elemento_lista.findViewById(R.id.tvDescricao);
45
ImageView ivIcon = (ImageView)
elemento_lista.findViewById(R.id.ivIcon);
cursor.moveToPosition(position); tvOpcao.setText(cursor.getString(1)); tvDescricao.setText(cursor.getString(2)); if(cursor.getDouble(0) == 1 && ativo) ivIcon.setImageResource(R.drawable.gps_on);
else if (cursor.getDouble(0) == 2 ) ivIcon.setImageResource(R.drawable.lista_rotas);
else if (cursor.getDouble(0) == 3 ) ivIcon.setImageResource(R.drawable.ver_rota);
else if (cursor.getDouble(0) == 4 ) ivIcon.setImageResource(R.drawable.todos_pontos);
else if (cursor.getDouble(0) == 5 ) ivIcon.setImageResource(R.drawable.lixeira);
else if (cursor.getDouble(0) == 6 ) ivIcon.setImageResource(R.drawable.config);
return elemento_lista; }
Listagem 7 – Adapter personalizado
A construção de um Adapter é realizada com o uso de uma classe que estenda
BaseAdapter, que obriga a implementação de quatro métodos e um construtor. Os Métodos
são: getCount() que retorna a quantidade de itens da listagem; getItem() que pode retornar um
índice do item selecionado ou nesse caso um objeto que representa o item selecionado;
getItemId() que retorna um identificador do tipo índice que representa a posição do item
selecionado na lista; e o método principal do Adapter, getView(). É nesse método que o
leiaute de cada item da lista é desenhado e cada componente é inserido na sua devida posição,
com a ajuda de um eXtensible Markup Language (XML) de leiaute. Esse método é chamado
na inserção de cada item da lista.
Ao visualizar a tela principal o usuário tem várias opções. Ao selecionar uma delas, o
sistema identifica, por meio de um método da lista de opções, qual opção foi selecionada.
Esse método pode ser visto na listagem 8.
protected void onListItemClick(ListView l, View v, int position, long id) {
MatrixCursor campos = (MatrixCursor) l.getItemAtPosition(position);
String acao = campos.getString(3);
switch (acao) { case "OnOff": iniciaRastreio();
break; case "viewListaRotas": buscaPreferencias(pref); if(rota.getID().equals(0)){ Toast.makeText(this , "Nenhuma rota foi encontrada!!", Toast.LENGTH_SHORT).show();
return; }
Intent listaRotas = new Intent(this, ListaRotasActivity.class);
46
startActivityForResult(listaRotas, 1);
break; case "verRota": verPontosMapa(rota); break; case "verTodasRotas": verPontosMapa(null); break; case "limpaRotas": limparDados();
break; case "Config": verConfiguracoes();
break; default: Toast.makeText(this, "Atenção!! \n Opção não configurada!!", Toast.LENGTH_SHORT).show(); }
}
Listagem 8 – Método de captura de opção selecionada
Quando selecionada a primeira opção (Ativo/Inativo) o sistema exibe uma tela do tipo
AlertDialog na qual o usuário poderá selecionar uma rota já existente ou criar uma nova rota.
A rotina de carga das rotas existentes é a mesma apresentada na listagem 1. A listagem 9
apresenta o código responsável por inserir as rotas recuperadas no componente Spinner
inserido no alertDialog.
final Spinner spRotas = (Spinner) myDialog.findViewById(R.id.spRotas); spRotas.setPrompt("ROTAS"); List<Rota> ListaRotas = new ArrayList<Rota>(); List<String> ListaSpinner = new ArrayList<>(); ListaRotas = (List) db.RecuperaRotas(""); if(ListaRotas.size() > 0) for(Rota c : ListaRotas) { ListaSpinner.add(c.getRota());
}
Listagem 9 – Adição de item em componente Spinner
No alertDialog também está disponível um componente do tipo Text, no qual o
usuário poderá inserir um nome para uma nova rota. Ao selecionar o botão ‘Criar’, a nova
rota será inserida no banco de dados por meio da rotina apresentada na listagem 10.
public boolean incereRota(Rota rs) throws Exception{ ContentValues contentValues = new ContentValues(); contentValues.put("rota", rs.getRota()); contentValues.put("distancia", rs.getDistancia()); database.insert("Rota", null, contentValues); return true; }
Listagem 10 – Inserção de nova rota
Após a inserção da rota ou a seleção de uma rota já existente, o sistema inicia um novo
serviço, que será responsável por capturar os dados de posição GPS e persistir no banco de
47
dados vinculando-os à rota criada ou selecionada. A listagem 11 apresenta a chamada desse
serviço pelo uso de Intent com passagem de parâmetros.
String provider = Settings.Secure.getString(getContentResolver(),
Settings.Secure.LOCATION_PROVIDERS_ALLOWED
);
if ((provider == null) || (provider.length()) == 0){ Toast.makeText(this , "ATENÇÃO !! \n GPS não esta ativo!! \n " + "Ative-o para iniciar a captura dos dados!!", Toast.LENGTH_LONG).show();
//chamada da tela de config. para usuario ativar GPS
Intent intent = new Intent(Settings.ACTION_LOCATION_SOURCE_SETTINGS);
startActivityForResult(intent, 1);
}
Intent intent = new Intent(PrincipalActivity.this,RastreioService.class); intent.putExtra("status", status); intent.putExtra("idRota", rota.getID()); startService(intent);
}
Listagem 11 – Chamada do serviço de captura de pontos GPS
Pode-se verificar, ainda na listagem 11, a presença de um código responsável por
verificar se o sensor GPS do dispositivo está ativo. Caso não esteja, a tela de configuração do
dispositivo é aberta para que o usuário possa efetuar a sua ativação. Sem esse sensor ativo, a
captura dos dados de posição pelo sinal GPS não é possível. Ao final do código está o Intent
responsável por iniciar o serviço de captura por meio do código startService(intent). Nota-se,
ainda, que antes são passados dois parâmetros para o serviço: um deles é o ID da rota
selecionada o outro é o status do rastreamento. E por meio dessa chamada que o serviço será
iniciado ou parado, de acordo com o valor passado como parâmetro.
Um serviço é uma classe que estende Service e, esse precisa estar declarado no
arquivo Manifest.xml para que ele se comporte como um serviço. Normalmente, o próprio
Android verifica que a classe está sendo estendida e adiciona essa declaração ao manifest.
Ao iniciar o serviço, um método chamado onStartCommand é executado. Esse método
recebe um Intent por parâmetro e é por meio desse Intent que os parâmetros vindos da tela
principal são recuperados. Esse é o método principal de troca de informações entre telas e
serviços ou entre duas telas no Android. A listagem 12 apresenta o método onStartCommand.
public int onStartCommand(Intent intent, int flags, int startId) { try { paraGPS(); } catch (Exception e) { e.printStackTrace();
}
status = intent.getBooleanExtra("status" , false); idRota = intent.getIntExtra("idRota" , 1); if (status){ SharedPreferences.Editor editor = pref.edit();
48
editor.putInt("idRotaAtual", idRota); editor.commit();
iniciaRastreamento();
else{ locationManager.removeUpdates(locationlistener); locationManager = null; locationlistener = null; stopSelf();
}
return flags; }
Listagem 12 – onStartCommand
Ainda na listagem 12 pode-se verificar a gravação do id da rota em um componente
SharedPreferences. Esse componente trata das preferências do usuário e pode ser acessado de
qualquer tela da aplicação sendo que seus dados não são excluídos caso a aplicação seja
encerrada. Ainda pode-se verificar a validação se o rastreamento será iniciado ou encerrado,
de acordo com o parâmetro recebido anteriormente. Para que a classe possa fazer a captura
dos dados GPS, ela deve estender LocationListener. Essa extensão do método obriga a
implementação de quatro métodos, sendo que apenas um deles foi utilizado no projeto. O
método utilizado é o onLocationChanged(). Na listagem 13 está o método
iniciaRastreamento() que dá início ao processo assíncrono de captura dos dados do GPS.
locationManager=(LocationManager)getSystemService(Context.LOCATION_SERVICE); //PEGO O STATUS DE REDE
isGPSEnabled = locationManager.isProviderEnabled( LocationManager.GPS_PROVIDER);
if(!isGPSEnabled) isNetworkEnabled = locationManager.isProviderEnabled( LocationManager.NETWORK_PROVIDER);
if (isGPSEnabled || isNetworkEnabled){ locationlistener = this; if (isGPSEnabled) { locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, intervaloBusca, distanciaDesloc, (LocationListener) this); } else if (isNetworkEnabled) { if (ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION) !=
PackageManager.PERMISSION_GRANTED &&
ActivityCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) !=
PackageManager.PERMISSION_GRANTED) return; locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, intervaloBusca, distanciaDesloc, (LocationListener) this); }
}
Listagem 13 – Início do serviço de captura de dados GPS
Inicialmente é instanciado um objeto do tipo locationManager como apresentado na
listagem 13. Ele é o responsável por todo o processo de gerenciamento e captura dos dados.
Em seguida é recuperado se o sistema GPS está disponível e operante bem como os dados da
49
disponibilidade de captura de posição via sinal de rede móvel. Em seguida é verificado se um
dos serviços está ativo e disponível, preferencialmente via sinal GPS, e o gatilho de início é
acionado por meio do requestLocationUpdates. Nesse gatilho são informados os parâmetros
de intervalo de tempo de captura mínimo das posições e a distância mínima entre duas
posições capturadas. Para que a captura dos dados seja possível é necessário solicitar
permissão no arquivo de manifest.xml para obter os dados de localização. A listagem 14
apresenta essa solicitação de permissão.
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
Listagem 14 – Solicitação de permissão de captura de geoposição
Após o disparo da captura dos dados, o sistema aguarda, por meio do método de
escuta onLocationChanged() o retorno de captura de pontos de GPS. Esse método recebe por
parâmetro um objeto Location, que possui os dados da posição capturada, como latitude,
longitude, altitude, velocidade de deslocamento e precisão da captura. Esses dados são
coletados e armazenados em um objeto do tipo pontos_rota. Ainda nessa etapa são executados
os códigos das Listagens 3 e 5 a fim de recuperar os dados descritivos da posição junto ao
servidor do Google. Ao final desse processo, os dados são persistidos na base de dados SqLite
com o uso de um procedimento semelhante ao apresentado na listagem 10, tudo isso por meio
de uma thread paralela, para que o sistema possa voltar e escutar novamente o método
onLocationChanged() e processar novos dados sem que o desempenho da aplicação seja
afetado. A listagem 15 apresenta o método onLocationchanged().
private void ProcessaPosicao(Location location) { if (location == null) return; if (location.getAccuracy() > precisao) return; pontos_Rota rs = new pontos_Rota(); rs.setId_rota(idRota); rs.setLatitude(location.getLatitude());
rs.setLongitude(location.getLongitude());
rs.setAltitude(location.getAltitude());
rs.setVelocidade(0);
rs.setDescLocalizacao(""); rs.setPrecisao((double) location.getAccuracy()); rs.setVelocidade((location.getSpeed()*3600)/1000);
rs.setDescLocalizacao(buscaDescricaoLocalizacao(location.getLatitude()
,location.getLongitude());
}
new gravaPonto().execute(rs); rs = null;
}
Listagem 15 – Método onLocationchanged()
A listagem 16 apresenta a thread de chamada de gravação do ponto de rota.
50
class gravaPonto extends AsyncTask<pontos_Rota ,Void,String > { @Override
protected String doInBackground(pontos_Rota... params) { db.incerePontos_Rota(params[0]);
return ""; }
}
Listagem 16 – Thread de gravação
Quando o usuário solicita a visualização de uma rota, uma nova tela do aplicativo é
chamada por meio de uma Intent. Essa Intent é semelhante à apresentada na listagem 11 e
passa dois parâmetros para a outra tela: ID da rota e o status de rastreamento. Quando a tela
de apresentação do mapa é aberta, os parâmetros da Intent são recuperados e com o ID da
rota, os seus pontos são carregados do banco de dados com o uso de uma rotina semelhante à
apresentada na listagem 2. Para que o mapa possa ser exibido é preciso que a activity possua
um componente visual do tipo Map e um objeto do tipo GoogleMap, além de implementar
OnMapReadyCallback. Esse, por sua vez, obriga a implementação do método
onMapaReady(), que é o responsável por atribuir o mapa ao componente de tela e atribuir as
configurações do mapa. Na listagem 17 pode-se visualizar o método onMapaReady().
@UiThread
public void onMapReady(GoogleMap googleMap) { mMap = googleMap; mMap.setMapType(GoogleMap.MAP_TYPE_HYBRID);
mMap.setOnMarkerClickListener(new GoogleMap.OnMarkerClickListener(){
public boolean onMarkerClick(Marker marker){ pos = marker.getPosition(); return false; }
});
mMap.setInfoWindowAdapter(new GoogleMap.InfoWindowAdapter() { @Override
public View getInfoWindow(Marker marker) { return null; }
@Override
public View getInfoContents(Marker marker) { TextView tvTexto = new TextView(RotasActivity.this); tvTexto.setText(Html.fromHtml("<b><font color=\"#ff0000\">" + marker.getTitle() + "</font> </b> <br>" + marker.getSnippet() )); return tvTexto; }
});
}
Listagem 17 – Método onMapaReady()
Após a execução do método onMapaReady, são inseridos no mapa os pontos
recuperados da base de dados. A listagem 18 apresenta a rotina de inserção desses dados no
mapa para visualização.
51
lastPosition = null; primeiro = null; if (lst.size() == 0) return; ultimo = new LatLng(((pontos_Rota) lst.get(lst.size() -1)).getLatitude(),((pontos_Rota) lst.get(lst.size() -1)).getLongitude());
if (lst != null) { for(pontos_Rota c : lst) { pos = new LatLng(c.getLatitude(), c.getLongitude()); MarkerOptions op = new MarkerOptions().position(pos) .title("Dados do ponto selecionado.") .snippet("<br>Local = " + c.getDescLocalizacao() + "<br>Velocidade : " + c.getVelocidade() + "Km/h."); if(id_Rota > 0) { if(primeiro == null) { op.icon(BitmapDescriptorFactory.fromResource(R.drawable.saida));
primeiro = pos; }
if(pos.equals(ultimo)) op.icon(BitmapDescriptorFactory.fromResource(R.drawable.chegada));
if (lastPosition != null) { distancia += calcDistancia(lastPosition,pos); op.snippet( "Data / Hora : " + c.getDataHora() + "<br>Distância percorrida : "+String.format("%.2f",distancia)+ " Mts."+ "<br>Tempo gasto : "+ calculaTempoGasto(tempoInicial,c.getDataHora()) + "<br>Altitude : " + c.getAltitude() + " Mts." + "<br>Local : " + c.getDescLocalizacao() + "<br>Velocidade : " + c.getVelocidade() + " Km/h."); Polyline line = mMap.addPolyline(new PolylineOptions() .add(lastPosition, pos) .width(5)
.color(Color.BLUE));
}
lastPosition = pos; }
mMap.addMarker( op ); }
if (id_Rota > 0) { Rota rt = new Rota(); rt.setID(id_Rota); rt.setDistancia(distancia); db.atualizarRota(rt); Polyline line = mMap.addPolyline(new PolylineOptions() .add(primeiro, lastPosition) .width(5)
.color(Color.YELLOW));
}
}
if (pos != null) { mMap.moveCamera(CameraUpdateFactory.newLatLngZoom(pos, zoom)); }
else return;
Listagem 18 – Inserindo pontos e linhas no mapa
Na listagem 18 pode-se verificar o uso do metodo calculaTempoInicial(), o qual
recebe dois paramatros do tipo texto contendo a data e a hora inicial e final no formato dd-
MM-yyyy-HH-mm-ss, esse metodo faz o calculo do tempo gasto entre os dois parametros e
retorna o tempo para ser exibido no ponto. A listagem 19 apresenta esse metodo.
52
public static String calculaTempoGasto(String horaInicial, String horaFinal) {
String retorno = "00:00:00"; try { SimpleDateFormat sdf = new SimpleDateFormat("dd-MM-yyyy-HH:mm:ss");
if (horaInicial.equals("")){ horaInicial = horaFinal;
setTempoInicial(horaFinal);
}
Calendar calInicial = Calendar.getInstance();
Calendar calFinal = Calendar.getInstance();
calInicial.setTime(sdf.parse(horaInicial));
calFinal.setTime(sdf.parse(horaFinal));
long segundos = (calFinal.getTimeInMillis() - calInicial.getTimeInMillis()) / 1000;
long horas = segundos / 3600; long minutos = (segundos % 3600) / 60; segundos = (segundos % 3600) % 60;
retorno = String.valueOf(horas) + "Hs, " + String.valueOf(minutos) + "Min, " + String.valueOf(segundos) + "Sec."; } catch (Exception e) { e.printStackTrace();
}
return retorno; }
Listagem 19 – calculo de distância entre pontos
Ainda na listagem 18 pode-se verificar a inserção de componentes do tipo polyline.
Esses componentes são linhas que ligam dois pontos no mapa e ao final pode-se verificar a
chamada para o método moveCamera, responsável por direcionar e centralizar o foco no
último marcador inserido no mapa, aplicando um nível de zoom pré-configurado na tela de
preferências.
Após a inserção dos pontos da rota no mapa, o aplicativo verifica, por meio do outro
parâmetro recebido, se o rastreador está ativo. Significando, assim, que novos pontos serão
capturados para a rota e esta deverá ser atualizada. Se o rastreador estiver ativo, o sistema
remove a opção de repercorrer a rota que está disponível na tela e inicia uma thread
responsável por recuperar os novos pontos e atualizar o mapa. A listagem 20 apresenta essa
validação.
if((id_Rota == 0) || RastreadorAtivo){ btGuiar.setEnabled(false); btGuiar.setVisibility(View.INVISIBLE); }
if (atualizarMapa) atualizaMapa();
Listagem 20 – validação de atualização de mapa
Caso o rastreador não esteja ativo, então o usuário terá disponível na tela um botão
‘Guiar’, que ao ser selecionado iniciará uma rotina de captura de posições GPS, semelhante à
53
rotina apresentada nas listagens 12 e 13. A rotina irá capturar a posição do usuário e exibir
marcadores diferenciados no mapa para que o usuário possa localizar-se e identificar qual
direção deverá tomar para repercorrer a rota sendo exibida no mapa.
Na tela principal, o usuário também tem uma opção para visualizar a lista de rotas.
Essa lista recupera todas as rotas salvas e apresenta, por meio de um Adapter personalizado,
semelhante ao da tela principal já descrito anteriormente, em uma lista as rotas disponíveis
com um botão ‘Ver’ e outro ‘Excluir’ ao lado de cada rota. Ao selecionar o botão ‘Ver’, o
mapa descrito anteriormente nas listagens 17 e 18 será exibido, caso a opção selecionada seja
a ‘Excluir’, um alertDialog será apresentado, solicitando confirmação de exclusão e, caso seja
confirmado, a rotina de exclusão da rota será executada. E os pontos da rota também são
excluídos por meio de uma rotina semelhante a que exclui o registro da rota. A listagem 21
apresenta o componente AlertDialog e a rotina de exclusão do registro da base de dados e
também da listagem de rotas.
AlertDialog.Builder builder = new AlertDialog.Builder(context); builder.setTitle("Confirma exclusão"); builder.setMessage("Deseja realmente excluir a rota selecionada ??"); builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) { new DeletaRotaBase().execute(((Rota) getItem(position)).getID());
if (((Rota) getItem(position)).getID()> 0){ query += " ID = " + ((Rota) getItem(position)).getID(); }
else query = " ID > 0"; try { deletaPontosRota(query);
database.delete("Rota", query, null) ; }catch (Exception e){ Log.e("ERRO (BD)", "Problema ao deletar rota !! /n" + e.getMessage());
return false; }
rotas.remove(position); Toast.makeText(context , "Exclusao feita com sucesso!! ", Toast.LENGTH_SHORT).show();
atualizarLista(rotas); }
});
builder.setNegativeButton("Não", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface arg0, int arg1) { return; }
});
alerta = builder.create(); alerta.show(); Listagem 21 – Exclusão de rotas
54
Na tela principal, o usuário também tem disponível uma opção ’Limpar dados’. Essa
opção executa a mesma rotina apresentada na listagem 21, porém sem parâmetro de ID de
rota, excluindo todas as rotas salvas.
Por último, na listagem de opções da tela principal está a opção ‘configurações’ que,
ao ser selecionada, exibe uma nova tela na qual podem ser realizadas algumas configurações
do sistema. A nova tela também é aberta com o uso de um Intent sem parâmetros. A activity
aberta estende PreferenceActivity, que, por definição, salva em SharedPreference todos os
dados que são informados nos campos apresentados usando um arquivo de leiaute. Esse
arquivo de leiaute é diferenciado dos arquivos normais de outras activities. Ele utiliza como
definidor de leiaute um PreferenceScreen e suas opções de configurações podem ser
separadas em categorias por meio das Tags PreferenceCategory. A listagem 22 apresenta o
arquivo de leiaute de preferências.
<?xml version="1.0" encoding="utf-8"?>
<PreferenceScreen
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<PreferenceCategory
android:title="Preferências do rastreador"
android:key="pref_Maps">
<CheckBoxPreference
android:key="GPS_Status"
android:textIsSelectable="true"
android:title="GPS Ativo/Inativo"
android:checked="false"
/>
<EditTextPreference
android:key="DistanciaIntervaloCaptura"
android:title="Distância de atualização GPS em Mts."
android:inputType="number"
android:defaultValue="10"/>
<EditTextPreference
android:key="PrecisaoGPS"
android:title="Precisão do GPS"
android:inputType="number"
android:defaultValue="10"/>
</PreferenceCategory>
</PreferenceScreen>
Listagem 22 – Layout de preferências
55
A listagem 23 apresenta como as preferências podem ser recuperadas em outras
actiivities.
SharedPreferences pref =
PreferenceManager.getDefaultSharedPreferences(getBaseContext());
RastreioAtivo = pref.getBoolean("GPS_Status", false); Integer id = pref.getInt("idRotaAtual",0);
Listagem 23 – Recuperando dados de preferências
56
5 CONCLUSÃO
Com o desenvolvimento do aplicativo, resultado da realização deste trabalho, foi
possível utiliza vários recursos disponíveis na plataforma mobile, como: sensores de
acelerômetro e giroscópio que são muito utilizados na área de jogos, players de mídias;
sensores magnéticos que são utilizados na construção de bússolas, mapas e jogos, dentre
outras aplicabilidades.
Sobre a tecnologia de mapas utilizada na aplicação, o sensor utilizado foi o de GPS.
Esse sensor pode ter várias outras áreas de aplicação, como localizadores de dispositivos
perdidos, rastreamento de pessoas e veículos, captura de áreas e locais. Utilizado para
finalidades como direcionamento de propaganda, registro de localização do cliente em
compras eletrônicas e, até mesmo, a construção de um sistema GPS. Esse sistema é
semelhante ao dos dispositivos GPS disponíveis para cálculos de rotas e auxílio de
deslocamento. Porém, com a vantagem de ser uma ferramenta disponível em um celular, não
necessitando de um dispositivo especifico que desenvolve a função única de roteamento de
GPS para deslocamento e orientação.
Em projetos para dispositivos móveis, um dos maiores desafios está no
desenvolvimento do leiaute das telas de forma que sejam aplicáveis às mais variadas
dimensões e resoluções de dispositivos (computadores, notebooks, tablets, smartphones e
outros) comercializadas.
Outro grande desafio está voltado para o desenvolvimento de lógicas de aplicação de
forma que o dispositivo, ao executar qualquer funcionalidade, não trave ou até mesmo aborte
a aplicação.
Por meio do desenvolvimento deste projeto foi possível adquirir aprendizado no uso
de mapas em aplicações mobile. Além disso, adquiriu-se conhecimento no uso de serviços e
rotinas paralelas na plataforma mobile. Esse é um aprendizado significativo na construção de
componentes de apresentação de dados em tela de forma personalizada, possibilitando
aplicativos com recursos de telas específicos e direcionados a um público alvo específico.
Buscando, assim, facilidade e segurança na utilização da aplicação, o que agrega valor, tanto
para aplicação como para o conhecimento do desenvolvedor.
Com o crescente uso de dispositivos móveis aliado à praticidade de seu uso e com a
disponibilidade dos mais variados tipos de sensores integrados, o mercado de aplicações
mobile é visivelmente crescente e promissor.
57
Em termos de funcionalidades, o aplicativo desenvolvido atende aos objetivos
propostos. Como implementações futuras, complementares ao que foi desenvolvido, está o
armazenamento de rotas em um servidor web e a possibilidade de busca de rotas nesse
servidor. Assim, rotas que representam trilhas, caminhos, estradas e outros trechos percorridos
podem ser compartilhados entre os usuários do aplicativo.
58
REFERÊNCIAS
ANDROID DEVELOPER. Android, the world’s most popular mobile platform. 2012. Disponível em: <https://developer.android.com/about/android.html>. Acesso em: 09 jun. 2017.
ANDROID DEVELOPER. Dashboards. 2016. Disponível em: <https://developer.android.com/about/dashboards/index.html>. Acesso em: 09 jun. 2017.
CHA, Sangwhan; BERND, Kurz, J.; DU, Weichang. Toward a unified framework for mobile applications. IEEE Computer Society, p. 209-216, 2009.
CNOVA MARKTPLACE. Crescimento do mercado Mobile no Brasil e no mundo. Disponível em: <http://marketplace.br.cnova.com/artigo/crescimento-do-mercado-mobile-no-brasil-e-no-mundo/>. Acesso em: 08 abr. 2017.
EICHLER, G.; LUKE, K.-H.; REUFENHEUSER, B. Context information as enhancement for mobile solutions and services. 13th International Conference on Intelligence in Next Generation Networks, Bordeaux, v. 1, n. 1, p.1-5, out. 2009.
GIULIANI, Camila; SOARES, Fernanda. 24 horas conectados, sete dias por semana. 2012. Disponível em: <http://impressaodigital126.com.br/?p=6411>. Acesso em: 08 abr. 2017.
GLOBAL ICT DEVELOPMENTS. Report on global mobile-cellular subscriptions by ITU Statistics. Diponível em: <http://www.itu.int/ITUD/ict/statistics/explorer/index.html>. Acesso em: 05 fev. 2017.
GUANA, Victor; ROCHA, Fabio; HINDLE, Abram; STROULIA, Eleni. Do the stars align? multidimensional analysis of android’s layered architecture. In: Conference on Mining Software Repositories, 2012, p. 124-127.
JORDÃO, Fábio. Android e iOS totalizam 92,3% das vendas de smartphones. 2013. Disponível em: <https://www.tecmundo.com.br/pesquisa/39799-android-e-ios-totalizam-92-3-das-vendas-de-smartphones.htm>. Acesso em: 11 abr. 2017.
JORDÃO, Fabio. Mobile web apps vs. mobile native apps: how to make the right choice. 2012. Lionbridge. Disponível em: <www.lionbridge.com/files/2012/.../Lionbridge-WP_MobileApps2.pdf>. Acesso em: 25 abr. 2017.
KARADIMCE, Aleksandar, BOGATINOSKA, Dijana Capeska. Using hybrid mobile applications for adaptive multimedia content delivery. In: MIPRO 2014, 2014, p. 686-691.
LIONBRIDGE, Mobile web apps vs. mobile native apps: how to make the rigt choice. White paper. 2012, p. 2-13. Disponível em: <http://www.lionbridge.com>. Acesso em: 20 mai. 2017.
59
MAJI, Amiya Kumar; HAO, Kangli; SULTANA, Salmin; BAGCHI, Saurabh. Characterizing failures in mobile OSes: a case study with Android and Symbian. In: The International Symposium on Software Reliability Engineering (ISSRE), p. 249–258, 2010.
MOBILE TIME. 1,5 bilhão de smartphones vendidos no mundo em 2016. 2017a. Em <http://www.mobiletime.com.br/16/02/2017/1-5-bilhao-de-smartphones-vendidos-no-mundo-em-2016/466463/news.aspx>. Acesso em: 20 fev. 2017.
MOBILE TIME. Android passa Windows em tráfego online no mundo. 2017b. Em <http://www.mobiletime.com.br/03/04/2017/android-passa-windows-em-trafego-online-no-mundo/468966/news.aspx>. Acesso em: 06 abr. 2017.
MORIMOTO, E. CARLOS. Receptores GPS e triangulação de sinal. São Paulo, nov. 2010. Seção Dicas. Disponível em: <http://www.hardware.com.br/dicas/gps-triangulacao.html>. Acessado em: 08 mai. 2011.
NAGESH, Anirudh; CAICEDO, Carlos E. Cross-platform mobile application development. In: 10th Annual Conference on Telecommunications and Information Technology. Disponível em: <http://www.academia.edu/4233075/Cross-Platform_Mobile_Application_Development>. Acesso em: 04 mar. 2017.
PAVLIĆ, Daniel; PAVLIĆ, Mile; JOVANOVIĆ, Vladan. Future of internet technologies. In: 35th International Convention of Information Communication Technology, Electronics and Microelectronics (MIPRO 2012), mar 2016, p. 1377-1371.
SIGNIFICADOS. Significado de Android. Disponível em: <https://www.significados.com.br/android/>. Acesso em: 9 abr. 2017.
SINGH, Kapil. Practical Context-aware permission control for hybrid mobile application. research in attacks, intrusions, and defenses. p. 307-327, 2013.
TENG, Chia-Chi; HELPS, Richard. Mobile application development: essential new directions for IT. In: 7th International Conference on Information Technology: New Generations (ITNG), April 2010, p. 471-475.
UNHELKAR, Bhuvan, MURUGESAN, San. The enterprise mobile applications development framework. EEE Computer Society, 2010, p. 33-39.