Sei sulla pagina 1di 90

ESCUELA TCNICA SUPERIOR DE INGENIERA INFORMTICA

INGENIERA TCNICA EN INFORMTICA DE SISTEMAS

DIARIO DE VIAJE

Realizado por
ANTONIO GUILLN VILA
RAFAEL GARCA NARANJO

Dirigido por
Dr. JOS RAMN PORTILLO FERNNDEZ

Departamento
MATEMTICA APLICADA I

Sevilla, Septiembre de 2012

INDICE
1.

Introduccin .............................................................................................................. 5

2.

Definicin de Objetivos ............................................................................................ 7

3.

Anlisis de antecedentes y aportacin realizada ..................................................... 10

4.

Anlisis temporal y de costes de desarrollo ............................................................ 12

5.

4.1.

Planificacin .................................................................................................... 13

4.2.

Herramientas para el desarrollo ....................................................................... 14

4.2.1.

Equipos de desarrollo ............................................................................... 15

4.2.2.

Eclipse + Android SDK ............................................................................ 15

4.2.3.

Dropbox .................................................................................................... 16

4.2.4.

Dispositivos fsicos ................................................................................... 16

Manual de Android e instalacin del entorno de trabajo ........................................ 19


5.1.

Introduccin a Android .................................................................................... 20

5.2.

Breve historia ................................................................................................... 21

5.3.

Estructura de Android ...................................................................................... 22

5.4.

Estructura de una aplicacin Android .............................................................. 25

5.5.

Ciclo de vida de una aplicacin en Android .................................................... 29

5.5.1.
5.6.

6.

Prioridad de procesos................................................................................ 32

Herramientas para el desarrollo ....................................................................... 33

5.6.1.

Instalacin de Eclipse ............................................................................... 33

5.6.2.

Instalar SDK Android ............................................................................... 34

5.6.3.

Instalar plugin de Android para Eclipse ................................................... 34

5.6.4.

Completar la instalacin ........................................................................... 36

5.6.5.

Otras herramientas tiles .......................................................................... 39

5.6.5.1.

Otras funcionalidades del emulador .................................................. 39

5.6.5.2.

Dalvik Debug Monitor Service ......................................................... 39

5.6.5.3.

Android Debug Bridge ...................................................................... 40

Manual de usuario ................................................................................................... 42


6.1.

Presentacin del Proyecto ................................................................................ 43

6.2.

Ventana de la Lista de Viajes (Ventana Principal) .......................................... 43

6.3.

Ventana de Nuevo Viaje ............................................................................... 45

6.4.

Ventana de la Lista de Lugares ........................................................................ 47

6.5.

Ventana de Nuevo Lugar .............................................................................. 50

6.6.

Ventana Lugar .............................................................................................. 51

7.

Diseo e implementacin ........................................................................................ 54


7.1.

Diseo .............................................................................................................. 55

7.2.

Implementacin................................................................................................ 60

8.

Pruebas .................................................................................................................... 79

9.

Ampliaciones........................................................................................................... 84

10.

Conclusiones........................................................................................................ 86

11.

Bibliografa .......................................................................................................... 89

1.

Introduccin

Este documento tiene como propsito detallar la labor realizada durante el


periodo de ejecucin del proyecto final de carrera, el cual consiste en una aplicacin
para dispositivos mviles Android.
Esta aplicacin presenta un diario de viaje, que permite documentar los viajes
visitados, aadiendo informacin relevante para el usuario, fotos y enlaces a wikipedia,
archivados por viaje y lugar, pudiendo localizar estos lugares visitados mediante su
posicin GPS y mostrarlos a travs de Google Maps. Todo esto mediante Android, que
es una plataforma de programacin de software para dispositivos mviles creada por
Google.
El objetivo de esta aplicacin es tener un recuerdo con imgenes, informacin y
comentarios que hayamos introducido en los viajes realizados.
Adems, los usuarios podrn consultar datos de los lugares visitados en
cualquier momento, ya que todos los dispositivos Android disponen de acceso a
Internet. Tambin, esta aplicacin aade nuevas funcionalidades para interactuar con
sus datos.
Ya que el objetivo de realizar un proyecto fin de carrera no es slo la aplicacin
en s, sino el paso de estudiante a ingeniero, la estructura del documento sigue una lnea
temporal, dnde se explica al inicio del mismo los pasos previos que cualquier
Ingeniero Informtico debe realizar antes de comenzar la implementacin, y
concluyendo con las ideas y reflexiones obtenidas tras su finalizacin, tanto sobre la
aplicacin como a nivel personal en la etapa final como estudiante.
Como ltimo aspecto importante, este trabajo ha servido como primera toma de
contacto con el mundo laboral, adems de como finalizacin del ciclo de formacin
universitaria.

2.

Definicin de Objetivos

Hoy en da es cada vez ms habitual el uso de Internet, del GPS y la cmara en


un dispositivo mvil, aunque alguna de estas opciones puede que ya se encontraran hace
unos aos en los mviles, incluso todas ellas, ha sido con la llegada de los smartphone
cuando la usabilidad ha sufrido una mejora considerable, gracias sobre todo a las
prestaciones de los dispositivos mviles con la introduccin de procesadores de ltima
generacin, incluso saliendo los ltimos con varios ncleos, lo que permite que el
hardware instalado en los mviles haya obtenido una mejora considerable.
Debido a esta mejora vimos interesante usar estas opciones para crear una
aplicacin que permitiera unir todas ellas, con la finalidad de mejorar la organizacin y
el acceso a la informacin que un usuario haya obtenido de un viaje.
El objetivo principal de este proyecto es desarrollar una aplicacin que permita
al usuario realizar un diario de viaje que organice la informacin recopilada por el
usuario para as tener un recuerdo en su dispositivo mvil, introduciendo fotos y enlaces
a wikipedia del lugar visitado, a la vez que podemos aadir comentarios. Para ello
utilizamos la cmara de fotos, GPS y acceso a internet con los que cuentan estos
dispositivos.
La aplicacin nos ayudar a localizar en el mapa algn lugar visitado
previamente, y ver las imgenes capturadas con sus respectivos comentarios, leyendo
toda la documentacin enlazada con la Wikipedia, para as, dar la mxima facilidad
posible al usuario que desee ver los viajes que ha realizado.
En los primeros compases del diseo, hemos partido de varias ideas desde las
cuales desarrollar el resto. En primer lugar, queramos hacer uso de algunas de las
funciones propias de este tipo de telfonos. Para ello, partimos de la idea de otorgar una
gran importancia al GPS que incluyen la mayora de smartphones actualmente a la
venta, as como hacer uso de Internet y la cmara. Partimos de la idea de ofrecer un
producto simple e interesante desde el punto de vista del pblico.
En primer lugar, tras comentar la aportacin que se ha realizado y analizar
temporalmente el Proyecto, se vern algunas caractersticas de los dispositivos mviles
que hemos utilizado durante el proyecto y que usan la plataforma Android, como son el
Samsung I5800 Galaxy 3 y el HTC Wirefire S.
Dispondremos de una completa gua de instalacin de Eclipse y su SDK (kit de
desarrollo de software) y, asimismo, explicaremos como instalar el plugin ADT en
Eclipse o en el entorno de desarrollo que estemos utilizando, necesario para empezar a
crear aplicaciones propias en Android.
Despus, se explicarn cada uno de los artilugios que usaremos en nuestro
proyecto y de los cuales est dotado el dispositivo, como puede ser el caso del GPS y la
cmara, entre otros, y de qu forma se hace uso de ellos.

Para finalizar, se explicar la complejidad de desarrollar el diario de viaje y


cmo a travs de la cmara del telfono mvil y el GPS, podremos localizar los
distintos puntos visitados. Una vez explicado, se mostrar el resultado de probarlo en
nuestro dispositivo mvil.
Respecto a los objetivos personales, teniendo en cuenta que el mundo de la
informtica est en continua evolucin, se busca aprender a utilizar las nuevas
tecnologas puesto que aunque se termine la etapa de estudiante, un informtico va a
estar aprendiendo a usar nuevos lenguajes de programacin o tecnologas durante toda
su vida laboral.
En este caso, el objetivo personal es aprender a programar para una plataforma
en la que no se ha trabajado durante la carrera, dado que Android es un sistema
operativo muy reciente en el que an no se ha profundizado a nivel acadmico.
Adems Android es uno de los sistemas operativos mviles con mayor cuota de
mercado dentro de los dispositivos mviles, aun siendo uno de los ltimos en ser
lanzados, lo que demuestra su buena adaptacin dentro de este mundo mvil y
pensamos que podra ser una buena salida laboral en este mercado tan competitivo que
hay en estos momentos, por lo que tambin fue un aliciente por el cual nos decidimos a
programar con esta plataforma.

3. Anlisis de antecedentes y
aportacin realizada

10

Para la realizacin del Proyecto, se empieza recolectando cierta informacin de


un manual de Introduccin a Android con el ttulo Curso programacin Android
(Salvador Gmez Oliver) al que se hace referencia en la bibliografa, ya que ninguno de
nosotros haba programado previamente con Android y no conocamos los conceptos
bsicos ni la forma de comenzar la aplicacin. Consideramos este manual lo
suficientemente completo como para iniciarnos en Android, puesto que abarca todos los
temas necesarios para empezar a desarrollar un aplicacin en esta plataforma. Adems
de ello, este manual tocaba temas importantes para nuestra aplicacin como
Localizacin geogrfica y Mapas, y aunque estos estaban desarrollados de una
forma muy bsica y el manual no toca otros temas que son base de nuestra aplicacin,
como la utilizacin de la cmara, ha sido imprescindible para nosotros en el desarrollo
del proyecto gracias a la base que hemos obtenido sobre el desarrollo de aplicaciones
Android.
Pero nuestra gran fuente de informacin aportada ha sido Internet. Una buena
parte de la documentacin del proyecto ha sido recolectada de diversas webs y, aunque
en la bibliografa estn sealadas dichas pginas, hay que destacar
http://developer.Android.com, por su amplio contenido e informacin que permite
conocer bien como funciona Android y su API, tanto para los que estn empezando
como para los que tengan algn conocimiento previo.
Para poder devolver la localizacin de un punto de inters donde estemos, as
como su informacin complementaria, veremos que el SDK de Android sirve de gran
ayuda, y que haciendo uso de GoogleMaps (que ser muy til y necesario en nuestro
proyecto) hace que programar esta aplicacin, a pesar de su dificultad, sea un poco ms
ameno.
Toda la informacin recolectada en internet y de los distintos libros consultados
nos ha ayudado para aprender este lenguaje de programacin nuevo para nosotros y
saber cmo funciona, pero una vez que se obtienen estos conceptos bases, parte del
cdigo que se utiliza para desarrollar la aplicacin ha sido ingeniada por nosotros para
que se ajuste a la idea que diseamos. Por supuesto no hemos creado la aplicacin desde
cero, se han utilizado trozos de cdigo obtenido de las distintas fuentes de informacin
que hemos consultado, pero s que hemos ideado gran parte de la aplicacin cuyo
cdigo esta implementado por nosotros (con esto no queremos decir que estas acciones
no estn implementadas ya, si no que en nuestro caso las hemos implementado nosotros
desde nuestras propias ideas para que se ajusten a nuestra aplicacin).
Por tanto, como creemos que sucede con cualquier proyecto informtico, la
aplicacin ha sido desarrollada usando cdigo de terceros y cdigo implementado por
nosotros para as poder llevar a cabo este proyecto de final de carrera.

11

4. Anlisis temporal y de costes


de desarrollo

12

4.1.

Planificacin

En este apartado se ha analizado el tiempo dedicado a la realizacin del


proyecto. Se especificar cunto tiempo hemos estado investigando acerca del
funcionamiento de Android, cunto nos ha costado realizar la aplicacin que hemos
llevado a cabo en este Proyecto, el tiempo dedicado a escribir la memoria junto con los
distintos manuales de uso que sta incluye, as como las pruebas realizadas para
comprobar que la aplicacin funcionaba correctamente.
Este proyecto fue iniciado a partir de Octubre de 2011. Estuvimos 2 meses
realizando tareas de investigacin. Tambin instalamos las versiones del SDK de
Android y empezamos a ver cmo funcionaban las aplicaciones de los primeros
ejemplos ms sencillos, como el tpico Hello, Android.
Debido a las prcticas de empresa que en ese momento hacamos los dos y la
cercana de los exmenes de la convocatoria de Diciembre, se tuvo que aplazar un poco
la realizacin del proyecto.
A principio de Febrero y tras una documentacin exhaustiva y que se detallar
en la Bibliografa, comenzamos a desarrollar las primeras aplicaciones mas decentes en
Android. Es necesario destacar que en ningn momento hemos dejado de
documentarnos.
As mismo, aparte de ir anotando las horas dedicadas grupal e individualmente,
se iban dando pinceladas a la realizacin de la memoria, anotando enlaces para la
bibliografa y comentando el cdigo de las aplicaciones bsicas que realizamos.
A comienzos de Marzo, y una vez aclarados algunos conceptos sobre los cuales
tenamos dudas a la hora de implementar, la aplicacin empez a tomar una base slida.
Durante los meses de Abril, Mayo y Junio se realiz la parte importante de la
aplicacin, y se ampli de manera considerable todo el trabajo de investigacin.
Igualmente, se escribieron los manuales de usuario que contiene la memoria, tanto del
uso de Android en general como de nuestra aplicacin en particular, y de cmo realizar
aplicaciones para este sistema operativo de Google.
Sin lugar a dudas, nuestra experiencia nos dice que a pesar de la numerosa
documentacin que habamos consultado, y del conocimiento de la herramienta, tiene
un lugar importante la correccin de fallos en cuanto a tiempo se refiere. Una vez que la
aplicacin estaba casi lista, nos cost bastante tiempo la tarea de depurar el cdigo y
retocarlo de forma que consiguiera mostrar resultados ptimos.
A continuacin mostramos grficamente los tiempos dedicados a cada apartado
de este proyecto, desde todo el trabajo de investigacin, hasta la realizacin de la
documentacin del mismo. En total, aproximadamente 345 horas de trabajo cada uno
repartidas de la siguiente forma:

13

Tarea

Horas estimadas

Horas reales

Investigacin
Desarrollo de la aplicacin
Memoria
Pruebas
Total

220
280
90
30
620

270
300
110
15
695

Horas estimadas
Investigacin
Desarrollo de la aplicacin
Memoria
Pruebas

Horas reales
Investigacin
Desarrollo de la aplicacin
Memoria
Pruebas

4.2.

Herramientas para el desarrollo

El coste de nuestro proyecto ha sido nulo, debido a que ya tenamos cada uno un
mvil con sistema operativo Android, un equipo para desarrollar la aplicacin y todas
las herramientas que hemos empleado para el desarrollo del software son de libre
adquisicin.

14

4.2.1. Equipos de desarrollo


Hemos usado distintos equipos para las distintas fases del proyecto. Tanto las
labores de implementacin, como las de documentacin, estn sincronizadas a travs de
internet, por lo que no hemos tenido ningn tipo de problema para mantener la
coherencia de las distintas fases. Los equipos usados son:

Equipo1:

CPU
RAM
Targeta grfica
Sistema Operativo

