• Aucun résultat trouvé

5.2.4 Funcionalidades

5.2.4.1 Ecrã inicial

Como se pode ver pela Figura4.8b, a identificação do ser vivo é visualizada através de vários ícones que se encontram organizados através de uma GridLayout.

5.2.4.2 Informação acerca do ser vivo encontrado

A biblioteca utilizada para armazenar os dados (Sugar ORM) não suporta o armazenamento de listas, pelo que a localização obtida da base de dados em forma de string é convertida para um objetoJSON e consequentemente cada um destes elementos (pontos geográficos) são adicionados a uma lista do mesmo tipo. Procedeu-se de forma similar para obter as fotos associadas ao avistamento.

Com o intuito de salvaguardar possíveis erros, todas as imagens adiconadas nos avistamentos são copiadas para uma pasta criada na memória do dispositivo móvel de baixo de Pictures /bio_app. De maneira a permitir a diferenciação das fotos adicionadas nesta pasta, é na altura do armazenamento que o nome do ficheiro criado é definido através do métodoSystem. currentTimeMillis (). Ficando assim o nome do ficheiro com a data atual em milissegundos. As imagens tiradas através da câmara do dispositivo são igualmente guardadas nesta pasta com nome da sintaxe idêntica, servindo esta pasta criada como um repositório de imagens para a aplicação separada da galeria do utilizador. Com o intuito de saber quais as imagens que fazem parte de um avistamento, recorreu-se a uma lista de strings onde fica guardado o caminho de cada imagem adicionada.

Dada a existência de um elevado número de espécies, a identificação prévia do tipo de animal, planta ou fungo permite reduzir este número de forma significativa. Existindo uma base de dados para cada tipo de espécie que vai ser utilizada para popular este campo de completação automática.

De maneira a importar e utilizar bases de dados externas foi utilizada uma classe específica definida no Android, também conhecida porSQLiteAssetHelper. Esta classe permite utilizar uma base de dados SQLite já existente em toda a aplicação. Existem duas classes diferentes que se destinam a abrir e consultar uma base de dados: OpenHelper e DatabaseAccess. Para diferenciar o acesso às diferentes bases de dados adicionou-se o prefixo da base de dados em causa (e.g., floraPortugalOpenHelper). A primeira classe extendeSQLiteAssetHelper, conseguindo assim fornecer

5.2. Aplicação Android 67 um construtor com o nome do ficheiro SQLite presente na estrutura do projeto e a versão da base de dados. Já o segundo, destina-se a criar o objeto definido na primeira classe e a devolver a instância da base de dados para além abrir e fechar a conexão à mesma. É também aqui que são criados os métodos responsáveis por executar queries à base de dados e retornar os resultados destas pesquisas. Para que a classe SQLiteAssetHelper consiga aceder aos ficheiros SQLite, estes têm de estar guardados num caminho específico (e.g., assets /databases/FloraPortugal . sqlite)

Relativamente ao mapa, este é criado recorrendo à biblioteca disponibilizada pelo Open Street Maps (osmdroid). O nível máximo de zoom é determinado pela tile source utilizada. A tile source determina qual o conjuto de imagens a ser exibido podendo este ser Bing, Mapquest, Mapnik. Caso exista conexão à Internet, o mapa é descarregado online adquirindo assim uma melhor qualidade. Nesta situação a tile source descarregada é a MAPNIK que assume um zoom máximo de 18. No caso de não ser possível esta ligação, o mapa é carregado da memória do dispositivo móvel. Para reduzir o tamanho dos mapas a serem utilizados de forma offline considerou-se apenas zoom entre 16 e 18. Foi necessário criar uma custom mapView de forma a mostrar ao utilizador o mapa que por sua vez estende a classe Overlay. É na classe MapOverlay que estende esta última que são definidas as acções para o clique simples, duplo bem como o arrastar de marcadores. Enquanto a localização não for conseguida, o Android está sempre à escuta de novas alterações onde a sua posição se tenha alterado em 1 metro e que tenha passado pelo menos 100 milissegundos da última posição obtida. Neste momento é cancelado o pedido de novas posições. Quando se identifica a área através de polígonos, de maneira a saber qual dos pontos é que se está a arrastar, os marcadores encontram-se identificados por um número único. Assim ao alterar a posição do segundo marcador, apenas este vai ser atualizado. Todos os pontos inseridos ficam armazenados numa lista de GeoPoint.

Para armazenar os dados do avistamento, dada a utilização de duas listas para guardar as imagens e os pontos da localização, é necessário converter estas numa string. No caso da localização, sabendo que um ponto (Geopoint) contém informação da latitude, longitude e altura, foi necessário converter a lista com estes pontos em formato JSONe só depois passar para string. Para fazer a representação do objeto em formato JSON foi utilizada a biblioteca GSON do Java.

5.2.4.3 Gestão de eventos e avistamentos

Os campos de completação automática são inseridos através de uma AutoCompleteTextView. Depois de selecionado um determinado evento é mostrada a lista com os avistamentos referentes ao evento anteriormente escolhido. Os avistamentos são mostrados através de uma ListView onde foi necessário criar o adaptador através classe AvistamentoListCustomAdapter que estende a classe

ArrayAdapter. Esta última contém informação de um objeto AvistamentoListModel onde existe

parte da informação de um avistamento. Conseguindo assim apresentar os avistamentos através de um ArrayList. Foi ainda criado um ficheiro de layout (lista_item.xml) onde é personalizada a forma de como a informação de cada item da lista é representada. Ao carregar este ecrã a informação é adicionada através de uma função que se encarrega de selecionar os avistamentos

68 Capítulo 5. Desenho e Desenvolvimento

com o evento selecionado e ordenar estes resultados por submissão, como representado no Bloco de Código 5.5.



L i s t <A v i s t a m e n t o > A v i s t a m e n t o s = A v i s t a m e n t o . f i n d W i t h Q u e r y ( A v i s t a m e n t o .c l a s s , "SELECT ∗ FROM A v i s t a m e n t o WHERE e v e n t o = ? ORDER BY s u b m i s s a o " , S t r i n g . v a l u e O f ( i d _ e v e n t o ) ) ;

 

Documents relatifs