Intel Pentium M 760 processor (2.0 GHz, 533MHz FSB, 2MB L2


cache)
2GB DDR2
Intel Graphics Media Acelerator 900
Windows XP Profesional

Equipo2:

CPU
RAM
Targeta grfica
Sistema Operativo

Core i5-2410M (2,30 / 2,90 GHz Turbo , FSB 1333 MHz, 3 MB


L2)
4GB DDR3 (1333MHz)
Intel HD 3000 (HM65), hasta 1.696 MB
Windows7 64bit Home Premium

4.2.2. Eclipse + Android SDK


El conocido entorno de desarrollo supone la mejor herramienta para programar
en Android, debido a su fuerte orientacin JAVA. Incluye todas las libreras necesarias
para el desarrollo de aplicaciones, as como una mquina virtual configurable para
probar el funcionamiento. Si se emplean dispositivos fsicos, el propio Eclipse puede
instalar y ejecutar la aplicacin mediante una simple conexin USB, ofreciendo adems
todo tipo de herramientas para facilitar la programacin, localizar errores, etc. Adems,
es completamente gratuito y de cdigo abierto.

Ms informacin en:
http://www.eclipse.org/
http://developer.Android.com/sdk/index.html

15

4.2.3. Dropbox
Dropbox es un servicio de alojamiento de archivos multiplataforma en la nube,
operado por la compaa Dropbox. El servicio permite a los usuarios almacenar y
sincronizar archivos en lnea entre computadoras, y compartir archivos y carpetas con
otros usuarios.

Ms informacin en: http://www.dropbox.com

4.2.4. Dispositivos fsicos


El uso de la mquina virtual incluida en Eclipse no permite la manipulacin de
los sensores, adems el rendimiento de las aplicaciones queda muy por debajo del que
se obtiene al ejecutarlo en un dispositivo real. Debido a esto, para el desarrollo de este
proyecto hemos adquirido dos Smartphones de gama alta y diferente hardware para
poder hacer las pruebas pertinentes. Ambos estn actualizados al sistema operativo
Android 2.2.
Las especificaciones de ambos dispositivos, las hemos obtenido en la web
http://www.gsmarena.com/ y son las siguientes:

Samsung I5800 Galaxy 3

2G Network
3G Network
General
Announced
Status
Dimensions
Body
Weight
Type
Size
Display
Multitouch

Sound

Memory
Data

Alert types
Loudspeaker
3.5mm jack
Card slot
Internal
GPRS
EDGE
Speed

GSM 850 / 900 / 1800 / 1900


HSDPA 900 / 2100
2010, June
Available. Released 2010, July
113.5 x 55 x 12.9 mm
109 g
TFT capacitive touchscreen, 16M colors
240 x 400 pixels, 3.2 inches (~146 ppi pixel density)
Yes
- Touch Wiz 3.0
Vibration; MP3, WAV ringtones
Yes
Yes
- DNSe (Digital Natural Sound Engine)
microSD, up to 32GB, 1GB card included
512MB ROM, 256MB RAM
Class 10 (4+1/3+2 slots), 32 - 48 kbps
Class 10, 236.8 kbps
HSDPA, 3.6 Mbps

16

WLAN
Bluetooth
USB
Primary
Features
Camera
Video
Secondary
OS
CPU
Sensors
Messaging
Browser
Radio
GPS
Java
Features
Colors

Battery

Stand-by
Talk time

HTC Wildfire S
2G Network
3G Network

General

Body

Announced
Status
Dimensions
Weight

Display

Type
Size

Alert types
Loudspeaker
3.5mm jack
Card slot
Memory
Internal
GPRS
EDGE
Data
Speed
Sound

Wi-Fi 802.11 b/g/n, Wi-Fi hotspot (Android 2.2)


Yes, v3.0 with A2DP
Yes, microUSB v2.0
3.15 MP, 2048x1536 pixels, autofocus
Geo-tagging, face and smile detection
Yes, QVGA@15fps
No
Android OS, v2.1 (Eclair), upgradable to v2.2
Samsung S5P6422 667 MHz
Accelerometer, proximity, compass
SMS(threaded view), MMS, Email, Push Mail, IM
HTML
Stereo FM radio with RDS
Yes, with A-GPS support
Yes, via Java MIDP emulator
Black, White
- MP4/DivX/XviD/WMV/H.264/H.263 player
- MP3/WAV/eAAC+ player
- Organizer
- Document editor (Word, Excel, PowerPoint, PDF)
- Google Search, Maps, Gmail,
YouTube, Calendar, Google Talk integration
- Voice memo
- Predictive text input
Standard battery, Li-Ion 1500 mAh
Up to 620 h (2G) / Up to 510 h (3G)
Up to 15 h 30 min (2G) / Up to 7 h 15 min (3G)

GSM 850 / 900 / 1800 / 1900


HSDPA 900 / 2100
HSDPA 850 / 1900 or HSDPA 2100 (Australia)
2011, February
Available. Released 2011, May
101.3 x 59.4 x 12.4 mm
105 g
- Touch-sensitive controls
TFT capacitive touchscreen, 256K colors
320 x 480 pixels, 3.2 inches (~180 ppi pixel density)
- HTC Sense 2.1 UI
Vibration, MP3, WAV ringtones
Yes
Yes
microSD, up to 32GB, 2GB included
512 MB ROM, 512 MB RAM (418 MB user-available)
Up to 114 kbps
Up to 560 kbps
HSDPA, 7.2 Mbps; HSUPA, 384 Kbps

17

WLAN
Bluetooth
USB
Primary
Features
Camera
Video
Secondary
OS
Chipset
CPU
GPU
Sensors
Messaging
Browser
Radio
GPS
Features
Java
Colors

Battery

Stand-by
Talk time

Wi-Fi 802.11 b/g/n, Wi-Fi hotspot


Yes, v3.0 with A2DP, EDR
Yes, microUSB v2.0
5 MP, 2592 x 1944 pixels, autofocus, LED flash
Geo-tagging, face detection
Yes, VGA@24fps
No
Android OS, v2.3 (Gingerbread), upgradable to v2.3.5
Qulacomm MSM7227
600 MHz ARM 11
Adreno 200
Accelerometer, proximity, compass
SMS(threaded view), MMS, Email, Push Email, IM
HTML
Stereo FM radio with RDS
Yes, with A-GPS support
Yes, via Java MIDP emulator
Black, Silver, Brown, Lilac
- SNS integration
- Google Search, Maps, Gmail
- YouTube, Google Talk, Picasa integration
- MP3/AAC+/WAV player
- Xvid/MP4/H.264 player
- Organizer
- Voice memo
- Predictive text input
Standard battery, Li-Ion 1230 mAh
Up to 360 h (2G) / Up to 570 h (3G)
Up to 7 h 10 min (2G) / Up to 5 h 50 min (3G)

18

5. Manual de Android e
instalacin del entorno de
trabajo

19

5.1.

Introduccin a Android

Android es una pila de software de cdigo abierto que incluye un sistema


operativo, middleware, y aplicaciones clave con una serie de libreras API para poder
desarrollar aplicaciones a las cuales se les pueden dar la forma y el funcionamiento
especfico para que pueda funcionar en telfonos mviles.
Hasta hace poco, poder desarrollar aplicaciones para telfonos mviles era
dificilsimo porque se programaban bajo sistemas operativos propios y entornos de
desarrollo cerrados, a los cuales era imposible acceder. As mismo, los propios
terminales priorizaban las aplicaciones nativas, hacindolas prevalecer frente a
aplicaciones que se hayan desarrollado por terceras partes. Esto supona una barrera
infranqueable para los desarrolladores de este tipo de aplicaciones.
En Android las aplicaciones tanto nativas como las desarrolladas por terceras
partes son escritas usando la misma API y ejecutadas en las mismas condiciones. Es por
ello que en Android todas las aplicaciones son iguales sin hacer ninguna distincin ni
discriminacin.

Histricamente, los desarrolladores codificaban sus aplicaciones en lenguajes de


bajo nivel, para lo que era necesario entender el hardware especfico sobre el que iban a
trabajar, y generalmente solan ser un dispositivo sencillo o un rango de dispositivos
provenientes del mismo fabricante.
En la actualidad, los avances realizados en el desarrollo de aplicaciones para
terminales mviles, han hecho que se pueda programar con un nivel de abstraccin para
que el programador se asle de la capa hardware y no estar pendiente de ella.
Entre las caractersticas del sistema operativo Android destacamos:

Todas sus aplicaciones se programan en lenguaje Java y son ejecutadas en una


mquina virtual especfica diseada para esta plataforma.

Todo su software se ha realizado bajo una licencia Apache, de modo que el


cdigo es de libre distribucin. Tambin una de las causas primordiales por las
cuales se ha escogido una licencia Apache, es porque este tipo de licencia
permite que se realicen modificaciones sobre el software inicial y una vez que se

20

realicen los oportunos cambios, no exige que el software alterado se distribuya


como software libre. Permite a las operadoras modificar a su gusto la
plataforma, aadir nuevas funcionalidades y no tener que compartir el cdigo ni
permitir su uso a terceros. As, de este modo, se puede entender como algunos
operadores y fabricantes hayan visto con buenos ojos esta iniciativa y es por ello
que se hayan sumado a Android. La principal causa de esta adhesin es que
dichas compaas podrn modificar el cdigo y desarrollar todo tipo de
aplicaciones o trabajos sin la necesidad de verse obligados a compartir todo la
elaboracin producida. De todas formas, la licencia Apache propuesta por
Android, permite que cualquier persona se pueda descargar, acceder al cdigo
fuente, modificarlo y redistribuirlo pero con el ligero inconveniente que a
cualquier persona se le exime de este ltimo punto.

A cualquier desarrollador que se plantee programar sobre esta plataforma, se le


proporciona de forma totalmente gratuita un entorno de desarrollo, es decir una
SDK que se puede instalar junto con un plug-in en uno de los IDEs ms
famosos y conocidos como es Eclipse. Adems se integra un emulador en el cual
se pueden realizar todo tipo de pruebas sobre el programa elaborado y s stas
han salido satisfactorias se puede importar el proyecto elaborado al propio
dispositivo mvil.

La principal finalidad que busca Android desde el punto de vista del


desarrollador, es que ste pueda sacar de s lo mayor posible de la plataforma, poder
controlar y aprovechar cualquier funcionalidad que se proporcione desde el sistema
operativo, y que toda aplicacin que se pueda crear sea portable, fcil de desarrollar y
reutilizable. Con todo ello, se intenta buscar un estndar para el desarrollo de este tipo
de aplicaciones. Por ltimo, cabe destacar la gran facilidad que desde Android se ofrece
para poder integrar todo tipo de aplicacin con las aplicaciones Web de Google.

5.2.

Breve historia

En Julio de 2005, Google adquiri Android, Inc [37], una pequea startup de
California. En esos momentos, la compaa se dedicaba a la creacin de software para
telfonos mviles. Una vez en Google, el equipo desarroll un S.O. basado en Linux
para dispositivos mviles. Ms adelante, Google adapt su buscador y sus aplicaciones
para su uso en mviles.
En septiembre del 2007, Google tena varias patentes de aplicaciones sobre el
rea de la telefona mvil. El 5 de noviembre del mismo ao, se anunci la fundacin de
la Open Handset Alliance al mismo tiempo que la creacin de la plataforma Android. La
Open Handset Alliance est formada por un consorcio de 34 compaas de hardware,
software y telecomunicaciones, entre las cuales se incluyen Google, HTC [38], Intel
[39] y Motorola [40] entre otras, dedicadas a investigar estndares abiertos para
dispositivos mviles.
El primer telfono en el mercado que posee Android es el T-Mobile G1 [41]
(tambin conocido como Dream), lanzado el da 22 de octubre de 2008 que viene con la
versin Android 1.0 preinstalada. Este mvil es el resultado conjunto de T-Mobile, HTC

21

y Google. Por ltimo, desde el 21 de octubre de 2008, Android est disponible como
cdigo abierto [42]. Gracias a esto, cualquiera puede aadir extensiones, nuevas
aplicaciones o reemplazar las existentes por otras dentro del dispositivo mvil

5.3.

Estructura de Android

El stack de software a grandes rasgos, est formado por: un ncleo de Linux, una
serie de libreras escritas en cdigo C/C++, un entorno de ejecucin propio (Android
Run Time), un framework de aplicaciones y las propias aplicaciones.
A continuacin se puede ver el esqueleto de este sistema operativo, y debajo de
la misma se explicarn cada una de las partes que lo conforman.

La estructura del sistema operativo es la siguiente:

El ncleo de Linux: es la capa ms baja situada y es donde se sitan los


servicios bsicos, es decir, en esta capa se establecen los drivers del hardware, la
gestin de procesos y memoria, la seguridad, y las gestiones de redes y de
energa. Todo ello est manejado por un kernel de Linux con versin 2.6, y cuya
funcin principal es abstraer a las diferentes capas sucesivas que soporta la
estructura de Android del hardware de la mquina.
Aparte de las propiedades que puede dar dicho kernel de Linux, tambin
hay que decir que precisamente dicho ncleo, incluye diversos drivers lo cual le
hace semejante a cualquier otro kernel que corre en un ordenador personal. Por

22

otro lado, este kernel, al ser Linux cumple con las expectativas con las que
Android se lanzar bajo licencia Apache.

Por encima del ncleo de Android se establecen una serie de libreras escritas
en lenguaje C/C++, y al igual que el ncleo, estas libreras son iguales de
bsicas.
Dentro de las libreras, las ms importantes son las siguientes:
o Libc: esta librera incluye todas las cabeceras y funciones segn el
estndar de C.
o SQLite: es la librera que implementa un motor de base de datos. SQLite
es software libre, por lo tanto el cdigo fuente es de dominio pblico.
o Surface Manager (Administrador de Superficies): es la que realiza toda la
gestin del acceso a los subsistemas de pantallas. Adems es la
encargada de gestionar todas aquellas pantallas de las diferentes
aplicaciones activas que se encuentren en ese preciso instante.
o SSL & WebKit: ambas libreras son las encargadas de integrar un
navegador para Internet y de proporcionar seguridad cuando se acceda a
sta.
o Media: el principal uso de esta librera es para poder reproducir tanto
archivos de audio o video, as como los archivos fotogrficos. Cabe
destacar que en esta librera se proporcionan los cdecs necesarios para
poder reproducir los formatos ms populares.
o OpenGL / ES y SGL: la ltima libre, la SGL, es la encargada de
proporcionar el motor grfico de 2D. Sin embargo, la OpenGL / ES
maneja los grficos 3D en el caso de que el hardware del telfono mvil
lo disponga.
o FreeType: es la encargada de la renderizacin de fuentes, para mapas de
bits y vectores.

La siguiente capa, y que se sita en el mismo nivel que la anterior, es el entorno


de ejecucin de Android, o la Android Run Time. Android incluye un set de
libreras base que proveen la mayor parte de las funcionalidades disponibles en

23

las libreras base del lenguaje de programacin Java. Todas las aplicaciones se
programan en Java y para poder ejecutarlas se ha creado especficamente para
Android una mquina virtual, la Dalvik Virtual Machine. Lo particular de esta
mquina virtual, es que ha sido especialmente optimizada y adaptada para las
caractersticas de cualquier telfono mvil. Cada aplicacin Android corre su
propio proceso, con su propia instancia en la mquina virtual Dalvik. Esta
mquina virtual, ha sido escrita de forma que un dispositivo puede correr
mltiples mquinas virtuales de forma eficiente. Dalvik ejecuta archivos en el
formato Dalvik Executable (.dex), y no con el bytecode generado por Java, de
forma que los .dex estn optimizados para un uso mnimo de la memoria y
pensados para procesadores pequeos. Dicha mquina virtual est basada en
registros, y ejecuta las clases compiladas por el compilador Java y que se han
transformado en el formato .dex por la herramienta dx. Para hacernos una idea
real de lo que sucede, y de la eficiencia de esta mquina virtual, se va a explicar
un poco como se realiza todo el proceso. Una vez que se genera el bytecode de
la aplicacin escrita en Java, es decir, una vez que obtenemos los .class la
mquina virtual genera un .dex con toda la agregacin de estos cdigos objeto,
por hacer un smil sencillo, un .dex podra asemejarse a un archivo jar.

La penltima capa dentro de la estructura del sistema operativo Android es la


del Framework de Aplicaciones. A partir de aqu, las ltimas capas de la
plataforma, se sustentan sobre Java. En esta capa se proporcionan todas las
clases necesarias para poder crear aplicaciones en Android. Del mismo modo,
este framework proporciona un nivel de abstraccin del acceso al hardware y la
gestin de la interfaz del usuario y de los recursos de la aplicacin. Los
desarrolladores tienen acceso a las mismas APIs que las aplicaciones base, con
el nico objetivo de poder reutilizar los componentes utilizados para la
aplicacin realizada.
En cuanto a las APIs ms conocidas son las siguientes:
o Administrador de Telfono: destinada para que el desarrollador pueda
interactuar con las funcionalidades del telfono, como son los mensajes
SMS, llamadas,
o Proveedor de Contenidos: con esta API, se pueden compartir los datos de
cualquier aplicacin.
o Administrador de Ubicaciones: permite que las aplicaciones obtengan
informacin sobre la localizacin y posicionamiento de sta.
o Administrador de Actividad: es la API encargada de gestionar el ciclo de
vida de las aplicaciones.
o Administrador de Ventanas: con ella se pasan a gestionar las ventanas de
las aplicaciones.
o Vista del Sistema: es con la cual se realiza toda la interfaz de usuario.

24

o La capa de Aplicaciones es la ltima capa del software, en la que se


encuentran tanto las aplicaciones nativas provistas por Android como las
desarrolladas por terceras partes. Todas ellas, han sido construidas en
esta capa y utilizando las mismas APIs y bajo el mismo lenguaje de
programacin, Java.

5.4.

Estructura de una aplicacin Android

Para empezar a comprender cmo se construye una aplicacin Android vamos a


echar un vistazo a la estructura general de un proyecto tipo.
Cuando creamos un nuevo proyecto Android en Eclipse se genera
automticamente la estructura de carpetas necesaria para poder generar posteriormente
la aplicacin. Esta estructura ser comn a cualquier aplicacin, independientemente de
su tamao y complejidad.
En la siguiente imagen vemos los elementos creados inicialmente para un nuevo
proyecto Android:

En los siguientes apartados describiremos los elementos principales de esta


estructura.
Carpeta /src/
Contiene todo el cdigo fuente de la aplicacin, cdigo de la interfaz grfica,
clases auxiliares, etc. Inicialmente, Eclipse crear por nosotros el cdigo bsico de la
pantalla (Activity) principal de la aplicacin, siempre bajo la estructura del paquete java
definido.

25

Carpeta /res/
Contiene todos los ficheros de recursos necesarios para el proyecto: imgenes,
vdeos, cadenas de texto, etc. Los diferentes tipos de recursos de debern distribuir entre
las siguientes carpetas:

Carpeta

Descripcin

/res/drawable/

Contienen las imgenes de la aplicacin. Para utilizar diferentes


recursos dependiendo de la resolucin del dispositivo se suele
dividir en varias subcarpetas:
/drawable-ldpi

/res/layout/

Contienen los ficheros de definicin de las diferentes pantallas


de la interfaz grfica. Para definir distintos layouts dependiendo
de la orientacin del dispositivo se puede dividir en dos
subcarpetas:

/res/anim/
/res/menu/
/res/values/

/res/xml/
/res/raw/

/drawable-mdpi
/drawable-hdpi

/layout
/layout-land

Contiene la definicin de las animaciones utilizadas por la


aplicacin.
Contiene la definicin de los mens de la aplicacin.
Contiene otros recursos de la aplicacin como por ejemplo
cadenas de texto (strings.xml), estilos (styles.xml), colores
(colors.xml), etc.
Contiene los ficheros XML utilizados por la aplicacin.
Contiene recursos adicionales, normalmente en formato distinto
a XML, que no se incluyan en el resto de carpetas de recursos.

Como ejemplo, para un proyecto nuevo Android, se crean los siguientes recursos
para la aplicacin:

26

Carpeta /gen/
Contiene una serie de elementos de cdigo generados automticamente al
compilar el proyecto. Cada vez que generamos nuestro proyecto, la maquinaria de
compilacin de Android genera por nosotros una serie de ficheros fuente en java
dirigidos al control de los recursos de la aplicacin.

El ms importante es el que se puede observar en la imagen, el fichero R.java, y


la clase R.
Esta clase R contendr en todo momento una serie de constantes con los ID de
todos los recursos de la aplicacin incluidos en la carpeta /res/, de forma que podamos
acceder fcilmente a estos recursos desde nuestro cdigo a travs de este dato. As, por
ejemplo, la constante R.drawable.icon contendr el ID de la imagen icon.png
contenida en la carpeta /res/drawable/. Veamos como ejemplo la clase R creada por
defecto para un proyecto nuevo:

public final class R


{
public static final
}
public static final
public static
}
public static final
public static
}
public static final
public static
public static
}
}

class attr {
class drawable {
final int icon=0x7f020000;
class layout {
final int main=0x7f030000;
class string {
final int app_name=0x7f040001;
final int hello=0x7f040000;

27

Carpeta /assets/
Contiene todos los dems ficheros auxiliares necesarios para la aplicacin (y que
se incluirn en su propio paquete), como por ejemplo ficheros de configuracin, de
datos, etc.
La diferencia entre los recursos incluidos en la carpeta /res/raw/ y los incluidos
en la carpeta /assets/ es que para los primeros se generar un ID en la clase R y se
deber acceder a ellos con los diferentes mtodos de acceso a recursos. Para los
segundos sin embargo no se generarn ID y se podr acceder a ellos por su ruta como a
cualquier otro fichero del sistema. Usaremos uno u otro segn las necesidades de
nuestra aplicacin.
Fichero AndroidManifest.xml
Contiene la definicin en XML de los aspectos principales de la aplicacin,
como por ejemplo su identificacin (nombre, versin, icono, ), sus componentes
(pantallas, mensajes, ), o los permisos necesarios para su ejecucin. Veremos ms
adelante ms detalles de este fichero.
En el siguiente apartado veremos los componentes software principales con los
que podemos construir una aplicacin Android.

A la hora de construir una aplicacin en Android, hay que tener en cuenta que
dicha aplicacin puede estar compuesta de un tipo especfico de componente o de la
combinacin de ambos.
Estos componentes son los que van a identificar y caracterizar a la aplicacin
que se llegue a crear, ya que en funcin de stos la clase que se desarrolle heredar las
caractersticas del componente, y por lo tanto pueden existir diferentes formas de
comportamiento, en cuanto a la aplicacin se refiere, segn el tipo de componente que
se decida a usar.
Los diferentes tipos de componentes con los cuales podemos crear aplicaciones
en Android son los siguientes:

Activity
Es el componente ms importante en cualquier aplicacin Android,
debido principalmente a que es la capa de presentacin para todo tipo de
aplicacin. Cualquier pantalla que se muestre al usuario, ser una extensin de la
clase Activity. Y para dicha presentacin se sirve de Views, para poder realizar la
interfaz con la cual el usuario podr interactuar. Est clase puede ser equivalente
a lo que es un formulario en la arquitectura web.

28

Services
Este componente, es totalmente opuesto al anteriormente explicado. La
clase Services al contrario que la Activity, no interacta para nada con el usuario,
y es completamente invisible a los ojos del usuario. Se puede decir
prcticamente, que este componente corre por debajo, en un segundo plano,
realizando cualquier tipo de procedimiento que est obligado a realizarse sin la
necesidad de que sea visible al usuario. La clase Service por as decirlo, son las
clases que se ejecutan en background.

Content Provider
Los Content Provider, son principalmente utilizados para gestionar y
almacenar las bases de datos de la aplicacin. Tambin permiten que cualquier
aplicacin almacenen los datos en un fichero o cualquier otro formato. La gran
ventaja que presenta este tipo de componente, es que permite a cualquier
aplicacin acceder a los datos que estn siendo utilizados por otras aplicaciones
a la vez.

Intent
Un Intent, es un simple mensaje, que se utiliza para determinar el
objetivo de la aplicacin, es decir, su propsito. La principal peculiaridad es la
forma en la cual los Intent describen la tarea que se va a llevar a cabo y los datos
necesarios para realizarla. En ltima instancia, es el sistema el que finalmente
decide cual ser el ms indicado para realizar sus acciones. Este componente,
est muy ligado al Activity, puesto que las Activities, realizan los cambios de
vista o de interfaz por medio de los Intent.

Broadcast Receivers
Con esta clase, la aplicacin que se crea, est a la escucha de cualquier
Intent proveniente de distintas aplicaciones. Al utilizar este componente, la
aplicacin puede empezar automticamente y responder al Intent que est a la
escucha. Se puede decir que la aplicacin est a la escucha de un evento para
llevar a cabo la accin a la cual est predestinada. Generalmente las aplicaciones
que utilizan esta clase, se utilizan para lanzar eventos provenientes de cualquier
tipo de Intent. Un claro ejemplo puede ser la gestin de las llamadas entrantes
que recibe el dispositivo mvil.

5.5.

Ciclo de vida de una aplicacin en Android

Los componentes que forman las aplicaciones en Android, tienen bien definido
un ciclo de vida de manera que se puede saber en cualquier momento en que estado est
la aplicacin para poder gestionar los flujos de sta en funcin de su estado.

29

A la hora de ejecutar una aplicacin en Android, sta se lleva a cabo en su


propio proceso, de tal modo que Android es el encargado de gestionar todas las
aplicaciones, arrancarlas o pararlas en funcin de los recursos que la aplicacin necesite.
Android asla totalmente al usuario del dispositivo de la labor que el sistema
operativo est realizando para poder ejecutar la aplicacin que el poseedor del telfono
desee. Android ejecutar tantos procesos en funcin de los recursos que tenga
disponibles, los cuales pueden estar a la vez formados por ms de una actividad
(Activity).
A diferencia de otros entornos, las aplicaciones en Android, no tienen el control
sobre su propio ciclo de vida. En cambio, los componentes de los que est formada
dicha aplicacin estn al tanto de los cambios de estado que sta pueda generar. De
modo que durante la ejecucin puede suceder que una actividad pare mientras otra sea
lanzada, de tal manera que el proceso es consciente del estado en cual se ha quedado
para que en un futuro vuelva a dicho estado cuando el sistema le conceda el mando.
El caso ms conocido de ciclo de vida, es el del componente Activity, cuyo
diagrama es el siguiente:

30

Como se puede observar en la figura anterior, los diferentes estados que


conforman el ciclo de vida de una actividad son los siguientes:

onCreate: Es el estado en el cual da comienzo el ciclo de vida de la aplicacin.

onDestroy: Estado en el que se da por finalizado el ciclo de vida.

onStart: Junto con el estado onStop forman el conjunto de estados en los cuales
se maneja la actividad desde su comienzo.

onStop: Es el estado en el cual permanece la actividad cuando sta no tiene el


mando para realizar sus procesos. Es similar al estado onPause.

31

onPause: Similar al estado anteriormente descrito. La actividad permanece en


este estado cuando sta no recibe el foco de atencin por parte del sistema.

onResume: Al igual que el estado onPause, ambos estados acotan el ciclo de


vida de la actividad en funcin del foco de atencin dispensado a la aplicacin.

5.5.1. Prioridad de procesos


Una vez visto el ciclo de vida de una aplicacin en Android, y concretamente
cuando una aplicacin se crea, su flujo concluye cuando sta finalice o cuando otra
actividad necesite los recursos que la aplicacin est consumiendo.
La preferencia por parte de Android a la hora de priorizar determinadas
aplicaciones en funcin de otras se debe en gran parte al tipo de componente que lo
forma, ya que una aplicacin puede ser ms prioritaria respecto de otra. A la hora de
programar una aplicacin hay que tener en cuenta la prioridad que se le va a asignar
puesto que en funcin de la prioridad la aplicacin puede morir durante un proceso de
ejecucin importante.
La importancia en cuanto a procesos se refiere es la siguiente, de mayor a menor
prioridad:
1. Procesos activos. Son los procesos cuya importancia es crtica. Son aquellos que
estn albergados en aplicaciones que estn continuamente estableciendo
contacto con el usuario, y que generalmente son liquidados en ltima estancia.
Este tipo de prioridad corresponde a:

Activities que se encuentran en un estado activo y que estn respondiendo


continuamente a eventos del usuario.

Activities, Services o Broadcast Recivers, que se estn ejecutando cuando


reciben un evento.

Componentes Services que se ejecutan tras un evento proveniente de una


aplicacin que se crea, comienza o se destruye.

2. Procesos visibles. Como su propio nombre indica, son componentes de tipo


Activity que son visibles pero no estn al mando. En extraos casos son matadas.
3. Procesos de servicio. Son aquellas aplicaciones cuyo principal componente de
aplicacin es un Service, y tienen menor prioridad que un Activity, en gran parte
a que este tipo de procesos no estn continuamente interactuando con el usuario
y a que son consideradas actividades que transcurren en un segundo plano.
Este tipo de procesos no son matados a menos que sean necesarios los
recursos de los que dispone.

32

4. Procesos de segundo plano. A diferencia de los anteriores, son procesos que


corren en un segundo plano y que no disponen de ningn servicio.
5. Procesos vacos. Son aquellos procesos que se mantienen en cache para un
posterior relanzamiento.

5.6.

Herramientas para el desarrollo

En este apartado se va a comentar las herramientas y los pasos necesarios para


poder desarrollar aplicaciones en Android.
Es necesario conocer el sistema operativo as como el procesador sobre el cual
se va a instalar el conjunto de herramientas necesarias. Este procedimiento es
importante porque a la hora de instalar la SDK de Android, existen una serie de
necesidades que no hay que pasar por alto. La SDK de Android es totalmente
compatible con los principales sistemas operativos que existen en el mercado, es decir,
Windows, Mac y Linux. A continuacin es necesario disponer de una JDK, disponer a
su vez del IDE de desarrollo Java Eclipse.
Procedimientos para instalar las herramientas.

5.6.1. Instalacin de Eclipse


Si nuestro PC no dispone de un entorno de desarrollo compatible con Android
SDK, recomendamos descargar Eclipse 3.4 (Ganymede), en la web oficial de Eclipse:
http://www.eclipse.org/downloads.
No nos vamos a parar mucho en cmo instalar Eclipse ya que no es la finalidad
de nuestro proyecto, simplemente vamos a explicar los pasos bsicos para tenerlo
funcionando en nuestro equipo.

33

Seleccionamos Eclipse Classic 3.7.2 para Windows, Linux o Mac, dependienfo


del Sistema Operativo que tengamos y nos los descargamos en nuestro equipo.
Descomprimimos el archivo .zip en el directorio que hemos seleccionado y ejecutamos
el archivo eclipse.exe que se encuentra en la carpeta eclipse descomprimida.
Finalmente, elegimos un espacio de trabajo donde elaborar nuestros proyectos.

5.6.2. Instalar SDK Android


Bien, una vez que hemos cumplido los requisitos del apartado anterior, nos
dirigimos al website dedicado para Android:
http://developer.Android.com/sdk/index.html

Y una vez all, nos descargamos la SDK en funcin de nuestro sistema


operativo, bien puede ser Windows, Mac o Linux. A continuacin, descomprimimos el
archivo en cuestin, teniendo en cuenta la ruta en la cual se ha descomprimido dicho
archivo.
Concluido el proceso de instalacin de la SDK, se procede a la instalacin del
plugin necesario para Eclipse.

5.6.3. Instalar plugin de Android para Eclipse


Ahora, el siguiente paso es iniciar Eclipse, para que de este modo podamos
incluir el plugin necesario de Android, y as incluir la herramienta ADT (Android
Development Tools) la cual permitir crear proyectos de Android, debuggarlos y
ejecutarlos.
Abierto el IDE Eclipse, en la pestaa Help->Install New Software y en la
ventana nueva que aparece, pulsar el botn Add.

34

De nuevo aparecer una nueva ventana en la cual en los campos Name se pude
introducir por ejemplo ADT y en el campo Location la siguiente URL:
https://dl-ssl.google.com/Android/eclipse/

Y una vez realizado, pulsar el checkbox o el botn Select All y pulsar Next.

35

Y a partir de ah comenzar a descargarse el software necesario para comenzar a


desarrollar aplicaciones.
Por ltimo Eclipse pedir que se reinicie, para poder configurar los cambios
realizados.

5.6.4. Completar la instalacin


Tras reiniciar Eclipse, los siguientes pasos a realizar son:

Referenciar SDK

Para poder crear proyecto, debemos referenciar la SDK en la pestaa Windows>Preferentes->Android->Browse y buscar el path sobre el que se encuentra la SDK.

Y en ltimo lugar pulsar Apply y Ok.

Descargar los targets necesarios

Adems del SDK de Android, tambin debemos descargar los llamados SDK
Targets de Android, que no son ms que las libreras necesarias para desarrollar en cada
una de las versiones concretas de Android. As, si queremos desarrollar por ejemplo
para Android 1.6 tendremos que descargar su target correspondiente. Para ello, desde
Eclipse debemos acceder al men Window ->Android SDK Manager, y en la seccin
Packages seleccionar e instalar todos los paquetes deseados.

36

Configurar emulador AVD y actualizar plugin

A la hora de probar y depurar aplicaciones Android no tendremos que hacerlo


necesariamente sobre un dispositivo fsico, sino que podremos configurar un emulador
o dispositivo virtual (Android Virtual Device, o AVD) donde poder realizar fcilmente
estas tareas. Para ello, nos vamos a Windows->ADV Manager y en la seccin Virtual
Devices podremos aadir tantos AVD como se necesiten (por ejemplo, configurados
para distintas versiones de Android).

A continuacin, pulsamos sobre el botn New, y aparecer la siguiente ventana.

37

Para configurar el AVD tan slo tendremos que indicar un nombre descriptivo,
el target de Android que utilizar, y las caractersticas de hardware del dispositivo
virtual, como por ejemplo su resolucin de pantalla, el tamao de la tarjeta SD, o la
disponibilidad de GPS. Y por ultimo comenzar un proceso de actualizacin de la SDK.

38

5.6.5. Otras herramientas tiles


Como bien se ha podido apreciar en el apartado anterior la SDK de Android,
incluye diversas herramientas y utilidades que permiten al usuario poder crear, testear y
analizar las propias aplicaciones.
Otra herramienta que aporta la SDK es el emulador. El cual es una propia
mquina virtual destinada a ejecutar las aplicaciones de Android, es por ello la manera
ms cercana de poder conocer cmo sera un dispositivo mvil con dicho sistema
operativo. ste a su vez, dispone de una variedad de posibles maneras de mostrarse
como interfaz grfica, es decir, dispone de distintos tamaos de pantalla, resoluciones.
Adems de proveer de una buena conexin a Internet, en cuanto a rapidez y
latencia respecto a las aplicaciones, y de permitir recibir llamadas y SMS, obviamente
simulados. Como aadido a las caractersticas anteriormente habladas, existe una
funcionalidad que permite al emulador de Android contactar y realizar operaciones
mediante una conexin Telnet. A travs del puerto 5554 se puede entablar todo tipo de
rdenes con el emulador.
Tambin existen otro tipo de funcionalidades no menos importantes pero que
merecen la pena describirlas.
5.6.5.1.

Otras funcionalidades del emulador

Dentro del emulador, existe la posibilidad de poder utilizar imgenes que puedan
simular memorias internas, flash o de otro tipo.
Las diferentes tipos de imagen son los siguientes:

Imagen de sistema: son el tipo de imagen necesaria para que el emulador pueda
arrancar, de modo que slo son de lectura y obtienen informacin sobre la
manera de ejecutarse ste.

Imagen de runtime: a diferencia de las anteriores, stas permiten escribir adems


de la posibilidad de leer de la imagen correspondiente. Y principalmente se
utilizan para guardar datos de la sesin, como pueden ser aplicaciones
instaladas. Al igual que las imgenes que simulan almacenamientos extrables.

Imagen temporal: la caracterstica principal de estas imgenes es que al acabar


la ejecucin, es decir, al apagar o cerrar el emulador, se eliminan por completo.
Y la utilidad que tienen, es para hacer las labores de cach y para realizar una
copia del sistema.

5.6.5.2.

Dalvik Debug Monitor Service

Aparte del emulador, existen otras herramientas que facilitan la programacin de


cualquier aplicacin en Android. De estas herramientas cabe destacar la Dalvik Debug
Monitor Service o DDMS.

39

En primera instancia, el emulador, te permite ver qu aspecto presenta la


aplicacin, cmo se comporta y poder interactuar con la misma, pero realmente no
sabes lo que realmente est pasando dentro. De este modo, la DDMS es una herramienta
que permite debutar la aplicacin y conocer en todo momento que est sucediendo
dentro de los entresijos de la aplicacin que se est ejecutando.
De esta manera, con esta herramienta, se tiene una versin fidedigna de la
ejecucin de la aplicacin, porque se pueden acceder a los log, conocer de manera
primordial la gestin de recursos, y la simulacin de envo de SMS as como de
llamadas entrantes y geolocalizacin.
Para poder acceder a esta herramienta basta con pulsar la pestaa Window->
Open Perspectiva-> DDMS. Y aparecer una perspectiva similar a la siguiente imagen:

5.6.5.3.

Android Debug Bridge

Para finalizar, la Android Debug Bridge o ADB, es una herramienta que


mediante una arquitectura cliente servidor permite conectarte desde tu mquina al
dispositivo Android.
Esta herramienta te permite copiar archivos, instalar aplicaciones o ejecutar
comandos para acceder a la shell. Para poder utilizar las utilidades que nos facilita esta
herramienta, basta con acceder mediante la lnea de comandos hasta el path en el que se
encuentra la SDK, y acceder a la carpeta tools y una vez all, ejecutar los posibles
comandos.

40

De entre esos comandos, los ms comunes son los siguientes:

adb shell: con este comando se puede acceder al directorio root del terminal y
desde ese punto se podrn lanzar diversos comandos contra el dispositivo. Como
por ejemplo, acceder al sistema para poder borrar las aplicaciones instaladas.

adb push [local][remoto]: con este comando se pueden enviar archivos al


dispositivo desde nuestra propia mquina.

adb pull [remoto][local]: el comando contrario al anterior, con l, nos


descargamos archivos desde el dispositivo a la mquina.

adb install [path/aplicacion.apk]: con este comando, se permite instalar


aplicaciones en el dispositivo, indicndole slo la ruta desde donde se encuentra
el paquete compilado de la aplicacin(.apk).

adb reboot: comando con el que se reinicia el emulador.

41

6.

Manual de usuario

42

6.1.

Presentacin del Proyecto

DIARIO DE VIAJE es una aplicacin que est desarrollada para que el usuario
pueda almacenar informacin sobre un viaje que ha realizado y todos los lugares que ha
visitado durante el viaje.
El objetivo principal de la aplicacin es que el usuario pueda documentar los
viajes que realiza, tanto de forma escrita con comentarios, como de forma visual con
fotografas y posiciones geogrficas representadas en un mapa de los lugares en los que
ha estado. En definitiva la idea es tener una aplicacin que permita acceder fcilmente y
tenga ordenada toda la informacin que el usuario ha guardado de un viaje.
Conceptos bsicos de la aplicacin:

VIAJE: Periodo de tiempo continuo durante el cual el usuario se encuentra en


un lugar o en varios lugares.

LUGAR: Hace referencia a un sitio en concreto donde el usuario ha estado


durante el viaje. Este concepto puede hacer referencia a monumentos, edificios,
parques, restaurantes, museos,..., es decir todos aquellos lugares de inters que el
usuario crea conveniente recordar durante el viaje o eventos que se han
producido durante el viaje como el encuentro con unos amigos, estancia en un
concierto, etc.

6.2.

Ventana de la Lista de Viajes (Ventana Principal)

Una vez se tiene instalada la aplicacin en el mvil el usuario puede acceder a


ella. La pantalla principal est dividida en dos partes, a las que se acceden desde las
pestaas que se encuentra en la parte superior de la pantalla. La pestaa Viajes
muestra una lista de los viajes que el usuario ha realizado, tal como puede observarse en
la figura 6.1. La primera vez que se usa la aplicacin, esta lista est vaca.

43

Cada elemento de la lista corresponder con un viaje realizado, el cual contendr


la siguiente informacin:

Nombre del viaje


Fecha de inicio y fin del viaje
Estado del viaje

El estado del viaje indica si un viaje se ha realizado o se est realizando, la


aplicacin solo permite que haya un viaje En curso y este debe ser en tiempo real, es
decir, el viaje que se encuentra activo debe tener la Fecha Fin inferior o igual a la
fecha actual, una vez que se supera esa fecha el viaje automticamente cambiara su
estado a Finalizado.
Desde esta misma ventana se tiene la opcin de poder crear un nuevo viaje
pulsando el botn + Nuevo Viaje siempre y cuando no haya ningn viaje En curso,
si no la aplicacin mostrar una ventana emergente que comunicar que no se puede
iniciar un nuevo viaje y que debes cerrar antes el viaje que est activo.
Se tiene la opcin de desplegar un men contextual al dejar pulsado durante un
instante uno de los viajes, ver figura 6.2, apareciendo las siguientes opciones:

Editar: Si se marca esta opcin se pueden modificar los datos del viaje
seleccionado, con la limitacin de que el viaje tiene que estar activo, si ste ha
finalizado no se pueden modificar sus datos.

Eliminar: Se eliminar el viaje seleccionado.

44

Finalizar Viaje: Se tiene la opcin de finalizar un viaje en cualquier momento,


aunque en un principio se hubiera puesto una fecha de final del viaje superior. Si
se selecciona esta opcin el viaje pasar al estado Finalizado, y se cambiar la
fecha de final del viaje que aparece en la lista por la fecha actual. Esta accin es
irreversible, si se finaliza un viaje no podr volver a estar activo.

Adems podemos cambiar a la pestaa Fotos la cual nos muestra un


determinado nmero de carpetas, una por cada viaje realizado. Cada carpeta nos
muestra todas las fotos que se han realizado en un viaje. Vase la figura 6.4.
La nica opcin que aparece en esta ventana al pulsar el botn mnu que
contienen todos los dispositivos con el sistema operativo Android, es la de salir de la
aplicacin.

6.3.

Ventana de Nuevo Viaje

A esta ventana se accede al pulsar el botn + Nuevo Viaje de la pantalla


principal, y muestra un formulario que debe rellenar el usuario. Los campos del
formulario son los siguientes:

Nombre: Dar nombre al viaje y ser el nombre que aparece en la lista de viajes
de la pantalla principal. El usuario es quien segn su criterio pondr nombre al
viaje, dependiendo de qu tipo de viaje se est realizando. Se puede estar
visitando una ciudad o un sitio cuyo nombre sea menos especifico, como puede
ser un viaje por la costa del sol, donde en este caso las ciudades que se visitan

45

correspondern con los lugares visitados del viaje, o por el contrario el viaje
corresponde con una ciudad y seria el nombre del viaje.

Fecha Inicio: Corresponder con la fecha en la que se inicia el viaje.

Fecha Fin: Corresponder con la fecha en la que finalizar el viaje, en caso de


que el usuario decida finalizar el viaje antes de llegar a esta fecha, la nueva fecha
de fin del viaje corresponder con la actual.

Los dos campos relacionados con las fechas (Fecha Inicio y Fecha Fin)
cumplen los siguientes dos requisitos:

Ni la Fecha Inicio ni la Fecha Fin pueden ser menor que la fecha actual.

La Fecha Fin no puede ser menor que la Fecha Inicio.

En caso de que se produjera alguno de estos dos casos explicados no se


permitira crear el viaje, y se le comunicara al usuario para que introdujese las fechas
correctas.
Por ltimo se tiene el botn Crear o Actualizar dependiendo como se haya
accedido a est ventana, si es para la creacin de un nuevo viaje que se quiere realizar o
es para actualizar los datos de un viaje en curso, en este ltimo caso el formulario
aparecera con los datos actuales del viaje, y el usuario modificara los que creyera
convenientes. Vase las figuras 6.3 y 6.4.

46

6.4.

Ventana de la Lista de Lugares

Esta ventana muestra una lista de los lugares que se han visitado en un viaje.
Para acceder a ella hay que seleccionar un viaje de la lista en la pantalla principal.
Vase figura 6.5.

La lista de lugares que se muestra en esta ventana consta del nombre del lugar, la
fecha en la que se estuvo y una fotografa del lugar que el usuario tiene la opcin de
poner en la lista. La seleccin de la foto se realiza mediante un men contextual,
dejando pulsado un lugar de la lista que despliega un men similar al de la pantalla
principal, Vase figura 6.6, y que contiene las siguientes opciones:

Editar: Si se marca esta opcin se pueden modificar los datos del lugar
seleccionado, con la limitacin de que el viaje tiene que estar activo, si es un
viaje ha finalizado no se pueden modificar sus datos.

Eliminar: Se eliminar el lugar seleccionado, antes se pedir una confirmacin


mediante una ventana emergente.

Aadir Foto: Esta opcin permite al usuario seleccionar una foto y asignarla al
lugar seleccionado de la lista, para tener ms informacin si el usuario lo desea.
Al seleccionar esta opcin se abre la galera de fotos que se tenga instalada en el
mvil donde aparecen todas las fotos realizadas por el usuario no solo con esta
aplicacin y este buscara alguna foto realizada en ese lugar para aadirla a la
lista.

47

Quitar Foto: Es la opcin que permite al usuario quitar alguna foto que se
hubiera seleccionado.

Existe un botn en la ventana llamado + Nuevo Lugar que al pulsarlo lleva al


usuario a una ventana con un formulario que al rellenarlo permite aadir un nuevo lugar
que se visitar durante el viaje, esta vista se explicara a continuacin.
Durante esta pantalla si el usuario pulsa el botn men del mvil se despliega
un men inferior que permite por un lado volver a la pantalla principal (Lista de Viajes)
y por otro lado cambiar la vista de la ventana a la de mapa, esta ltima opcin abre un
mapa sobre el cual aparecen marcadas las posiciones de todos los lugares que el usuario
a visitado durante el viaje, en esta vista tambin se puede desplegar un men, l cual
permite cambiar la capa del mapa a la de satlite. Vase figura 6.7 y 6.8.

48

Las posiciones de los lugares visitados aparecen marcadas sobre el mapa con un
icono y corresponde con las coordenadas de cada lugar visitado que se han obtenido
mediante el GPS del mvil, esto se explicar posteriormente en este apartado. Al pulsar
sobre uno de los marcadores se despliega una ventana que indicar al usuario el lugar
que es mediante su nombre y la opcin de ir a la ventana de ese lugar visitado con
informacin ms detallada, nombre, fecha, fotos,.... Vase figura 6.9.

49

6.5.

Ventana de Nuevo Lugar

Es la ventana que permite crear un nuevo lugar que se va a visitar durante el


viaje, se accede a ella desde la ventana que contiene la lista de los lugares visitados en
un viaje, Vase figura 6.10. La ventana contiene un formulario que se rellena con
informacin del lugar. Los campos del formulario son los siguientes:

Nombre: Nombre del lugar, es el que aparecer en la lista de lugares y en la


informacin detallada del lugar.

Ubicacin: Este botn permite obtener las coordenadas del lugar mediante el
GPS del mvil. Al pulsarlo se accede a un mapa que contiene un botn en la
parte superior derecha que hay que pulsar para obtener la posicin actual del
usuario y que esta sea representada en el mapa. Una vez que el usuario puede ver
la posicin representada en el mapa se le da opcin de aceptar si est de acuerdo
con la posicin. Si el usuario acepta se utilizaran las coordenadas para marcar el
lugar en el mapa explicado en el apartado anterior. Vase figura 6.11.

Descripcin: Se da la opcin al usuario si lo desea de poder dar una breve


descripcin para tener informacin del lugar que se va a visitar.

50

Al pulsar el botn Crear se aadir un nuevo lugar visitado al viaje y se pasara


a la ventana de ese nuevo lugar donde se podr obtener informacin ms detallada,
como comentarios sobre el lugar, el contenido que la wikipedia contiene del lugar y las
fotografas realizadas por el usuario del lugar.

6.6.

Ventana Lugar

Al crear o seleccionar un lugar, se mostrar una pantalla que consta de las


pestaas descripcin, wikipedia y fotos, Vase figura 6.12. Tambin incluyen dos
opciones en el men:

Home: Para ir a la pantalla principal

Cmara: Para acceder a la cmara y poder aadir fotos que se asignaran al lugar
que hemos abierto.

En la primera pestaa que nos encontramos, denominada descripcin, se


mostrarn algunos de los datos que hemos rellenado al crear el lugar, como son:

Nombre: Nombre del lugar.

Imagen: Imagen del lugar. Es la misma foto que asociamos a la lista de lugares.

Fecha: Fecha en la que hemos visitado el lugar. Esta fecha est comprendida
entre la fecha de inicio y fecha final del viaje. Esta fecha es tomada
automticamente por la aplicacin cuando es creado el lugar.

51

Descripcin: Breve descripcin del lugar que el usuario puede introducir si lo


desea.

En esta pantalla podemos ir aadiendo comentarios, opiniones o datos de inters


del lugar mediante el botn + Comentario, que se irn aadiendo a una lista de
comentarios. Al mantener pulsado un comentario se desplegar un men contextual, con
las siguientes opciones:

Editar: Esta opcin permite modificar el comentario seleccionado.

Eliminar: Se borrar el comentario seleccionado.

La segunda pestaa, wikipedia nos muestra el artculo que la enciclopedia


libre tiene del lugar que hemos seleccionado anteriormente. Ver la figura 6.13.
Cada vez que accedemos a esta pestaa y hasta que no obtengamos confirmacin
por el usuario, la aplicacin nos preguntar si la informacin mostrada es correcta; si el
usuario est de acuerdo con la informacin que se muestra podr aceptar, entonces el
enlace se guardar de forma automtica y a partir de ahora ser el que se muestre
siempre que decidamos volver a consultar esta pestaa. En el caso de no ser correcta la
informacin, el usuario tendr la opcin de buscar el enlace adecuado y confirmarlo.
Ver la figura 6.14.

52

Y por ltimo, la tercera pestaa, Fotos muestra una galera de fotos, que son
todas las fotos que el usuario realizo de ese lugar accediendo a la cmara desde esta
misma ventana, si se selecciona una foto de la galera esta se muestra en la pantalla.
Cuando una imagen se est visualizando en la pantalla se puede pulsar en ella y
aparecen dos botones que le dan la opcin al usuario de rotar la fotografa a la derecha o
a la izquierda, pasado un breve periodo de tiempo los botones desaparecen pudiendo
volver a pulsar en la fotografa para que aparezcan. Ver figura 6.15.

53

7.

Diseo e implementacin

54

7.1.

Diseo

En este apartado explicaremos el diseo de nuestra aplicacin, mostraremos la


estructura interna, los componentes que hemos usado para desarrollarla, as como la
forma en que estos se unen y comunican entre s.
Hay que destacar que Android se caracteriza por usar el patrn MVC (Modelo
Vista Controlador), por lo que la interfaz, el funcionamiento y los datos de la aplicacin
estn separados en partes distintas y unidos mediante cdigo. La vista, que sera la
interfaz, est compuesta bsicamente por archivos .XML y en determinados
momentos cuando es necesario modificar algo de la vista de forma dinmica hacemos
uso de cdigo Java. El controlador, que sera el funcionamiento de la aplicacin, est
desarrollado por completo en Android (entendiendo que aqu se usa el lenguaje Java
con todos sus mtodo y clases si es necesario), esta parte es la que responde a eventos e
interacciones por parte del usuario de la aplicacin. Y por ltimo el modelo, que hace
referencia a los datos usados, que los almacenaremos en una Base de Datos, en nuestro
caso nos hemos decidido por SQLite3, cuyas ventajas para este tipo de proyectos
(proyecto para dispositivo mvil) son varias, entre las que destacan el hecho de no tener
que hacer uso de un servidor y el poco espacio que necesita, adems de que ya viene
incorporada con el SDK de Android.
La aplicacin est diseada para que se almacene informacin sobre uno o
varios lugares visitados durante un periodo de tiempo determinado por el usuario y
posteriormente se pueda acceder a esa informacin. La aplicacin permite mantener
ordenados los viajes que se realizan y acceder fcilmente a toda la informacin que
contienen, consultando en cualquier momento todo aquello que el usuario guard
durante el viaje.
Se vuelven a recordar en este captulo los conceptos bsicos de la aplicacin:

VIAJE: Periodo de tiempo continuo durante el cual el usuario se encuentra en


un lugar o en varios lugares.

LUGAR: Hace referencia a un sitio en concreto donde el usuario ha estado


durante el viaje. Este concepto puede hacer referencia a monumentos, edificios,
parques, restaurantes, museos,..., es decir todos aquellos lugares de inters que el
usuario crea conveniente recordar durante el viaje o eventos que se han
producido durante el viaje como el encuentro con unos amigos, estancia en un
concierto, etc.

55

Toda la aplicacin gira en torno a estos dos conceptos que estn relacionados
entre s y a los que se les va aadiendo informacin. Se pueden crear todos los viajes
que el usuario quiera realizar, con la condicin de que no puede haber ninguno activo al
iniciar uno nuevo ya que esta aplicacin est pensada para viajes en tiempo real, es
decir, el usuario va recopilando informacin en el mismo momento en que est
viajando. Dentro de un viaje se van aadiendo los distintos lugares que el usuario ha
visitado. Por lo tanto, un viaje tiene dos estados:

Finalizado: cuando un viaje ha terminado, y no podremos aadirle imgenes ni


ningn tipo de informacin, slo podremos consultarlo.

En curso: cuando un viaje est activo, es decir, se puede seguir recopilando


informacin sobre ste, con la condicin como ya se ha comentado
anteriormente, que solo puede haber un viaje activo.

Con la creacin de un viaje nuevo se recopila informacin general de ste por


parte del usuario a travs de un formulario, este formulario recoge:

Nombre del viaje: el usuario dar el nombre que crea que mejor representa a ese
viaje.
Descripcin: Se dar una breve descripcin del viaje.
Fecha de inicio y fin: Periodo de tiempo durante el cual se estar viajando,
aunque el usuario puede modificar estas fechas, respetando ciertas condiciones,
como la de que no puede crear un viaje nuevo con la fecha de inicio inferior a la
actual, o que la fecha final sea menor que la fecha inicial. Si el usuario incumple
alguna condicin ser advertido mediante una notificacin. Adems el usuario
tiene la opcin de finalizar el viaje activo en el momento que desee, debido a
que el viaje se ha acortado por cualquier motivo, por lo que la fecha de fin
pasara a ser la actual y el viaje pasara al estado de Finalizado.

56

Una vez que se tiene un viaje activo se pueden aadir los distintos lugares o
eventos que se van realizando durante el viaje, aqu es donde se recopila la mayor parte
de la informacin.
La primera parte que recoge informacin es un formulario en el que se deben
rellenar los siguientes campos:

Nombre: es el nombre del lugar que estamos visitando.

Posicin del lugar mediante GPS: Se muestra de forma grafica a travs de un


mapa que marcar la posicin actual del usuario, esto es as porque como ya se
ha comentado la aplicacin est pensada para que sea en tiempo real, por lo que
el usuario debe estar en el lugar que se aade, en el momento que quiere
recopilar informacin del mismo. Una vez que el GPS ha obtenido la posicin se
pide confirmacin al usuario de la posicin para que esta sea almacenada.

Descripcin del lugar: algo genrico que describa el lugar, ya que como se
explicar ms adelante el usuario tiene la opcin de aadir todos los comentarios
que desee del lugar visitado.

Como ya se ha comentado, la idea de la aplicacin es la recopilacin de


informacin sobre los lugares visitados, para que el usuario pueda recordar su estancia
teniendo toda la informacin ordenada y fcilmente accesible. El grueso de esta
informacin corresponde con los lugares concretos visitados o los eventos que se han
llevado a cabo:

FOTOS: Corresponde con las fotos que el usuario ha realizado del lugar.

MAPA: Muestra la posicin del lugar sobre un mapa.

COMENTARIO: Son los comentarios que ha realizado el usuario sobre el lugar


que ha visitado y ha credo conveniente recordar.

WIKIPEDIA: Es la informacin que contiene la enciclopedia libre wikipedia


sobre el lugar que se ha visitado y que la aplicacin muestra en una de sus
pestaas.

Para la informacin almacenada en la aplicacin se ha utilizado la base de datos


SQLite3, incorporada en el SDK de Android, se trata de un sistema de gestin de bases
de datos relacional.
A diferencia de los sistemas de gestin de bases de datos cliente-servidor, el
motor de SQLite no es un proceso independiente con el que el programa principal se
comunica. En lugar de eso, la biblioteca SQLite se enlaza con el programa pasando a ser
parte integral del mismo. El programa utiliza la funcionalidad de SQLite a travs de

57

llamadas simples a subrutinas y funciones. Esto reduce la latencia en el acceso a la base


de datos, debido a que las llamadas a funciones son ms eficientes que la comunicacin
entre procesos. El conjunto de la base de datos (definiciones, tablas, ndices, y los
propios datos), son guardados como un slo fichero estndar en la mquina host. Este
diseo simple se logra bloqueando todo el fichero de base de datos al principio de cada
transaccin.
En su versin 3, SQLite permite bases de datos de hasta 2 Terabytes de tamao,
y tambin permite la inclusin de campos tipo BLOB, que son elementos utilizados en
las bases de datos para almacenar informacin de gran tamao que cambian de forma
dinmica.
En nuestro proyecto ha sido necesario crear 3 tablas para almacenar la
informacin de los viajes realizados. Las tablas con sus respectivos campos, son las
siguientes:

Tabla NuevoViaje: Almacena la informacin relevante a un viaje.


o id: Es la clave primaria y se autoincrementa al aadir un nuevo viaje.
o nombre: Indica el nombre del viaje y es obligatorio rellenar este campo.
o fechaInicio: Fecha en la que se inicia el viaje.
o fechaFin: Fecha en la que finaliza el viaje.
o descripcin: Es una breve descripcin del viaje.
o activo: Indica si un viaje esta activo o no (slo puede haber un viaje
activo)

Tabla NuevoLugar: Almacena la informacin relevante a un Lugar.


o id: Es la clave primaria y se autoincrementa al aadir un nuevo lugar.
o nombre: Indica el nombre del lugar y es obligatorio rellenar este campo.
o ubicacin: almacena las coordenadas GPS del lugar.
o descripcin: Es una breve descripcin del lugar.
o wikipedia: Es la direccin web de la wikipedia donde se encuentra
informacin relevante del lugar visitado.
o foto: contiene la ruta hacia la foto que se muestra.
o idViaje: Es el identificador del viaje al que pertenece el lugar visitado.
Con este campo relacionamos la tabla lugares con los viajes.

58

Tabla Comentarios: Almacena los comentarios de los lugares visitados.


o id: Es la clave primaria y se autoincrementa al aadir un comentario
o comentario: es cada uno de los comentarios que podemos aadir en un
lugar.
o idLugar: Es el identificador del lugar al que pertenece el comentario. Con
este campo relacionamos la tabla comentarios con los lugares.
Estas tablas las hemos creado con el siguiente cdigo SQL:

CREATE TABLE NuevoViaje (id INTEGER PRIMARY KEY AUTOINCREMENT,


nombre TEXT NOT NULL,
fechaInicio DATE,
fechaFin DATE,
descripcion TEXT,
activo INTEGER);
CREATE TABLE NuevoLugar (id INTEGER PRIMARY KEY AUTOINCREMENT,
nombre TEXT NOT NULL,
lugar TEXT,
descripcion TEXT,
wikipedia TEXT,
foto TEXT,
idViaje INTEGER);
CREATE TABLE Comentarios (id INTEGER PRIMARY KEY AUTOINCREMENT,
comentario TEXT NOT NULL,
idLugar INTEGER);

1:N

Viajes

Visita

Lugares
1

Escribe
1:N

Comentarios

59

LEYENDA
Entidades fuertes
Entidades dbiles
Entidades dbil en existencia

7.2.

Implementacin

En este apartado explicaremos y mostraremos parte del cdigo de la aplicacin,


obviamente no vamos a mostrar todo el cdigo porque no creemos que eso sea necesario
y daremos por entendido la forma de cmo funcionan y son llamados los mtodos del
SDK de Android, ya que se explico en el apartado 5.
Comentaremos la parte del cdigo que es la base de la aplicacin, no ser comn
mostrar el cdigo completo de las clases que hemos implementado, si no lo normal ser
seleccionar la parte del cdigo ms relevante y es la que se explicar, as como de una
forma genrica, el software que hemos usado para implementarla. El software sern
mtodos y clases de Java y del SDK de Android, como ya hemos comentado en otro
apartado de esta documentacin.
Por otro lado tambin hablaremos del lenguaje de marcas extensibles XML
(siglas en ingls de eXtensible Markup Language), que es un lenguaje de marcas
desarrollado por el World Wide Web Consortium (W3C). Deriva del lenguaje SGML y
permite definir la gramtica de lenguajes especficos (de la misma manera que HTML
es a su vez un lenguaje definido por SGML) para estructurar documentos grandes. En
nuestro caso en concreto es muy utilizado en Android para realizar la interfaz. Android
proporciona un amplio conjunto de objetos View en el paquete Android.view. Estos
objetos varan entre construcciones familiares como EditText, Spinner, TextView y
Button hasta elementos ms especializados como AnalogClock, Gallery, DatePicker,
TimePicker y VideoView.
Comenzamos explicando la pantalla principal de la aplicacin, de la que
destacamos la lista de viajes realizados que muestra el nombre del viaje, la fecha
de inicio y la fecha fin del viaje y por ltimo el estado en que se encuentra el
viaje, en curso o finalizado.
Archivo main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"

60

Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:orientation="vertical" >
<Button
Android:id="@+id/nuevoViaje_button"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:text="@string/nuevoViaje_label" />
<ListView
Android:id="@+id/listaOpc"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent
</ListView>
</LinearLayout >

En primer lugar se modifica el archivo main.xml, decimos modificar puesto que


este archivo se genera al crear el proyecto, los dems archivos .xml se irn creando
conforme sean necesarios. Este tipo de archivo como ya se ha comentado es el
encargado de generar la interfaz y los elementos que son necesarios para la pantalla,
como botones, cuadros, listas, etc. As como la disposicin que tendrn en la pantalla.
Todos los elementos que se vern en la interfaz, en este caso un botn y una lista
de viajes (Button, ListView), se encuentran dentro de un <LinearLayout> que es un
componente que se usa para estructurar los elementos, los atributos ms importante y
los que normalmente se establecen son, layout_width que define el ancho que tomara el
bloque (no hemos credo conveniente explicar los valores que se pueden establecer, ya
que es un estudio que no corresponde a este tema), layout_height que establece el alto y
orientation que establece la forma como se distribuyen los elementos dentro del boque,
en este caso concreto de forma vertical.
Dentro del bloque necesitamos un botn para poder crear un nuevo viaje y una
lista de elementos que ser la que muestre los distintos viajes que el usuario vaya
creando. A cada elemento, en este caso Button y ListView se le da un identificador que
ser con el que se haga referencia cuando se quiere usar o modificar el elemento,
adems se establece la disposicin de los mismos mediante layout_width y
layout_height que al igual que pasaba con <LinearLayout> determina el ancho y alto
respectivamente, de los dos componentes. Como ya se ha dicho no profundizamos ms
en este aspecto porque no es un tema que corresponda a este apartado.
clase principal

DiarioDeViaje.java

En esta clase destacamos los siguientes tres metodos que son onCreate(),
onStart() y cargarLista(). Los dos primeros son mtodos que incorpora el SDK de
Android y que se corresponden con el ciclo de vida de una actividad. El ltimo es un
mtodo privado que permite una mejor estructuracin del cdigo.

61

private
private
private
private

Calendar calend = null;


int yearActual = 0;
int monthActual = 0;
int dayActual = 0;

private ListView listaViajes = null;


/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
calend = Calendar.getInstance();
yearActual = calend.get(Calendar.YEAR);
monthActual = calend.get(Calendar.MONTH);
monthActual++;
dayActual = calend.get(Calendar.DAY_OF_MONTH);
listaViajes = (ListView) findViewById(R.id.lista_viajes);
registerForContextMenu(listaViajes);
listaOpciones.setOnItemClickListener(this);
nv = new NuevoViajeSQLiteHelper(this);
nv.open();
}

Este mtodo es llamado cuando la actividad es creada por primera vez, por eso
lo que hacemos es llamar al archivo main.xml para que se muestren los elementos
creados por ese archivo en la actividad. Estos son detalles que ya se explicaron en un
apartado anterior aunque comentaremos algunas cosas muy brevemente en estos
primeros mtodos para situar al lector un poco mejor dentro del contexto.
Despus de establecer la vista de la actividad se inicializan unas variables que se
usaran para tener la fecha en la que nos encontramos actualmente, necesarias en un
mtodo posterior. Inicializamos el elemento listaOpciones que es del tipo ListView para
mostrar los viajes realizados e indicaremos la accin que deben llevar al acabo cuando
se deje pulsado un elemento de la lista (dejar pulsado un breve instante de tiempo el
elemento para que aparezca un men contextual con distintas opciones), o simplemente
se pulse un elemento de la lista, accin click sobre el elemento.
Finalmente creamos el objeto necesario para acceder a la base de datos y lo
abrimos para poder leer y escribir en ella. La conexin con la base de datos y su uso se
explicara ms adelante en este apartado.
public void onStart(){
super.onStart();
cargarLista();
}

62

Este otro mtodo onStart(), se llama justo a continuacin del mtodo onCreate()
o cuando la pantalla vuelve a estar en primer plano porque ya haba sido llamada
anteriormente, esta parte corresponde al ciclo de vida de Android explicado en el
apartado 5 de esta documentacin. Debido a esto, es aqu donde llamamos al mtodo
cargarLista(), porque si hubiera sido llamado desde el mtodo onCreate() los elementos
de la lista no se actualizaran si esta pantalla volviera a estar en primer plano. Un
ejemplo dentro de esta aplicacin seria al crear un nuevo viaje, en este caso se rellenara
un formulario con los datos del viaje y se pulsara el botn crear que te llevara a una
nueva ventana para aadir los lugares que se visitaran, si desde esta ventana se pulsa el
botn atrs que poseen todos los dispositivos con Android se mostrara de nuevo la
ventana que contiene la lista de los viajes que se ha realizados, y como el mtodo
cargarLista() se llama desde el mtodo onStart() la lista aparecer actualizad con el
nuevo viaje creado.
private void cargarLista(){
viajes = new ArrayList<NuevoViajeBean>();
viajes = nv.selectAll();
for(NuevoViajeBean nuevo: viajes){
if(nuevo.getActivo() == 1){
String fechaActual = dayActual + "/" + monthActual +
"/" + yearActual;
Boolean b = compararFecha(fechaActual,
nuevo.getFechaFin());
if(!b){
nuevo.setActivo(0);
nv.update(nuevo);
viajes = nv.selectAll();
}
}
}
Adaptador adaptador = new Adaptador(this, viajes);
listaViajes.setAdapter(adaptador);
}

El ultimo mtodo que explicamos de la clase principal es cargarLista(), un


mtodo privado que es el encargado de listar los viajes en la pantalla.
En primer lugar creamos un ArrayList de NuevoViajeBean , que es un Bean, es
decir, un objeto que nos ayuda a manejar los datos necesarios para crear un nuevo viaje.
Una vez creado el ArrayLista lo inicializamos con todos los viajes que tenemos
almacenados en la base de datos y a continuacin los recorremos para comprobar cul
es el viaje que se encuentra activo en estos momentos y comprobar si ese viaje debe
finalizarse o no debido a que haya superado la fecha en que finalizaba el viaje. Si es as

63

el estado del viaje cambia a Finalizado como el del resto de viajes si los hubiera, si no
se mostrar como activo. De esta forma los viajes se finalizan de forma automtica
cuando se traspasa la fecha que puso el usuario como final del viaje, aunque se da la
opcin, como ya se ha explicado, que el usuario finalice el viaje antes de la fecha que
marc como fin, si as lo deseara.
Finalmente creamos un nuevo objeto de la clase Adaptador, que es una clase que
hemos creado y explicaremos a continuacin, a la que le pasamos el array viajes y a
continuacin a la lista de viajes (listaViajes) le cambiamos mediante el mtodo
setAdapter() el adaptador que viene por defecto por el recin creado por nosotros, para
personalizar as la forma como se mostrarn los distintos elementos de la lista, es decir
mostrar la informacin de los distintos viajes, que hemos decidido que fuera el nombre,
fecha de inicio, fecha fin y estado del viaje.
De la clase Adaptador destacamos el mtodo getView() que es donde se
establecen los datos que se quieren mostrar en cada elemento de la lista. Aunque como
se ve a continuacin en el cdigo tambin se encuentra el constructor que inicializa el
contexto que hace referencia a la activity desde la que se llama a esta clase, en este caso
concreto desde la actividad principal DiarioDeViaje.java, y tambin se inicializa la
variable datos con el parmetro que se le pasa datos, que es la lista de todos los viajes
realizados hasta el momento. Al haber llamado igual tanto a las variables como a los
parmetros que se pasan hemos tenido que utilizar la palabra reservada en Java this.
Esto ltimo ha sido una simple apreciacin para el lector, ya que esto no corresponde a
este apartado, ni siquiera a este proyecto, ya que el objetivo no es hacer un manual de
java si no usar java(concretamente el SDK de Android, que est escrito en Java) para
realizar un proyecto.
A continuacin encontramos los mtodos getCount(), getItem() y getItemId(),
que junto con getView() son necesarios implementar debido a que extendemos de la
clase BaseAdapter. El primero de ellos, getCount(), devuelve un valor de tipo int con el
tamao del array que inicializamos en el constructor, en caso de tener que usarlo esto se
traduce para nuestra aplicacin en el nmero de viajes que llevamos realizados. El
mtodo getItem(int arg0) devuelve un objeto, que en nuestro caso correspondera con
un viaje realizado, concretamente el viaje que se ha seleccionado en la lista, devolvera
el Bean correspondiente con ese viaje, y por tanto tendramos un objeto con toda la
informacin del viaje seleccionado. El tercer mtodo getItemId(int arg0) devulve el id
del viaje que se ha seleccionado. Son mtodos de relativa importancia, ya que la
informacin que devuelven es necesaria en caso de tener que manipular los distintos
viajes que se realizan. A continuacin se muestra el cdigo completo de la clase
Adaptador y a continuacin se explicar el mtodo getView(), que como ya se ha dicho
es el ms destacado de esta clase.

64

public class Adaptador extends BaseAdapter {


private Context context = null;
private ArrayList<NuevoViajeBean> datos = null;
public AdaptadorP(Context context, ArrayList<NuevoViajeBean>
datos){
super();
this.context = context;
this.datos = datos;
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return datos.size();
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return datos.get(arg0);
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return arg0;
}
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
LayoutInflater

inflater

LayoutInflater.from(context);

View item = inflater.inflate(R.layout.lista_personalizada,


null);
TextView nombre = (TextView)
item.findViewById(R.id.nombreLista_id);
nombre.setText(datos.get(arg0).getNombre());
TextView activo = (TextView)
item.findViewById(R.id.activo_id);
if(datos.get(arg0).getActivo() == 1){
item.setBackgroundColor(Color.argb(127,124,252,0));
activo.setText("En curso");
}else{
item.setBackgroundColor(Color.argb(127,220,20,60));
activo.setText("Finalizado");
}
TextView fechaInicio = (TextView)
item.findViewById(R.id.fechaInicio_id);
fechaInicio.setText("Del " +

65

datos.get(arg0).getFechaInicio());
TextView fechaFin = (TextView)
item.findViewById(R.id.fechaFin_id);
fechaFin.setText(" al " + datos.get(arg0).getFechaFin());
return item;
}
}

Lo primero que hacemos en el mtodo getView() es aadir a la interfaz un nuevo


archivo .xml, en este caso lista_personalizada.xml mediante la clase LayoutInflater,
que personalizar cada elemento de la lista, este archivo ser explicado a continuacin.
Despus lo que se aade es el nombre del viaje, se comprueba si ste est en curso o
finalizado para indicarlo mediante texto y tambin para cambiar el color de fondo de
ese elemento de la lista, para distinguir visualmente entre uno u otro (rojo significa
finalizado y verde en curso). Y por ltimo se aade la fecha de inicio, la fecha de
finalizacin y la descripcin del viaje.
Para personalizar la lista de viajes se usa el archivo lista_personalizad.xml, el
cual se utliza desde el mtodo getView() de la clase adaptador.
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:Android="http://schemas.Android.com/apk/res/Android"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical" >
<RelativeLayout
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="horizontal" >
<TextView
Android:id="@+id/nombreLista_id"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="bold"
Android:textSize="25dp" />
<TextView
Android:id="@+id/activo_id"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="normal"
Android:layout_alignParentRight="true"
Android:textSize="15dip" />
</RelativeLayout>
<LinearLayout
Android:layout_width="match_parent"

66

Android:layout_height="match_parent"
Android:orientation="horizontal" >
<TextView
Android:id="@+id/fechaInicioLista_id"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="normal"
Android:textSize="15dp" />
<TextView
Android:id="@+id/fechaFinLista_id"
Android:layout_width="wrap_content"
Android:layout_height="wrap_content"
Android:textStyle="normal"
Android:textSize="15dp" />
</LinearLayout>
</LinearLayout>

Con este archivo XML queremos personalizar la forma como se muestran el


nombre, estado, fecha de inicio y la fecha fin de cada viaje que ha realizado el usuario.
Esta informacin se va a dividir en dos bloques, en primer lugar se quiere mostrar en la
parte superior de cada elemento de la lista el nombre del viaje y el estado en que se
encuentra por ello se crea un primer bloque a partir de un <RelativeLayout>, en este
caso hay que destacar que no se usa un <LinearLayout> debido a que se quiere
modificar la posicin de los elementos dentro de este bloque, por un lado el nombre del
viaje en la parte izquierda del bloque, esto es por defecto, y por otro lado el estado en el
que se encuentra el viaje, ya sea en curso o finalizado, en la parte derecha como puede
verse en el cdigo con la lnea Android:layout_alignParentRight="true", dentro del
objeto TextView que corresponde con el estado del viaje. En segundo lugar, el bloque
que muestra las fechas del viajes que se ponen con un simple <LinearLayout>.
La lista de lugares visitados, que son los lugares que se han visitado en cada
viaje realizado, tiene una implementacin muy similar a la lista de viajes explicada
anteriormente pero variando los elementos que se muestran, que en este caso es el
nombre, descripcin y una sola fecha (fecha en la que se visito el lugar) y con la mayor
diferencia que es la posibilidad de mostrar una imagen del lugar en la lista. Para ello en
el men contextual de la lista hay la opcin de Aadir Foto, que al pulsar sobre ella
abre la galera de fotos donde se puede seleccionar una. A continuacin se muestra el
trozo de cdigo que lo implementa.
case R.id.Foto:
Intent inte = new Intent(Intent.ACTION_PICK,
Android.provider.MediaStore.Images.Media.INTERNAL_CONTENT_U
RI);
code = SELECT_PICTURE;
startActivityForResult(inte, code);
break;

67

Este trozo de cdigo se encuentra dentro del mtodo que genera el men
contextual onContextItemSelected() de la clase Viaje.java, que no hemos visto
necesario explicar su implementacin. Lo que se hace es comprobar dentro del men si
la opcin seleccionada era la de aadir una foto y si es as lanzar un intent mediante el
mtodo startActivityForResult() que abrir la galera de fotos. Cuando se selecciona
una foto de la galera se llama al mtodo onActivityResult() que es el encargado de
procesar la respuesta. Lo nico que se hace en este mtodo es volver a llamar al mtodo
cargarLista() para que actualice de nuevo la lista de lugares visitados mostrando
tambin la foto que se ha seleccionado.
protected void onActivityResult(int requestCode, int resultCode,
Intent data){
if(requestCode == SELECT_PICTURE){
cargarLista();
}
}

NuevoViaje.java
Esta es la clase que se encarga de rellenar el formulario necesario para la
creacin de un nuevo viaje, esta clase recibe una serie de datos por parte del usuario,
como es el nombre que quiere dar al viaje y las dos fechas que delimitaran el periodo de
tiempo que durar el viaje. De esta clase hemos destacado el efecto que se produce al
pulsar sobre los campos que solicitan las fechas y que es la aparicin de una ventana
emergente, denominado selector de fechas, para que el usuario pueda introducir las
fechas de una forma grafica y no mediante texto utilizando el teclado, adems de la
ventaja de ser ms cmodo e intuitivo para el usuario, tiene la ventaja de que nos
aseguraremos que el usuario introduzca los valores de fechas con el formato adecuado.
private EditText fechaInicioEdit = null;
private EditText fechaFinEdit = null;
private
private
private
private

Calendar calendar = null;


int year = 0;
int month = 0;
int day = 0;

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.nuevo_viaje);
fechaInicioEdit = (EditText)
findViewById(R.id.fechaInicio_edit);
fechaFinEdit = (EditText)findViewById(R.id.fechaFin_edit);

68

calendar = Calendar.getInstance();
year = calendar.get(Calendar.YEAR);
month = calendar.get(Calendar.MONTH);
day = calendar.get(Calendar.DAY_OF_MONTH);
lanzarEvento(fechaInicioEdit);
lanzarEvento(fechaFinEdit);
}

Lo primero que vamos a ver es el mtodo onCreate(). Lo primero como siempre


es definir el archivo XML que contiene la interfaz que para esta actividad es
nuevo_viaje.xml. Despus inicializamos las variables fechaInicioEdit y fechaFinEdit
con los objetos view correspondientes que estn en el archivo XML recin cargado,
adems de inicializar la variables necesarias para obtener la fecha actual. Una vez que
se tienen todas la variables que son necesarias inicializadas, se llama al mtodo privado
lanzarEvento(View v) encargado de lanzar el selector de fechas cuando corresponda.
private void lanzarEvento(View v){
v.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
showDialog(DATE_DIALOG_ID);
}
});
v.setOnFocusChangeListener(new OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus) {
// TODO Auto-generated method stub
if(hasFocus){
showDialog(DATE_DIALOG_ID);
}
}
});
}

Este mtodo se encarga de comprobar cuando se selecciona alguno de los


campos de fechas que tiene el formulario para crear un nuevo viaje y poder hacer visible
el selector de fechas. Para ello se utilizan dos eventos sobre el objeto View pasado por
parmetro, que son setOnclickListener() y setOnFocusChangeListener(). Se necesita
llamar a los dos por las siguientes razones, si solo se pusiera el mtodo que se ejecuta
cuando se cambia el focus (FocusChangeListener) si se quiere modificar una fecha que
en ese momento tiene el focus no se lanza el selector de fechas, y por el contrario si solo
se tuviera el evento que se lanza cuando se hace click (clickListener) habra que pulsar
dos veces sobre el campo fecha, porque en una primera pulsacin el campo
correspondiente obtiene el focus y en una segunda pulsacin es cuando se entiende

69

como el efecto de hacer click. Por todo lo explicado anteriormente son necesario los dos
eventos, as si el usuario cambia el focus entre los dos campos de fechas (fecha de
inicio y fecha fin) se lanza el segundo evento (setOnFocusChangeListener()) y se
muestra el selector, adems se comprueba que los dos objetos View sean los que
contienen el focus mediante la condicin hasFocus, para evitar que si se cambia el
focus a otro campo que no sea uno de fechas no se lance el selector. Finalmente cuando
uno de los dos eventos, dependiendo de la accin del usuario, llama al mtodo
showDialog(int id) que es el que hace visible el selector de fechas y para ello se ejecuta
de forma implcita el cdigo que contiene el mtodo protegido onCreateDialog que es el
que realmente abre la ventana emergente (selector de fechas).
protected Dialog onCreateDialog(int id){
Dialog d = null;
switch (id) {
case DATE_DIALOG_ID:
d = new DatePickerDialog(this, mDateSetListener,
year, month, day);
break;
default:
break;
}
return d;
}

Este mtodo es el encargado de gestionar todos las ventanas emergentes (se


denominan en Android Dialog, como puede ser el selector de fechas) que se abren en la
actividad correspondiente. Por tanto comprueba cual es el Dialog al cual se est
llamando y crea un nuevo Dialog que es el que se devuelve y ser mostrado.

NuevoLugar.java
Al igual que suceda en la clase NuevoViaje.java esta clase se encarga de
gestionar los datos introducidos por el usuario en un formulario. De esta clase, como
pasaba con la clase anterior, vamos a explicar parte del cdigo y lo ms destacado es la
obtencin de la posicin del lugar que se visita mediante coordenadas GPS y
representarla de forma grfica en un mapa utilizando la API de google y el
GoogleMaps.
public class NuevoLugar extends Activity {
private Button ubicacion = null;
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.nuevo_lugar);
ubicacion = (Button) findViewById(R.id.ubicacion_id);
ubicacion.setOnClickListener(new OnClickListener() {

70

@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
Intent intent = new Intent(contexto,
MapaUbicacion.class);
startActivity(intent);
}
});

El cdigo anterior solo es una parte de la clase NuevoLugar.java, del que vamos
a explicar el campo ubicacin que aparece en la aplicacin al crear un nuevo lugar
visitado en un viaje. Para ello en el mtodo onCreate() en primer lugar y como siempre
se hace referencia al archivo XML que contendr la interfaz que se mostrar en la
aplicacin. A continuacin creamos un objeto de tipo Button, el cual inicializamos con
el botn creado en archivo XML al que hemos hecho referencia anteriormente mediante
el mtodo findViewById(). Una vez que tenemos la variable ubicacin creada
cambiamos, utilizando el mtodo setOnClickListener(), la accin que se lleva a cabo al
pulsar sobre el botn. Esta accin es la de ejecutar una nueva activity con el nombre
MapaUbicacin.
private MapView mapa = null;
private MapController controlMap = null;
private LocationManager locManager = null;
private LocationListener locListener = null;
private
private
private
private

LayoutInflater myInflater = null;


View overView = null;
ImageView ubicacion = null;
Button aceptar = null;

public void onCreate(Bundle savedInstanceState){


super.onCreate(savedInstanceState);
setContentView(R.layout.mapa);
myInflater = LayoutInflater.from(this);
View overView =
myInflater.inflate(R.layout.mapa_superpuesto, null);
this.addContentView(overView, new
LayoutParams(LayoutParams.FILL_PARENT,
LayoutParams.FILL_PARENT));
ubicacion = (ImageView) findViewById(R.id.ubicacion);
ubicacion.setOnClickListener(this);
aceptar = (Button) findViewById(R.id.boton_aceptar);
aceptar.setOnClickListener(this);
locManager = (LocationManager)
getSystemService(Context.LOCATION_SERVICE);

71

locListener = new MiLocationListener();


locManager.requestLocationUpdates(LocationManager.GPS_PROV
IDER, 0, 0, locListener);
}

Esta nueva activity es la que se encarga de obtener mediante coordenadas GPS la


posicin actual del usuario y mostrar sobre un mapa, para ser visualizada. Para mostrar
cmo se hace se van a explicar los mtodos ms importantes de la activity.
En primer lugar tenemos, como se muestra ms arriba, el mtodo onCreate() que
adems del ya comentado mtodo setContentView(), que en esta activity aade un mapa
que usaremos para representar las coordenadas y que se explicara ms adelante el
archivo XML que se emplea, se hace uso de la clase LayoutInflater, que junto con los
mtodos inflate() y addContentView(), nod sirve para aadir dos botones sobre la
interfaz original ya mencionada que contiene el mapa de Google, uno de ellos para
obtener las coordenadas y el otro para aceptar si el usuario est de acuerdo con la
posicin que se ha recibido en el mapa.
A continuacin se asigna a los dos botones ya mencionados, ubicacin y
aceptar, las acciones que se llevaran acaba al pulsar sobre ellos mediante el mtodo
setOnClickListener(), en este caso se, la accin que se realiza al pulsar, se ha
implementado en un mtodo a parte que se explicara ms adelante.
Por ltimo, dentro del mtodo onCreate(), se tiene lo ms importante dentro de
este mtodo y que es la inicializacin de las variables locManager y locListener, que
ayudndonos de una clase interna llamada MiLocationListener() podemos hacer uso del
GPS del dispositivo.
private class MiLocationListener implements LocationListener{
@Override
public void onLocationChanged(Location location) {
// TODO Auto-generated method stub
comprobarRecibeCoordenadas = true;
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
comprobarDispositivo = false;
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
comprobarDispositivo = true;
}
@Override

72

public void onStatusChanged(String provider, int status,


Bundle extras) {
// TODO Auto-generated method stub
}
}

Esta clase interna , que se encuentra dentro de la clase MapaUbicacin, contiene


cuatro mtodos de los que hemos usado tres y que son llamado de forma implcita
cuando se produce algn evento relacionado con ellos. El primero es llamado cuando se
produce un cambio de coordenadas, el segundo cuando el GPS esta desactivado y el
tercero cuando el GPS esta activo. Para saber si se ha producido alguno de estos casos
que acabamos de describir, usamos las variables comprobarRecibeCoordendas y
comprobarDispositivo.
public void onClick(View v) {
// TODO Auto-generated method stub
switch (v.getId()) {
case R.id.ubicacion:
if(comprobarDispositivo){
if(!comprobarRecibeCoordenadas){
Toast.makeText(contexto, "Coordenadas no
disponibles", Toast.LENGTH_LONG).show();
}else{
loc =
locManager.getLastKnownLocation(LocationManager
.GPS_PROVIDER);
latitud = loc.getLatitude()*1E6;
longitud = loc.getLongitude()*1E6;
Toast.makeText(contexto, "logitud: " + longitud
+ " latitud: " + latitud,
Toast.LENGTH_LONG).show();
drawable =
this.getResources().getDrawable(R.drawable.marc
ador);
geoPoint = new GeoPoint(latitud.intValue(),
longitud.intValue());
MyOverlay itemizedOverlay = new
MyOverlay(drawable);
mapOverlays = mapa.getOverlays();
OverlayItem overlayItem = new
OverlayItem(geoPoint, "Hola", "Hola");
itemizedOverlay.addOverlay(overlayItem);
mapOverlays.add(itemizedOverlay);
aceptar.setVisibility(1);
controlMap.setCenter(geoPoint);
controlMap.setZoom(16);

73

}
}else{
Toast.makeText(contexto, "El GPS esta desactivado",
Toast.LENGTH_LONG).show();
}
break;
case R.id.boton_aceptar:
locManager.removeUpdates(locListener);
Intent intent = new Intent(contexto,
NuevoLugar.class);
startActivity(intent);
break;
default:
break;
}
}

En el mtodo onClick() se implementa, como ya se ha comentado, la accin que


se lleva a cabo al pulsar sobre los botones ubicacin y aceptar. En cuanto al primero, lo
que se hace es comprobar la variable comprobarDispositivo, inicializada en la clase
privada MiLocationListener, para saber si el GPS esta activado o no, en caso negativo
se informa al usuario, si no se comprueba la otra variable,
comprobarRecibeCoordenadas, tambin inicializada en la mencionada clase interna
que nos dir si se estn recibiendo coordenadas GPS, si no es as, se comunicara al
usuario que an no hay coordenadas disponibles debido a que el GPS est intentando
obtenerlas. Una vez que se obtienen, se almacenan en las variables latitud y longitud, y
con la ayudad de las clases Drawable y GeoPoint del SDK de Android y una nueva
clase interna llamada MyOverlay se dibuja sobre el mapa con un marcador(un icono
grfico) la posicin que se ha obtenido. Posteriormente se hace visible sobre la pantalla
el botn aceptar, para que el usuario de su conformidad sobre la posicin y por ultimo
se centra el mapa sobre el punto recientemente localizado.
La otra opcin del mtodo onClick(), es la de pulsar el bton aceptar para
confirmar que es la posicin deseada y dejar esta pantalla. Antes de abandonarla se
utiliza el mtodo removeUpdates() para parar que el GPS siga buscando coordenadas,
puesto que al salir de esta pantalla que contiene el mapa ya no es necesaria la funcin
del GPS, y evitar as un gasto de batera adicional.
A partir de ahora explicaremos parte del cdigo que usamos para almacenar la
informacin de los lugares visitados, como es el uso de la cmara, la pestaa donde se
pueden ver las fotos realizadas y la informacin que contiene la enciclopedia libre
Wikipedia sobre el lugar visitado.

74

CAMARA
case R.id.camara_id:
Date fecha = new Date();
String file = fecha.getDay() + "-" + fecha.getMonth() + "-"
+ fecha.getYear() + "_" + fecha.getHours() + "-" +
fecha.getMinutes() + "-" + fecha.getSeconds() + ".jpg";
rutaFoto = new File(rutaLugar, file);
Intent i = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
Uri output = Uri.fromFile(rutaFoto);
i.putExtra(MediaStore.EXTRA_OUTPUT, output);
startActivity(i);
break;

Este cdigo se encuentra dentro del mtodo onOptionsItemSelected() que es el


que se encarga de llevar a cabo una accin cuando se pulsa una opcin en el men de la
pantalla. Al optar por la opcin de la cmara se ejecuta el cdigo anterior. En primer
lugar se obtienen la fecha y la hora actual, que corresponder a la fecha y hora en que se
realiza la foto y se almacena en una variable llamada file, esta variable es la que
utilizaremos para nombrar la fotografa que se realice. A continuacin obtenemos la ruta
donde almacenar la foto, a partir de la variable rutaLugar que ya tenemos inicializada
dentro de la clase donde se encuentra el cdigo y que corresponde con una carpeta
creada para esta aplicacin cuando se instala por primera vez, y con la variable anterior
file terminado en .jpg para que corresponda con un formato de imagen. Una vez se tiene
la ruta lanzamos la cmara a travs de una de las aplicaciones que tenga nuestro mvil,
por defecto, Android siempre trae una aplicacin para la cmara, en el caso de que
hayamos instalado nosotros una de terceros, la aplicacin preguntar con cual queremos
abrir, para abrir la cmara usamos un intent y le indicamos la ruta donde guardar el
archivo, finalmente lanzamos la actividad.
WIKIPEDIA
Para obtener la informacin de wikipedia nos apoyamos en el nombre que el
usuario le da al lugar en el momento de crearlo y junto con la direccin
"http://es.m.wikipedia.org/w/index.php?title=Special%3ASearch&search=" que vimos
que era la que utilizaba wikipedia para redireccionar al artculo que se est buscando y
si no coincide la palabra buscada con un artculo te redirecciona a los artculos
relacionados o que ms se ajustan a la palabra buscada donde puedes elegir el correcto,
para ello tambin aadimos una notificacin y un botn que aparece la primera vez que
quieres ver la informacin en la wikipedia, la notificacin te pregunta si ests de
acuerdo con el artculo mostrado para que aceptes con el botn, en caso contrario

75

puedes buscar el artculo que describe el lugar visitado y aceptas. En el momento que se
acepta el artculo que se encuentra a la vista es el que se mostrar en sucesivas visitas a
la pestaa de wikipedia. Lo hicimos finalmente de esta manera porque aunque
estuvimos buscando alguna api de wikipedia que pudiramos usar aplicndola a nuestra
aplicacin y dentro de nuestro cdigo no la encontramos finalmente y nos decidimos
por esto.
Para poder usar nuestra aplicacin como un navegador web mostrando as
informacin de internet y no tener que usar un navegador externo a nuestra aplicacin
para ver contenido de la web hay que definir un elemento WebView en un archivo .xml,
este elemento lo definimos en el archivo lugar.xml que es donde se define toda la vista
para la pantalla donde se muestra la informacin de un lugar.
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.lugar);
myWebView = (WebView) findViewById(R.id.webview);
myWebView.loadUrl(cadena);
myWebView.setWebViewClient(new verMiWeb());
}

En el mtodo onCreate() a parte de las lneas de cdigo que se pueden ver hay
varias lneas de cdigo ms que no hemos puesto porque no son relevantes para explicar
el funcionamiento de la informacin que se muestra de la wikipedia y que si la
hubiramos puesto ocupara demasiado espacio, por lo tanto hemos puesto lo necesario
para explicar lo deseado. En primer lugar inicializamos la variable myWebView con el
elemento que se encuentra en el archivo Lugar.xml. Para cargar el artculo de wikipedia
correspondiente en nuestra aplicacin usamos el mtodo loadUrl que recibe la variable
cadena, esta variable est inicializada con la direccin mencionada anteriormente ms
el nombre que se le dio al lugar por parte del usuario, estas dos cadenas se unen usando
un mtodo privado dentro de la misma clase donde va el mtodo onCreate(). Finalmente
tenemos la llamada al mtodo setWebViewClient() que recibe una clase privada que
hemos implementado, y que sirve para evitar que se abra un navegador externo a
nuestra aplicacin, gracias a este mtodo siempre estaremos navegando por internet
dentro de nuestra aplicacin.
FOTOS
Para visualizar las fotos hemos creado una galera. En el sdk de Android se
encuentra un componente que nos sirve para implementar la galera de fotos, y se
denomina Gallery, este componente lo creamos en el archivo Lugar.xml y lo llamamos
desde la clase Lugar.java similar a lo que suceda con el elemento WebView para crear
el navegador interno de nuestra aplicacin.

76

public void onCreate(Bundle savedInstanceState) {


super.onCreate(savedInstanceState);
setContentView(R.layout.lugar);
Gallery gallery = (Gallery)findViewById(R.id.gallery);
gallery.setAdapter(new ImageAdapter(this));
gallery.setOnItemClickListener(this);
}

Lo primero es asociar el archivo Lugar.xml a nuestra actividad. A continuacin


inicializamos la variable gallery con el elemento que hemos creado en el archivo .xml,
una vez inicializado utilizamos el mtodo setAdapter() para cambiar el adaptador de la
galera por uno personalizado por nosotros. Finalmente mediante el mtodo
setOnItemClickListener() implementaremos la accin a llevar a cabo cuando se
seleccione una foto de la galera, esta accin ser la de colocar la foto en la pantalla para
verla.
public View getView(int position, View convertView, ViewGroup parent)
{
ImageView imageView = new ImageView(this.contexto);
FileInputStream fd;
try {
fd = new FileInputStream(fotos[position]);
Bitmap
bitmapFoto
BitmapFactory.decodeFileDescriptor(fd.getFD());

Bitmap scaled = Bitmap.createScaledBitmap(bitmapFoto, 200,


200, true);
imageView.setImageBitmap(scaled);
imageView.setLayoutParams(new Gallery.LayoutParams(150,
120));
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return imageView;
}
}

De la clase interna ImageAdapter que sirve para personalizar la galera a nuestro


gusto destacamos el mtodo getView() que es el que configura cada fotografa para que
se previsualice en el elemento Gallery. En primer lugar inicializamos la variable
imageView que es donde se almacenarn cada una de las fotos que se visualizarn.
Despus creamos un objeto de tipo File con el que obtenemos la ruta de la imagen a
colocar en la galera, lo hacemos con la ayuda de la lista fotos que contiene las rutas de
todas las fotos que se hicieron con la cmara desde la pantalla de un lugar concreto. A

77

continuacin se crea un objeto Bitmap para poder trabajar con una imagen, este objeto
se crea a partir del archivo anterior, posteriormente se utiliza este bitmap para crear uno
nuevo pero con la escala deseada, para poder reducir el tamao original de una foto y
pueda previsualizarse en la galera. Finalmente se asocia el ltimo Bitmap creado al
elemento ImageView que hemos formado al principio, para que aparezcan en la galera
mediante la utilizacin del mtodo setImageBitmap() y por ultimo cambiamos el ancho
y alto de la galera con el mtodo setLayoutParams().

78

8.

Pruebas

79

El SDK de Android permite integrar dispositivos virtuales para probar la


aplicacin en el entorno de desarrollo Eclipse. Queda a disposicin del usuario crearse
cuantos emuladores quiera y con las caractersticas que se desee. Esta flexibilidad
permite entre otras cosas, establecer la versin de sistema operativo en la que se
ejecutara, el tipo de pantalla, su resolucin, cantidad de memoria...
Para realizar las pruebas hemos creado un emulador que implementa la versin
2.2 otro con la versin 2.3 de Android, puesto que estas son las ms comunes entre los
terminales Android.
En todo momento se realizaban pruebas en uno y otro emulador para poder
observar las diferencias de ejecucin entre una versin y otra. Las diferencias entre
velocidades de ejecucin y acceso a Internet eran casi siempre mnimas, siendo lo ms
destacable los cambios a nivel de interfaz debido a la leve diferencia de resolucin de
pantallas, permitiendo de esta manera ajustar mejor el tamao y apariencia de la
informacin a mostrar para una correcta presentacin.
Cada vez que acabbamos una parte de la aplicacin, la probbamos en cada uno
de los emuladores para su correcto funcionamiento.
Esta comprobacin era principalmente en cuanto a interfaz y cumplimiento de
funcionalidades, puesto que las pruebas se realizaban sobre un emulador. De esta
manera la optimizacin de cdigo se deja para la fase final de la aplicacin cuando ya
pueda ser probada en un dispositivo real.
En nuestro caso no tuvimos problemas para probar la aplicacin en el emulador
de Android a excepcin de la cmara, puesto que no se puede ejecutar ninguna cmara
desde el emulador, sin embargo si es posible emular coordenadas GPS para simular un
punto del mapa.
Una vez terminada la aplicacin y habiendo sido probada en el emulador nos
decimos por hacer una prueba real de la misma. La nica forma de llevar a cabo una
prueba de nuestra aplicacin es realizar un diario de viaje en vivo, por tanto tomamos el
mvil y salimos por alguna de las zonas tursticas de Sevilla probando as la aplicacin.
De esta manera probamos la localizacin GPS de una forma real y tambin la cmara
que fue algo que no puedo realizar en el emulador.
Este viaje lo realizamos en la ciudad de Sevilla, en primer lugar creamos un
nuevo viaje al que se le dio el nombre de Sevilla, en relacin a la ciudad que estbamos
visitando, se introdujeron las fechas en las que se visit, fecha de incio y fecha de fin
del viaje, ambas fechas coincidieron en nuestro caso ya que realizamos la prueba real de
la aplicacin en un solo da.
Una vez creado el viaje, visitamos los distintos lugares tursticos, para cada uno
de ellos se crea un nuevo lugar en la aplicacin rellenando el nombre, descripcin y
obteniendo la posicin GPS del mismo. Y se iban realizando las fotos de cada lugar.
Los lugares visitados fueron:

80

Ayuntamiento de Sevilla
Catedral de Sevilla
Reales Alczares de Sevilla
Archivo de Indias
Plaza de toros de Sevilla
Torre del Oro
Parlamento de Andaluca

La siguiente imagen es una captura de la aplicacin con las posiciones GPS


representadas en el GoogleMaps con los lugares visitados.

81

Estas son algunas de las fotos realizadas durante la prueba real de la aplicacin.

82

83

9.

Ampliaciones

84

Esta aplicacin est preparada para futuras ampliaciones, las cuales pueden ser
tanto de mejora de la interfaz como de incorporacin de nuevas funcionalidades.
Una de las mejoras ms interesante que vemos para este proyecto es la creacin
de un servicio web, este servicio mostrara de forma online lugares tursticos para que el
usuario de la aplicacin pudiera saber que puede visitar en su alrededor y la informacin
del mismo.
Se ha pensado que este servicio web se construira con la ayuda de aquellos
usuarios que quisieran colaborar, los usuarios deberan registrarse y al documentar un
lugar turstico, se dara la oportunidad al usuario de subir ese lugar si lo desea,
guardndose as la posicin GPS del lugar, comentarios que ha hecho el usuario, enlace
de wikipedia y alguna fotografa que quisiera subir.
Una vez creado el servicio web con zonas tursticas se podra crear una opcin
de indicacin dentro del mapa que te indica la posicin del lugar, a semejanza con el
Google Maps, para mostrar la ruta desde la posicin que se encuentra el usuario hasta
el lugar turstico al que se quiere ir.
En cuanto a la interfaz de la aplicacin somos conscientes de las mejoras que se
pueden realizar. Al estar realizando un proyecto de fin de carrera hemos puesto mayor
inters en la parte funcional de la aplicacin y por supuesto en la documentacin de la
misma, ya que el objetivo de un proyecto fin de carrera es el demostrar que se tiene los
conocimientos necesarios para llevar a cabo un proyecto y no el proyecto en s, aunque
esta ltima parte siempre es importante, pero sabemos que en un mundo laboral real este
aspecto sera fundamental y que la mejora de la parte visual de la aplicacin sera lo
primero en mejorar para una posible comercializacin.
Como se acaba de comentar el objetivo de un proyecto fin de carrera es la
demostracin de que se tiene los conocimientos para disear y llevar a cabo un
proyecto, en nuestro caso informtico, y es donde se pone mayor inters. Por tanto el no
llevar a cabo estas mejoras comentadas anteriormente no es por falta de ambicin si no
por falta de tiempo real.

85

10. Conclusiones

86

La finalizacin del proyecto final de carrera representa uno de esos momentos de


la vida en los que merece la pena echar la vista atrs y hacer balance de todo lo pasado.
No slo significa el fruto de varios meses de desarrollo, sino que su entrega simboliza
tambin la conclusin de toda una carrera a travs de muchos aos de entrega, sacrificio
y duro trabajo. Las sensaciones que tenemos tras acabar este Proyecto Fin de Carrera
son muy positivas.
Nuestro objetivo principal, aprender todo lo posible sobre el desarrollo de
aplicaciones para mviles bajo la plataforma Android ha sido cumplido.
El desarrollo de Android, nos ha servido para tener una base de cara a futuros
desarrollos, que seguro sern mucho ms rpidos y giles.
Tambin hemos podido comprobar que es posible desarrollar una aplicacin
desde cero utilizando exclusivamente herramientas libres. Para un estudiante esto
supone unas posibilidades impensables hace escasos aos. Tener todas las herramientas
disponibles en internet, y sin coste, permite que cualquier desarrollador interesado
pueda programar aplicaciones sin tener que pertenecer a una empresa o universidad.
Adems, la distribucin digital, la simplificacin de conceptos en el sector, la
proliferacin de dispositivos mviles con grandes capacidades hardware y las
facilidades para el desarrollo de los mismos, permiten que las aplicaciones lleguen a
cualquier parte del mundo en el momento en el que terminen su desarrollo, casi sin
costes de distribucin.
Desarrollando este proyecto hemos disfrutado, investigado y aprendido mucho
sobre un tema que nos apasiona y que hasta ahora era desconocido a nivel tcnico para
nosotros. Adems, hemos encontrado un sector en el que no nos importara que se
desarrollase nuestro futuro laboral.
No obstante, a pesar del objetivo fundamental que supone la realizacin del
proyecto, tambin hemos aprendido otros conocimientos:

Soltura con lenguajes de programacin vistos durante el estudio de la carrera


universitaria (Java, Xml).
Manejo de la API de Android.
Programar aplicaciones para telfonos mviles.
Desarrollo de aplicaciones de nueva generacin con un gran futuro por delante.
Avanzar en la investigacin, tan importante en el mundo laboral.
Redaccin y publicacin de documentos tcnicos.

Y, en definitiva, consideramos que este Proyecto ha puesto a prueba nuestros


conocimientos y nuestra capacidad de aprendizaje con un resultado positivo, y
esperamos que el Tribunal lo considere de la misma forma, permitindonos obtener el
ttulo de Ingeniero Tcnico en Informtica de Sistemas.

87

Por ltimo, queremos agradecer en primer lugar a nuestro tutor Dr. Jos Ramn
Portillo Fernndez todo el tiempo que nos ha dedicado guindonos en la elaboracin de
esta documentacin, y en segundo lugar pero no menos importante a nuestros familiares
y amigos por todo el tiempo que le hemos quitado durante el periodo en el que hemos
realizado este proyecto. Gracias a todos.

88

11. Bibliografa

89

Android : Guia para desarrolladores / W. Frank Ableson, Robi Sen, Chris King.
Madrid: Anaya Multimedia, [2011]
El gran libro de Android / Jess Toms Girons
Barcelona: Marcombo, [2012]
Manual imprescindible de desarrollo de aplicaciones para Android / Joan Ribas
Lequerica
Madrid: Anaya Multimedia, [2011]
Android: curso de desarrollo de aplicaciones / Scott McCracken
Barcelona: Inforbook's, 2012
BLOG ANDROIDEITY / Aurora Rodrguez [Abril Junio 2012]
http://Androideity.com
FORO ANDROID-SPA [Abril Mayo 2012]
http://www.Android-spa.com
BLOG NOSINMIUBUNTU [Abril Mayo 2012]
http://www.nosinmiubuntu.com/p/programacion-Android.html
PGINA OFICIAL DE ANDROID [Abril Mayo 2012]
http://developer.Android.com
WIKIPEDIA
http://es.wikipedia.org/wiki/Android
Curso de Android desarrollo de aplicaciones mviles / Adrin Cataln
MAESTROS DEL WEB
http://www.maestrosdelweb.com/editorial/curso-Android
Curso programacin Android / Salvador Gmez Oliver
SGOLIVER
www.sgoliver.net

90

Potrebbero piacerti anche