SlideShare una empresa de Scribd logo
1 de 20
Parking Finder
Escuela de Ingeniería de Sistemas
Universidad de Cuenca
Mayo de 2017
Criollo Cumbe Carlos Ismael, Estudiante
ismael.criolloc@ucuenca.ec
Temario
Resumen:
1. Introducción
1.1. Enfoque del problema
1.2. Problemática
1.3. Solución (Requerimientos del Usuario)
1.4. Requerimientos Funcionales
1.5. Requerimientos no Funcionales
2. Alcance del proyecto
3. Introducción al IDE Android Studio
4. Etapas del Desarrollo de la aplicación
4.1. Diagrama de Clases y Casos de uso
4.2. Preparación del área de trabajo
4.3. Diseño
4.4. Enlace de Parámetros
4.5. Manejo de Eventos y enlace entre actividades
4.6. Restricciones en Eventos
4.7. Capa de Datos
Base de Datos con SQLite
Servicios Web (APIS DE GOOGLE)
4.8. Implementación de Ventanas Emergentes
4.9. Validaciones y Restricciones Finales
5. Manual de Uso y Referencias al Código
6. Conclusiones
7. Líneas Futuras
8. Referencias
9. Código
10. Figuras
Resumen:
EL presente informe describe las etapas al desarrollar una aplicación móvil como parte de un proyecto
propuesto en clases de Programación 3 de la universidad de Cuenca. Se implementa arquitecturas de
diseño tales como Programación por capas y Programación Concurrente, permitiendo una mayor
flexibilidad al código. Se define el entorno en el que se trabaja para el desarrollo en aplicaciones Android
en la Actualidad y se definen conclusiones referentes a lo aprendido en el progreso al desarrollar la
aplicación.
1. Introducción
1.1. Enfoque del problema
Según el Gerente de la EMOV EP de la ciudad de Cuenca, Sr Adrián Castro informó el 30 de Diciembre
del 2016 que se han llegado a registrado un aproximado de 86.000 vehículos para operar dentro de dicha
ciudad. Considerando esta cantidad de vehículos para una cuidad relativamente pequeña como lo es
Cuenca a comparación de otras ciudades como Quito, Guayaquil o Loja, se presenta un inconveniente
diario al circular por las calles del centro histórico de la cuidad y peor aun tratar de encontrar parqueadero
disponible y seguro.
Usualmente se optan por parquear en la calle donde son espacios permitidos por la empresa mencionada
anteriormente, sin embargo, para ciertas horas (horas pico) se ven saturadas con vehículos parqueados
dejando la segunda opción de los conductores que son los “PARQUEADEROS PÚBLICOS”. Sin
embargo, en varias ocasiones, al tratar de usar un parqueadero público se han identificado inconvenientes,
tales como, que éste se encuentra saturado (sin espacios disponibles para el uso del servicio) o por algún
motivo dejó de atender ese día, o incluso el horario de atención está restringido en ciertas horas.
Si a lo anterior mencionado se le adiciona que en ciertas fechas una gran cantidad de turistas provenientes
de diferentes partes del país o incluso fuera de él, llegan con sus vehículos sin un conocimiento previo de
los establecimientos disponibles, por lo que, al visitar alguno de los lugares turísticos de la cuidad,
pueden llegar a perder horas solo en encontrar un parqueadero disponible, seguro y algo que
probablemente todo conductor desea, cerca del lugar de destino del conductor.
1.2. Problemática
En la actualidad, no solo en la ciudad de CUENCA sino en diferentes partes del mundo, la problemática
en transporte terrestre al encontrar parqueaderos como alojamiento, se da por múltiples razones, como lo
son: falta de publicidad, acceso a callejones desconocidos, distancia inapropiadas al lugar de destino,
entre otras. Incluso al conocer la ubicación de algún parqueadero, se puede presentar el caso, de que éste
no cuenta con espacios disponibles, o el horario de atención no fuese favorable en la visita.
1.3. Solución(Requerimientos del Usuario)
Crear una aplicación móvil que gestione el flujo de información entre el usuario (conductor) y los
parqueaderos (servicio de los usuarios registrados en la aplicación). Esta aplicación debe identificar la
ubicación del peticionario (en el momento que lo requiera) y muestre por pantalla los parqueaderos
relativamente más cercanos, que estén disponibles. Adicional a ello, la aplicación puede visualizar el
puntaje que anteriores clientes del parqueadero han dado a través de esta aplicación al finalizar el servicio
y el costo que proveen los parqueaderos para comodidad del cliente, dando como resultado, una búsqueda
fiable y segura. Una vez identificado el parqueadero de preferencia, la aplicación mostrara una ruta
posible para acceder al parqueadero. Adicional a ello, la aplicación permitirá el uso del servicio
controlando el tiempo de estadía y mostrando el costo final que tendrá que pagar el cliente, con la única
finalidad de asegurarse de que el cajero del parqueadero cobró lo justo por el servicio. Como se mencionó
anteriormente, la aplicación presentara una opción final para calificar el trato al cliente para informar a
futuros peticionarios.
1.4. Requerimientos Funcionales
1- La aplicación permitirá registrar, modificar y eliminar usuarios que administran los parqueaderos
de la aplicación, únicamente con una clave de acceso (contraseña).
2- En la parte del registro los usuarios podrán identificar de manera automática la ubicación de su
parqueadero para asegurar una mayor exactitud de geo localización.
3- La aplicación permitirá valorar el servicio brindado por los parqueaderos, generando un plano
estadístico general la cual sea visible para cualquier usuario de la aplicación.
4- Deberá visualizar por pantalla empleando la api de Google, un mapa que contenga los
parqueaderos más próximos, disponibles (entiéndase por disponible: con espacio de parqueo, en
el horario de trabajo del parqueadero) al peticionarios, en cuando éste lo pida, inicialmente con
un radio predefinido de 2km, y aumentando su rango en caso de no encontrar algún parqueadero
relativamente cerca.
5- La aplicación será capaz de hacer transparente el costo por tiempo del servicio con la finalidad de
permitir al usuario elegir entre una u otra opción de parqueaderos.
6- La aplicación debe indicar una ruta de acceso al parqueadero tomando como punto inicial la
posición del peticionario y como llegada, el parqueadero elegido.
7- La aplicación permitirá acceder al uso del parqueadero, únicamente si el peticionario se
encuentra cerca del parqueadero elegido, al igual que para finalizar, deberá considerar la misma
condición.
8- La aplicación debe ser capaz de visualizar por pantalla aquellos altercados que eviten que un
proceso dentro de la aplicación no haya podido ejecutar, entre estos posibles fallos se tienen:
ingreso a la cuenta con un usuario y contraseña inválida, acceder al servicio del parqueadero sin
haber elegido uno como referencia, términos relacionados con el acceso a la base de datos y
perdiciones a los servicios que ofrece Google.
9- La aplicación habilitara o inhabilitara botones en la interfaz de manera automática para que el
usuario realice únicamente las operaciones validas en cualquier campo correspondiente.
10- La aplicación estará disponible únicamente para el sistema operativo Android a partir de la
versión 4.2.2.
11- La aplicación deberá realizar peticiones de acceso a internet, ubicación y manipulación de
información para seguridad del cliente.
1.5. Requerimientos no Funcionales
1- La aplicación deberá ser escrito en lenguaje Java y ser funcional para Android.
2- La interfaz de usuario será amigable y sencilla para el manejar y comprensión de los usuarios,
tanto para aquellos que se registrar con sus parqueaderos, como para los usuarios que utilizan
únicamente la opción de visualizar parqueaderos en mapa.
3- El lenguaje de la interfaz de usuario será únicamente en español.
4- La aplicación deberá emplear programación concurrente para evitar fallos al trabajar en segundo
plano.
5- La aplicación deberá realizarse bajo la arquitectura de programación por capas.
6- La aplicación no mostrará un direccionamiento de ruta hasta llegar al destino únicamente la ruta
como tal.
7- Se trabajará con una base de datos local que simule un servidor en el cual se almacenará la
información de los usuarios registrados.
8- La aplicación no ocupar más de 8 Mb de memoria en el dispositivo móvil.
9- La aplicación debe asegurar que los datos estén protegidos del acceso no autorizado.
2. Alcance del proyecto
Para realizar el proyecto se tomaran a los requerimientos funcionales y no funcionales como los objetivos
generales planteados en el proyecto, dejando como objetivo específico la ejecución correcta de la
aplicación en un dispositivo móvil con sistema operativo Android.
3. Introducción al IDE Android Studio
Android Studio es un Entorno de Desarrollo que permite diseñar aplicaciones móviles, televisoras, relojes
inteligente, entre otros dispositivos con plataformas Android, en lenguajes de programación Java o C++.
La estructura Básica de un proyecto en este entorno viene dada por una carpeta principal “app” la cual
almacena la aplicación como tal y los “Gradle Scripts” que forman el sistema de compilación basado en
JVM (Java Virtual Machine) . Dentro de la carpeta “app” las tareas se distribuyen en subcarpetas
facilitando la manipulación del código por secciones, por un lado se tiene la carpeta “manifests” la cual
contiene un archivo xml (AndroidManifest.xml), responsable de mostrar la información esencial de la
aplicación a desarrollar, es el primer archivo al que se accede antes de compilar cualquier código del
proyecto, define los componentes de la aplicación, identifica a la actividad principal del proyecto, verifica
bajo qué nivel mínimo de la API de Android se está realizando el proyecto, archivo en el cual se declaran
los permisos necesarios para la aplicación, entre otras importantísimas acciones. Por otro lado se tiene
“java” la cual contiene las clases ya conocidas por la mayoría de programadores en lenguaje java,
permiten la instanciación de objetos y a su vez de actividades, dependiendo de la funcionalidad con la
que se programe, en esta carpeta también se alojan los archivos pertinentes para las pruebas Unitarias, en
caso de requerirlo. Por último se identifica la subcarpeta “res”, correspondiente a los recursos de la
aplicación, en las cuales se puede destacar la carpeta “drawable” en la cual se almacenan ficheros de
imagen (JPG o PNG) y descriptores de imágenes en XML, la carpeta “mipmap” es similar a la anterior
pero estos ficheros son generados en diferentes tamaños para su correcta manipulación, generalmente se
ven involucrados los iconos de la aplicación, otra carpeta perteneciente a los recursos de la aplicación es
“layout” la cual contiene ficheros xml y representan la vista de la aplicación (GUI), finalmente se tiene la
carpeta “values” de ficheros xml los cuales permite almacenar valores a través de claves o algún id,
generalmente son utilizados para definir colores y cadenas de texto que aparecerán de manera
consecutiva en varios secciones de código.
Android Studio en su gran mayoría, realiza los cambios necesarios automáticamente para la correcta
sincronización entre estos módulos, sin embargo hay aspectos que se los debe realizar manualmente
como se describirá más adelante con respecto a importaciones.
4. Etapas del Desarrollo de la aplicación
A medida que avanzan las etapas,se describirán a simples rasgos, cuales fueron y como se trataron los
objetivos planteados en el proyecto.
4.1. Diagrama de Clases yCasos de uso
Una vez identificado los requerimientos de usuario, funcionales y no funcionales se procedió a realizar un
diagrama de clases y casos de usos mediante los plugs UML de Neatbeans. Los diagramas se pueden
visualizar en las figura 1 y 2 respectivamente de manera muy resumida. En esta etapa se identificó el
nombre de la aplicación “Parking Finder”, se diseñó el logo y el banner correspondiente a la aplicación
empleando el software de diseño RealWold Cursor Editor, ver figura 3.
4.2. Preparacióndel área de trabajo
Para cubrir el primer objetivo de emplear el lenguaje de programación java y desarrollar una aplicación
para Android, se procedió a descargar e instalar el entorno de desarrollo (IDE) Android Studio a través
del siguiente enlace: https://developer.android.com/studio/index.html?hl=es-419.
Como primer plano de desarrollo en el IDE Android Studio, se configuraron los siguientes aspectos:
1. Descargar la plataforma SDK Android 7.1.1 la cual corresponde a la versión 4.1 Jelly Bean de la
plataforma de Android tomado como base en el desarrollo planteado para este proyecto,
cubriendo un 87 por ciento de los dispositivos empleados con Android.
2. Instalar las herramientas SDK “Google USB Driver” y el plug de “Google Services” para la
manipulación de los servicios que ofrece Google a través de su API.
Como punto adicional se puede considerar a Genymotion Device Manager para manipular un emulador y
realizar las pruebas a medida que se realizan nuevas implementaciones de código, sin embargo la opción
considerada en este caso fue el uso físico de un dispositivo móvil Android correspondiente a un Samsung
Galaxy S4, para ello se realizó la siguiente configuración.
1. Descargar e instalar samsung kies en un ordenador con sistema operativo Windows para conectar
al dispositivo móvil, el software se obtuvo del siguiente enlace:
http://www.samsung.com/es/support/usefulsoftware/KIES/.
2. En el dispositivo móvil se habilitó la opción “depuración USB”.
4.3. Diseño
Puesto que la aplicación se realizara por capas, esta etapa corresponde a la capa de presentación, con lo
cual se procedió a realizar las ventanas necesarias correspondientes a la interfaz de usuario de la
aplicación basados en el diagrama de clases y casos de usos, ver figuras 4 y 5, estas ventanas se diseñaron
de tal manera que en los campos de ingreso de información por teclado, estén restringido correspondiente
a su uso futuro por ejemplo, para ingresar solo números decimales, números enteros, caracteres y en los
campos de contraseña ocultar la información a través de una visualización únicamente de puntos. Las
ventanas de presentación empleadas en la aplicación fueron: menú_configurar, menú_mi_cuenta,
menú_principal, menú_iniciar_sesion, menú_registrar, menú_uso_parqueadero, menú_configuracion y
menú_mapa.
En la figura 6 se pueden visualizar las ventanas emergentes necesarias para elcomplemento del entorno
gráfico, las cuales son: ventana_emergente_calificacion y ventana_emergente_estadistica.
Para realizar las interfaces de usuario, fue necesario crear un archivo xml para cada uno de ellos. Android
Studio facilita el diseñar para este tipo de actividades empleando plantillas de diseño, sin embargo en este
proyecto se utilizaron únicamente ACTIVIDADES VACIAS (Empty Activity) diseñando desde cero un
entonto amigable para el usuario, con una pequeña excepción para el menú_mapa puesto que se optó por
recurrir a la actividad predefinida por Android Studio “Google Maps Activity”, proporcionando
modificaciones adecuadas para elcorrecto funcionamiento del mismo, sin embargo para completar el
funcionamiento del mapa en la aplicación, fue necesario acceder alfichero google_maps_api.xml dentro
de la carpeta “values” la cual se creó automáticamente en el proceso mencionado anteriormente, y seguir
los pasos especificado en dicho archivo. Resumiendo los pasos seguidos, se tiene:
1.- Tener una cuenta Google disponible.
2.- Enlazarse al link obtenido dentro del fichero google_maps_api.xml
3.- Crear nuevo proyecto en la ventana visualizada del paso anterior.
4.- Presionar en “Crear Clave de API”
5.- Copiar la “clave” obtenido, en el espacio correspondiente (YOUR_KEY_HERE) dentro del
fichero mencionado anteriormente.
4.4. Enlace de Parámetros
Una vez diseñado el entorno gráfico, se procede a crear una clases controladora .java que extienda de la
clase AppCompatActivity para cada uno de estos, para manipular las actividades planeadas en las
ventanas, sin considerar a las ventanas emergentes puestos que estas se verán manipuladas como clases
internas desde alguna clase especifica cómo se describirá más adelante. En esta etapa arranca el diseño de
la capa de negocios, espacio en el cual se validará y manipulará la información obtenida desde la interfaz
de usuario y posterior, desde la capa de Datos.
Como primer punto se deben enlazar los objetos de las actividades hacia las clases mediante un id
previamente definido a cada uno de dichos objetos con el fin de obtener la información descrita por el
usuario (en caso de un TextView), acciones (en caso de un Button), entre otros eventos. Por tanto se
deben definir los objetos que se desean enlazar como atributos de la clase controladora e inicializarlos
dentro del método onCreate que extiende de la clase AppCompatActivity la cual es el primer método en
correr al crear una nueva ventana. La implementación de un id hacia los objetos se puede visualizar en la
sección de códigos en codigo1, y la manera en que se debe enlazar estos parámetros en su clase
controladora se encuentra en codigo2, adicional a ello se puede considerar la figura 7 correspondiente al
tiempo de vida de un “Activity” en Android Studio, ya que esto facilitara la manipulación de eventos
durante todo el proceso de desarrollo de un proyecto en este IDE.
4.5. Manejo de Eventos y enlace entre actividades
Los eventos que se manejan dentro de este proyecto básicamente se resumen al clicar un botón o partes
específicas de la pantalla (para el caso de los mapas), para ello se puede controlar de tres maneras
diferentes, referenciando desde la actividad que proviene, o generando un método que almacene todos los
eventos en la clase controladora y para el caso de este proyecto, empleando el método INLINE mediante
setOnClickListener el cual se encuentran definidos para todos los objetos, como se mencionó
anteriormente, en este caso, empleando a los objetos de tipo Button y posteriormente a los marcadores
para mapas. Internamente se define la o las funcionalidades que se presentaran al realizar el evento, para
ello se debe instancia un objeto de tipo View, especificando el escuchador del evento, es decir, cuando se
realiza un clic simple o cuando se ha presionado por un segundo o varios segundos, entre otros. En
código, estos escuchadores viene dados por los métodos onClick(), onLongClick(), onFocusChange(),
entre otros. En codigo3 se puede apreciar un enlace entre las actividades menú iniciar sesión y menú
registrar, para lo cual se declara un objeto de tipo Intent el cual recibe como parámetro las clases
controladoras involucradas en el proceso de enlazado. Para visualizar esta interacción se hace uso del
método startActivity() la cual arranca la segunda actividad desde la primera actividad del Intent, Si se
desea pasar parámetros entre actividades se los puede realizar mediante el método de Intent
putExtra("clave",valor);,Considere que si se desea pasar un Objeto como parámetro, este debe
implementar la interfaz Serializable, cabe recalcar que este último proceso no se realizó en la aplicación,
puesto que a pesar de implementar la interfaz Serializable, no fue posible pasar los Tipos Abstractos de
Datos entre las Activitys, por lo cual únicamente se pasaron parámetros de tipo string para su posterior
manipulación, ver codigo4.
4.6. RestriccionesenEventos
Como se mencionó anteriormente los eventos disparados por clics se encuentran presentes en toda la
aplicación a desarrollar, sin embargo, cada uno de ellos perciben diferentes tipos de restricciones como
por ejemplo, para el caso de iniciar sesión, el usuario debe existir en la base de datos y ser coherente con
la contraseña que ha ingresado, sin embargo estas restricción está relacionada con el siguiente apartado
referente a la capa de Datos. Otro ejemplo de restricción puede ser que al registrarse como nuevo usuario
al menos los campos estén completamente llenos para continuar con otras validaciones, es decir, que no
se presenten campos vacíos para continuar con el evento, en codigo5 se muestra esta restricción al
presionar el botón registrar de la clase MenuRegistrar. Para notificar al cliente alguna anomalía se lo
realiza mediante el método estático de Toast “makeText” el cual recibe como parámetro, el contexto con
el que se trabaja (actividad visualizada en pantalla), el mensaje que se desea mostrar y el tiempo que
aparece el mensaje. Ver figura 8.
4.7. Capa de Datos
La información que se obtiene de manera indirecta para el uso de la aplicación “Parking Finder”, se
divide en dos secciones, por un lado se tiene la base de datos que almacena la información de los usuarios
registrados (con sus respectivos parqueaderos a cargo) y por otro lado los servicio web proporcionado por
Google (API de Google).
Para el registro de usuarios y parqueaderos se debió emplear servidores para un correcto funcionamiento
en tiempo real y de manera global, sin embargo en este caso, únicamente se ha considerado el gestor de
base de datos SQLite para simular el comportamiento de la capa de datos. El trabajar de manera
independiente entre el almacenamiento de datos y el control de información, hace posible que a futuro se
implementen servidores sin alterar gran parte del proyecto.
Base de Datos conSQLite
Como se mencionó anteriormente, el motor de Base de Datos empleado en este proyecto corresponde a
SQLite la cual trabaja de manera sencilla y sin previas configuraciones. Para emplear SQLite se
consideró los siguientes aspectos.
1.- Crear una clase “Parqueadero” la cual defina la estructura fija del mismo, en este caso,se tiene como
atributos: un propietario, el nombre asociado al parqueadero, la ubicación, el costo del servicio (costo por
tiempo), la capacidad de almacenamiento (número máximo de vehículos disponibles y vehículos
estacionados) y la valoración o puntaje obtenido.
2.- Por otro lado se define la clase “Usuario”, correspondiente a una estructura definida por el nombre del
Usuario (usuario), una contraseña (contrasena) y la implementación de un único parqueadero.
3.- Correspondiente a los parqueaderos se crea la clase “BaseDeDatosParqueaderos” la cualextiende de
SQLiteOpenHelper para la manipulación de información Almacenada o por Almacenar. Como requisitos
se debe definir un constructor y sus metodos onCreate (para conectar con la base de datos) y onUpgrade
(cuando se requieren actualizaciones en la estructura de la base de datos). La estructura para la base de
datos está definido, como se presenta a continuación:
usuario TEXT primary key
nombre TEXT
capacidadMaxima INTEGER
puestosOcup INTEGER
latitud DOUBLE
longitud DOUBLE
costo INTEGER
tiempo INTEGER
puntaje DOUBLE
numVotantes INTEGER
4.- De la misma manera que el apartado 3, se lo hace para el manejo de información con los usuarios,
creando la clase “BaseDeDatosUsuarios”,la estructura en la base de datos está definida como:
usuario TEXT primary key contrasena TEXT nombreParqueadero TEXT
Trabajar con SQLite facilita enormemente el acceso a los registros y obviamente a la manipulación de los
mismos, sin embargo fue conveniente revisar un poco la programación en este tipo de lenguajes Lógico,
en codigo7 se puede visualizar los métodos más empleados en la aplicación para esta etapa.
Servicios Web(APIS DE GOOGLE)
Dentro de la aplicación, el uso inherente de los servicios web se ven reflejados en 3 ámbitos, el primero
correspondiente a la clase “Ubicacion” que implementa la interfaz LocationListener la cual permite
obtener la última ubicación en coordenadas (latitud y longitud) definido en el método
obtenerLocalizacion(). Para los dos restantes se consideraron Tareas Asíncronas, creando las clases
“Direcciones” para obtener la dirección de un lugar partiendo de un par de coordenadas (latitud, longitud)
y la clase “ManageGoogleRoutes” para la obtención de una lista del listas de HashMap Strings con el
listado de Coordenadas Latitud y Longitud empleadas para dibujar polilineas que describan la ruta entre 2
puntos. Ambas clases extienden de la clase AsyncTask para el uso de Hilos o ejecución de código en
segundo plano para evitar retardos en la actividad empleada.
La lógica tras la clase “Ubicación” se basa en acceder a la última conexión del usuario a internet o GPS y
devolver la ubicación en latitud y longitud, mientras que para las clases restantes el proceso es más
elaborado, puesto que primero se debe acceder al servicio web, obtener toda la información la cual se
encuentra en formato Json como se puede apreciar en codigo7, manipular su contenido para filtrar la
información para obtener lo que se desea y finalmente mandar a la capa de negocios para que esta
información sea visualizada hacia el usuario mediante métodos definidos en dicha capa, según convenga.
Cabe mencionar que la clase ManageGoogleRoutes fue reutilizada de un Blog de asesoría y formación
android, IOS y web, el cual se puede apreciar mejor en el enlace [4], sin embargo fue necesario adicionar
un esfuerzo extra al obtener esta clase, puesto que algunas importaciones referentes a los servicios HTTP
Apache no se lograron enlazar, para ello, la solución más repentina fue copiar 3 líneas de código en el
módulo buil.gradle en la sección de dependencias “dependencies”, como se aprecia en la figura 10. Para
el correcto funcionamiento de las clases asíncronas, fue necesario implementar interfaces que definan el
comportamiento luego de recibir las respectivas peticiones a estas clases. Para la clase MenuRegistrar y
MenuMapa se emplearon estas interfaces puesto que de esta se realizaron las peticiones en segundo
plano. La Estructura completa del proyecto en clase se puede apreciar claramente en la figura 11.
4.8. Implementación de Ventanas Emergentes
Usualmente el usuario requiere interactuar con varias clases dentro de una aplicación, sin embargo, para
todas ellas, no es necesario tener un control total, puesto que perciben una reducida interacción entre el
usuario y dicha ventana, por ejemplo, para la aplicación Parking Finder, se empleó el uso de estas
ventanas para calificar el servicio de un parqueadero al finalizar la actividad uso_parqueadero, para ello,
se define una actividad como reacción al evento clic FINALIZAR de la actividad mencionada. Por otro
lado la ventana emergente ver_estadistica, permite al cliente únicamente visualizar el ranking obtenido
por las valoraciones del usuario, del mismo modo, se definió como reacción al evento clic
ESTADISTICA de la actividad menú_parqueadero.
4.9. Validaciones y RestriccionesFinales
Una vez definida la estructura completa del proyecto, y el manejo correcto de actividades, se procedió a
validar aspectos finales tales como, mostrar en mapa, únicamente a los parqueaderos disponibles, sin
considerar su cercanía por un radio de 2km como se planteó inicialmente, con el fin de apreciar todos los
registros en la base de datos. Sin embargo si se consideró que el acceso al uso del parqueadero,
únicamente si el rango entre el parqueadero y la posición del usuario sea muy próximo. Ver figuras 12.
5. Manual de Uso y Referencias al Código
Si únicamente se desea visualizar los parqueaderos disponibles, se debe ingresar al botono VER MAPAS
en la pantalla principal, y la aplicación le re-direccionará a la actividad respectiva, si adicional a ello
desea acceder a la información básica de los parqueaderos como, el nombre del propietario, el costo del
servicio y la valoración, se debe clicar en uno de los marcadores propuestos, habilitándose la opción de
generar una ruta entre la posición inicial y el parqueadero. Si es que usted desea acceder al servicio que
brinda cada marcador, primero se considera una cercanía entre usted y el parqueadero. Ya adentro se
presentan dos opciones COMENZAR y TERMINAR, correspondientes al uso del servicio como tal.
Lógicamente para comenzar el servicio se debe presionar el botón comenzar y al finalizar, de igual
manera, se valida que usted como peticionario se encuentre cerca del parqueadero, caso contrario no
podría terminar. Como opcional, se presenta una ventana emergente que le permita calificar el servicio,
en caso de no desearlo, debe presionar OMITIR, en alguna parte de la pantalla que no corresponda a la
ventana emergente.
Por otro lado, para el usuario de la aplicación se presenta la opción INICIAR SESION en la ventana
principal, la cual internamente permite ingresar a su cuenta a través de una cuenta ya existente o mediante
la opción “¿Aun no tienes una Cuenta?” la cual le llevara a una ventana de registro en la cual todos los
campos de información son necesarias, Por ahora, esta aplicación solo permite registrar la ubicación del
parqueadero con una opción automática la cual devuelve la latitud y longitud actual del usuario. Para
registrar únicamente se debe presionar el botón “Registrar”. Si se registra por primera vez, el servicio de
parqueadero se encontrara inactivo, estado en el cual, usted puede modificar aspectos como el costo y
capacidad de su parqueadero. Caso contrario “en estado activo” no lo podrá hacer. Una vez definida la
capacidad y el costo del servicio usted podrá empezar a trabajar manera automática con sus clientes. El
botón “Agregar Vehículo” se encontrará disponible siempre y cuando haya espacio disponible y el botón
“Quitar Vehículo” se encontrará disponible siempre y cuando tenga vehículos estacionados. Como
opcional se tienen los botones “Estadísticas” la cual muestra una ventana emergente informándole del
número de personas que han evaluado su aplicación y la valoración final de la misma, el botón “MI
CUENTA” le lleva a una ventana la cual permitirá por un lado modificar la contraseña actual de su
cuenta y por otro, eliminar la cuenta. Para realizar estas actividades, la información necesaria, se
encuentra explícitamente en la aplicación y la opción “VER MAPA” realiza la misma acción que el ver
mapa en el menú principal, esto se realizó con el fin de no salir de la cuenta para visualizar el mapa. Cabe
mencionar que si se desea salir de cuenta, únicamente es cuestión de presionar el botón hacia atrás del
celular y confirmar su salida.
Para mayor comprensión, se puede acceder al video Video Tutorial - Parking Finder a través del enlace
https://www.youtube.com/watch?v=moVW4w9_1eA , el cual muestra la manipulación de la aplicación
Parking Finder en la misma cronología como se la ha descrito anteriormente. También se puede acceder
al código fuente de la aplicación a través del siguiente enlace https://github.com/cricucmar/Parking-
Finder-App/tree/master/ParkinFinderProgramacion.
6. Conclusiones
Como conclusiones se tiene que al finalizar este proyecto, se ha obtenido un alto conocimiento en la
programación por capas, en hilos con tareas asíncronas, desarrollo en Aplicaciones Móviles, uso de API’s
Externas al lenguaje Java, manipulación de Base de Datos y manejo de excepciones, dejando
expectativas nuevas para futuras implementaciones de código. Uno de los aspectos más relevantes al
diseñar la aplicación se ve reflejada en la facilidad de programar el IDE Android Studio, puesto que a
comparación de Eclipse, este permite automatizar el comportamiento de los módulos mencionados en el
apartado “Introducción al IDE Android Studio”.
7. Líneas Futuras
Es evidente que unos de los cambios más próximos en esta aplicación, hace referencia al uso de
servidores para el almacenamiento de usuarios y parqueaderos, sin embargo existen varios aspectos y
mejoras respecto al diseño simple de esta aplicación, como por ejemplo, la implementación de un mapa
que permita ubicar al usuario el punto exacto de su parqueadero, puesto que para esta aplicación
únicamente se consideró la última ubicación del usuario como referencia a la ubicación de dicho
parqueadero.
Por otro lado, considerando nuevos proyectos, se puede pensar en una aplicación aún más general que
permita registrar usuarios y estos sean responsables de servicios diferentes al de un parqueadero, por
ejemplo como bazar, papelería, restaurantes u algunos otros campo rentables que involucren una directa
interacción entre usuarios ansiosos de acceder a un servicio deseado de manera segura y fiable.
8. Referencias
[1] Hermoso Programación, http://www.hermosaprogramacion.com/2014/12/android-asynctask-hilos/,
fecha de Acceso:27/04/2017.
[2] Jeffrey Sambells, Codigo Empleado para la manipulación de Google Maps Direction API,
jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java.
[3] Hermoso Programar, http://www.hermosaprogramacion.com/2014/10/android-sqlite-bases-de-datos/,
fecha de Acceso:20/04/2017
[4] expoCode, Blog estudiantil, https://expocodetech.com/el-api-de-rutas-de-google/, última
Modificación Octubre 19,2014, fecha de Acceso:1/05/2017.
[5] Google Maps API, https://developers.google.com/maps/?hl=es-419, fecha de Acceso:20/04/2017
[6] Vindel, R, Intruccion a colecciones de Java,Madrid, España
9. Código
Codigo1: Asignación de un id a un objeto pertenecientes alarchivo menú_inicio.xml representada en la
figura 4 (segunda actividad).
<EditText
android:id="@+id/usuarioIS"
android:hint="Ingrese el usuario"
android:inputType="textPersonName" />
<EditText
android:id="@+id/contrasenaIS"
android:hint="Ingrese la contraseña"
android:inputType="textPassword" />
<Button
android:id="@+id/irMenuParqueadero"
android:text="INICIAR SESION" />
<Button
android:id="@+id/irMenuRegistro"
android:text="¿Aun no tienes una Cuenta?" />
Codigo2: enlace de los atributos de clase con los objetos referentes a codigo1 a través de la función
findViewById.
public class MenuIniciarSesion extends AppCompatActivity {
// Atributos privados de tipo Button
private Button iniciarSesion,irRegistrar;
private EditText usuario, contrasena;
@Override
protected void onCreate(Bundle savedInstanceState) {
/* CREA LA ESTRUCTURA DE LA VENTANA Y CARGA UN
CONTENIDO --> LA ACTIVIDAD MENU INICIAR SESION*/
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_menu_iniciar_sesion);
/* SE ENLAZAN LOS ATRIBUTOS DE ESTA CLASE
MEDIANTE UN CASTING A OBJETOS DE UNA ACTIVIDAD*/
iniciarSesion = (Button) findViewById(R.id.iniciarSecionIS);
irRegistrar = (Button) findViewById(R.id.sinCuencaIS);
usuario = (EditText) findViewById(R.id.usuarioIS);
contrasena = (EditText) findViewById(R.id.contrasenaIS);
}
}
Codigo3: Apertura de una nueva actividad partiendo de un evento disparado por un clic en el botón
irRegistrar de la clase MenuIniciarSesion (referenciado en codigo1 y codigo2).
irRegistrar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/* APERTURA DE UNA NUEVA ACTIVIDAD DESDE ESTA CLASE*/
Intent intent = new Intent(MenuIniciarSesion.this,MenuRegistrar.class);
startActivity(intent);
}
});
Codigo4: Transferencia de parámetros entre dos Actividades (para un tipo String)
// como pasa desde la primera Actividad
Intent intent = new Intent(MenuRegistrar.this,MenuParqueadero.class);
intent.putExtra("nombreUsuario",nuevoUsuario.getUsuario());
startActivity(intent);
// como recibe desde la segunda Actividad
String nombre = getIntent().getExtras().getString("nombreUsuario");
Codigo5: Evento bajo restricciones mediante notificaciones empleando toast
registrar.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(usuario.getText().toString().isEmpty() ||
nombreParqueadero.getText().toString().isEmpty() ||
contrasena.getText().toString().isEmpty() ||
verificarContrasena.getText().toString().isEmpty()||
latitud.getText().toString().isEmpty() ||
longitud.getText().toString().isEmpty()){
// muestra un mensaje rapido que informa la restriccion
Toast.makeText(getApplicationContext(),"TODOS LOS CAMPOS SON
IMPORTANTES",Toast.LENGTH_SHORT).show();
}else
if(!contrasena.getText().toString().equals(verificarContrasena.getText().toString())){
// En caso de que las contraseñas no coicidan
Toast.makeText(getApplicationContext(),"LA CONTRASEÑA NO
CONINCIDE",Toast.LENGTH_SHORT).show();
} else{
// agrega al usuario en la base de datos
}
}
Codigo6: Líneas de código frecuentes para eluso del gestor de base de datos SQLite
// constructor de una base de datos
public BaseDeDatosParqueaderos(Context context){
super(context,"parkingFinderBD2",null,1);
}
// primer método en acceder a la clase que la implementa
@Override
public void onCreate(SQLiteDatabase db) {
db.execSQL(sqlTabla);
}
// Método empleado cuando se desea modificar o mejorar una base de datos para versiones futuras de la aplicación
@Override
public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
db.execSQL("DROP TABLE IF EXIST datosParqueadero");
db.execSQL(this.sqlTabla);
}
**************************************************************************************
SQLiteDatabase database = this.getWritableDatabase(); // referecia a nuestra base de
datos TIPO escritura
// Inserta registros en una base de datos
database.insertOrThrow("datosParqueadero",null,contenedor);
// Actualiza información de una base de datos
database.update("datosParqueadero",registroModificado,"usuario='"+usuario+"'",null);
// Elimina un registro de una base de datos
database.delete("datosParqueadero", "usuario='"+usuario+"'", null);
Codigo7: Archivo JSON obtenido de la api de google
// línea de cogido para acceder dirección partiendo de un par de coordenadas
https://maps.googleapis.com/maps/api/geocode/json?latlng=-2.896637,-78.003842&sensor=false
// resultados de la petición
Results
0
address_components
0
long_name "Morona-Santiago Province"
short_name "Morona-Santiago Province"
types
0 "administrative_area_level_1"
1 "political"
1
long_name "Ecuador"
short_name "EC"
types
0 "country"
1 "political"
formatted_address "Morona-Santiago Province, Ecuador"
geometry
place_id "ChIJh4vKJj7kzZERFyZyTNQDv4s"
types
1
status "OK"
10. Figuras
Figura 1: Diagrama de Clases Parking Finder
Figura 2: Caso de Uso Parking Finder
Figura 3: Banner de la aplicación Parking Finder
Figura 4: Vista Previa 1 de las interfaces de usuario
Figura 5: Vista Previa 2 de las interfaces de usuario
Figura 6: Ventanas Emergentes de la aplicación
Figura 7: ciclo de vida de un activity.
Fuente: developer.android.com/reference/android/app/Activity.html
Figura 8: mensaje de notificación a través de Toast.
Figura 9: Problemas de importación en las librerías de APACHE.
Figura 10: Solución al problema de importación en las librerías de APACHE de la figura 9.
Figura 11: Modularización en el proyecto Parking Finder

Más contenido relacionado

Similar a Programación 3, Trabajo parking finder

Hackaton Urbano- APP Pide tu Ruta
Hackaton Urbano- APP Pide tu RutaHackaton Urbano- APP Pide tu Ruta
Hackaton Urbano- APP Pide tu Rutadeespacio
 
Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...
Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...
Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...Meison Chirinos
 
Controlley - Transportation and Telemetry
Controlley - Transportation and TelemetryControlley - Transportation and Telemetry
Controlley - Transportation and TelemetryJavierOscarCorderoPr
 
Aplicación para reservas hoteleras
Aplicación para reservas hotelerasAplicación para reservas hoteleras
Aplicación para reservas hotelerasNatis Pinto M
 
An evening with ... Ionic Framework Meetup
An evening with ... Ionic Framework Meetup An evening with ... Ionic Framework Meetup
An evening with ... Ionic Framework Meetup Arkhotech
 
Analisis De Software
Analisis De SoftwareAnalisis De Software
Analisis De SoftwareWily Sánchez
 
Desarrollo y reutilización de componentes software y multimedia mediante leng...
Desarrollo y reutilización de componentes software y multimedia mediante leng...Desarrollo y reutilización de componentes software y multimedia mediante leng...
Desarrollo y reutilización de componentes software y multimedia mediante leng...Jomicast
 
Creación de la aplicación turística tur cuenca
Creación de la aplicación turística tur cuencaCreación de la aplicación turística tur cuenca
Creación de la aplicación turística tur cuencaCarlos Valladarez
 
App movil c.Parking - documento técnico y funcional
App movil c.Parking - documento técnico y funcionalApp movil c.Parking - documento técnico y funcional
App movil c.Parking - documento técnico y funcionalRamón Abruña
 
Pruebas SOAP y las Pruebas automatizadas
 Pruebas SOAP y las Pruebas automatizadas Pruebas SOAP y las Pruebas automatizadas
Pruebas SOAP y las Pruebas automatizadasdaniel191228
 

Similar a Programación 3, Trabajo parking finder (20)

Informe Proyecto Interciclo
Informe Proyecto IntercicloInforme Proyecto Interciclo
Informe Proyecto Interciclo
 
App’s
App’sApp’s
App’s
 
Turismo sobreruedas
Turismo sobreruedasTurismo sobreruedas
Turismo sobreruedas
 
Hackaton Urbano- APP Pide tu Ruta
Hackaton Urbano- APP Pide tu RutaHackaton Urbano- APP Pide tu Ruta
Hackaton Urbano- APP Pide tu Ruta
 
Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...
Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...
Introducción al desarrollo de aplicaciones móviles con Android enfocado a emp...
 
Taller Curso android WhereAmI
Taller Curso android WhereAmITaller Curso android WhereAmI
Taller Curso android WhereAmI
 
Controlley - Transportation and Telemetry
Controlley - Transportation and TelemetryControlley - Transportation and Telemetry
Controlley - Transportation and Telemetry
 
Parking finder
Parking finderParking finder
Parking finder
 
Aplicación para reservas hoteleras
Aplicación para reservas hotelerasAplicación para reservas hoteleras
Aplicación para reservas hoteleras
 
An evening with ... Ionic Framework Meetup
An evening with ... Ionic Framework Meetup An evening with ... Ionic Framework Meetup
An evening with ... Ionic Framework Meetup
 
Reto forestal
Reto forestalReto forestal
Reto forestal
 
Analisis De Software
Analisis De SoftwareAnalisis De Software
Analisis De Software
 
Apps
AppsApps
Apps
 
Desarrollo y reutilización de componentes software y multimedia mediante leng...
Desarrollo y reutilización de componentes software y multimedia mediante leng...Desarrollo y reutilización de componentes software y multimedia mediante leng...
Desarrollo y reutilización de componentes software y multimedia mediante leng...
 
Creación de la aplicación turística tur cuenca
Creación de la aplicación turística tur cuencaCreación de la aplicación turística tur cuenca
Creación de la aplicación turística tur cuenca
 
App movil c.Parking - documento técnico y funcional
App movil c.Parking - documento técnico y funcionalApp movil c.Parking - documento técnico y funcional
App movil c.Parking - documento técnico y funcional
 
Taller de desarrollo de aplicaciones móviles con la tecnología del SIG Corpor...
Taller de desarrollo de aplicaciones móviles con la tecnología del SIG Corpor...Taller de desarrollo de aplicaciones móviles con la tecnología del SIG Corpor...
Taller de desarrollo de aplicaciones móviles con la tecnología del SIG Corpor...
 
Expo SillApp
Expo SillAppExpo SillApp
Expo SillApp
 
Pruebas SOAP y las Pruebas automatizadas
 Pruebas SOAP y las Pruebas automatizadas Pruebas SOAP y las Pruebas automatizadas
Pruebas SOAP y las Pruebas automatizadas
 
Requerimiento de documento practica
Requerimiento de documento practicaRequerimiento de documento practica
Requerimiento de documento practica
 

Último

1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf
1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf
1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdfJlnParada
 
docsity-manzaneo-y-lotizacion para habilitacopm urbana
docsity-manzaneo-y-lotizacion para habilitacopm urbanadocsity-manzaneo-y-lotizacion para habilitacopm urbana
docsity-manzaneo-y-lotizacion para habilitacopm urbanaArnolVillalobos
 
ATS-FORMATO cara.pdf PARA TRABAJO SEGURO
ATS-FORMATO cara.pdf  PARA TRABAJO SEGUROATS-FORMATO cara.pdf  PARA TRABAJO SEGURO
ATS-FORMATO cara.pdf PARA TRABAJO SEGUROalejandrocrisostomo2
 
Balance materia y energia procesos de Secado
Balance materia y energia procesos de SecadoBalance materia y energia procesos de Secado
Balance materia y energia procesos de SecadoGualbertoLopez2
 
CAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALES
CAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALESCAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALES
CAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALESJHONJAIROVENTURASAUC
 
ARMADURAS METODO NODOS.pptx......................
ARMADURAS METODO NODOS.pptx......................ARMADURAS METODO NODOS.pptx......................
ARMADURAS METODO NODOS.pptx......................Juan293605
 
GUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdf
GUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdfGUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdf
GUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdfWILLIAMSTAYPELLOCCLL1
 
metodos de fitomejoramiento en la aolicacion de plantas
metodos de fitomejoramiento en la aolicacion de plantasmetodos de fitomejoramiento en la aolicacion de plantas
metodos de fitomejoramiento en la aolicacion de plantasGraciaMatute1
 
TAIICHI OHNO, historia, obras, reconocimientos
TAIICHI OHNO, historia, obras, reconocimientosTAIICHI OHNO, historia, obras, reconocimientos
TAIICHI OHNO, historia, obras, reconocimientoscuentaparainvestigac
 
Auditoría de Sistemas de Gestión
Auditoría    de   Sistemas     de GestiónAuditoría    de   Sistemas     de Gestión
Auditoría de Sistemas de GestiónYanet Caldas
 
Myoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdf
Myoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdfMyoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdf
Myoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdfFtimaMontserratZaraz
 
portafolio final manco 2 1816827 portafolio de evidencias
portafolio final manco 2 1816827 portafolio de evidenciasportafolio final manco 2 1816827 portafolio de evidencias
portafolio final manco 2 1816827 portafolio de evidenciasIANMIKELMIRANDAGONZA
 
Arquitecto cambio de uso de suelo Limache
Arquitecto cambio de uso de suelo LimacheArquitecto cambio de uso de suelo Limache
Arquitecto cambio de uso de suelo LimacheJuan Luis Menares
 
S01.s1 - Clasificación de las Industrias.pdf
S01.s1 - Clasificación de las Industrias.pdfS01.s1 - Clasificación de las Industrias.pdf
S01.s1 - Clasificación de las Industrias.pdfSalomeRunco
 
Mecatronica Automotriz .pdf
Mecatronica Automotriz              .pdfMecatronica Automotriz              .pdf
Mecatronica Automotriz .pdfleonardocahua1
 
Tema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbb
Tema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbbTema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbb
Tema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbbantoniolfdez2006
 
3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf
3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf
3.6.2 Lab - Implement VLANs and Trunking - ILM.pdfGustavoAdolfoDiaz3
 
S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)
S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)
S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)samuelsan933
 
NTC 3883 análisis sensorial. metodología. prueba duo-trio.pdf
NTC 3883 análisis sensorial. metodología. prueba duo-trio.pdfNTC 3883 análisis sensorial. metodología. prueba duo-trio.pdf
NTC 3883 análisis sensorial. metodología. prueba duo-trio.pdfELIZABETHCRUZVALENCI
 
ingenieria grafica para la carrera de ingeniera .pptx
ingenieria grafica para la carrera de ingeniera .pptxingenieria grafica para la carrera de ingeniera .pptx
ingenieria grafica para la carrera de ingeniera .pptxjhorbycoralsanchez
 

Último (20)

1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf
1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf
1 CENTROIDES 2°Computohhhhhhhhhhhhhhhh.pdf
 
docsity-manzaneo-y-lotizacion para habilitacopm urbana
docsity-manzaneo-y-lotizacion para habilitacopm urbanadocsity-manzaneo-y-lotizacion para habilitacopm urbana
docsity-manzaneo-y-lotizacion para habilitacopm urbana
 
ATS-FORMATO cara.pdf PARA TRABAJO SEGURO
ATS-FORMATO cara.pdf  PARA TRABAJO SEGUROATS-FORMATO cara.pdf  PARA TRABAJO SEGURO
ATS-FORMATO cara.pdf PARA TRABAJO SEGURO
 
Balance materia y energia procesos de Secado
Balance materia y energia procesos de SecadoBalance materia y energia procesos de Secado
Balance materia y energia procesos de Secado
 
CAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALES
CAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALESCAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALES
CAPACITACIÓN EN AGUA Y SANEAMIENTO EN ZONAS RURALES
 
ARMADURAS METODO NODOS.pptx......................
ARMADURAS METODO NODOS.pptx......................ARMADURAS METODO NODOS.pptx......................
ARMADURAS METODO NODOS.pptx......................
 
GUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdf
GUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdfGUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdf
GUIA DE SEGURIDAD PARA VENTILACION DE MINAS-POSITIVA.pdf
 
metodos de fitomejoramiento en la aolicacion de plantas
metodos de fitomejoramiento en la aolicacion de plantasmetodos de fitomejoramiento en la aolicacion de plantas
metodos de fitomejoramiento en la aolicacion de plantas
 
TAIICHI OHNO, historia, obras, reconocimientos
TAIICHI OHNO, historia, obras, reconocimientosTAIICHI OHNO, historia, obras, reconocimientos
TAIICHI OHNO, historia, obras, reconocimientos
 
Auditoría de Sistemas de Gestión
Auditoría    de   Sistemas     de GestiónAuditoría    de   Sistemas     de Gestión
Auditoría de Sistemas de Gestión
 
Myoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdf
Myoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdfMyoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdf
Myoelectric_Control_for_Upper_Limb_Prostheses.en.es (2).pdf
 
portafolio final manco 2 1816827 portafolio de evidencias
portafolio final manco 2 1816827 portafolio de evidenciasportafolio final manco 2 1816827 portafolio de evidencias
portafolio final manco 2 1816827 portafolio de evidencias
 
Arquitecto cambio de uso de suelo Limache
Arquitecto cambio de uso de suelo LimacheArquitecto cambio de uso de suelo Limache
Arquitecto cambio de uso de suelo Limache
 
S01.s1 - Clasificación de las Industrias.pdf
S01.s1 - Clasificación de las Industrias.pdfS01.s1 - Clasificación de las Industrias.pdf
S01.s1 - Clasificación de las Industrias.pdf
 
Mecatronica Automotriz .pdf
Mecatronica Automotriz              .pdfMecatronica Automotriz              .pdf
Mecatronica Automotriz .pdf
 
Tema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbb
Tema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbbTema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbb
Tema ilustrado 9.2.docxbbbbbbbbbbbbbbbbbbb
 
3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf
3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf
3.6.2 Lab - Implement VLANs and Trunking - ILM.pdf
 
S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)
S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)
S3-OXIDOS-HIDROXIDOS-CARBONATOS (mineralogia)
 
NTC 3883 análisis sensorial. metodología. prueba duo-trio.pdf
NTC 3883 análisis sensorial. metodología. prueba duo-trio.pdfNTC 3883 análisis sensorial. metodología. prueba duo-trio.pdf
NTC 3883 análisis sensorial. metodología. prueba duo-trio.pdf
 
ingenieria grafica para la carrera de ingeniera .pptx
ingenieria grafica para la carrera de ingeniera .pptxingenieria grafica para la carrera de ingeniera .pptx
ingenieria grafica para la carrera de ingeniera .pptx
 

Programación 3, Trabajo parking finder

  • 1. Parking Finder Escuela de Ingeniería de Sistemas Universidad de Cuenca Mayo de 2017 Criollo Cumbe Carlos Ismael, Estudiante ismael.criolloc@ucuenca.ec
  • 2. Temario Resumen: 1. Introducción 1.1. Enfoque del problema 1.2. Problemática 1.3. Solución (Requerimientos del Usuario) 1.4. Requerimientos Funcionales 1.5. Requerimientos no Funcionales 2. Alcance del proyecto 3. Introducción al IDE Android Studio 4. Etapas del Desarrollo de la aplicación 4.1. Diagrama de Clases y Casos de uso 4.2. Preparación del área de trabajo 4.3. Diseño 4.4. Enlace de Parámetros 4.5. Manejo de Eventos y enlace entre actividades 4.6. Restricciones en Eventos 4.7. Capa de Datos Base de Datos con SQLite Servicios Web (APIS DE GOOGLE) 4.8. Implementación de Ventanas Emergentes 4.9. Validaciones y Restricciones Finales 5. Manual de Uso y Referencias al Código 6. Conclusiones 7. Líneas Futuras 8. Referencias 9. Código 10. Figuras
  • 3. Resumen: EL presente informe describe las etapas al desarrollar una aplicación móvil como parte de un proyecto propuesto en clases de Programación 3 de la universidad de Cuenca. Se implementa arquitecturas de diseño tales como Programación por capas y Programación Concurrente, permitiendo una mayor flexibilidad al código. Se define el entorno en el que se trabaja para el desarrollo en aplicaciones Android en la Actualidad y se definen conclusiones referentes a lo aprendido en el progreso al desarrollar la aplicación. 1. Introducción 1.1. Enfoque del problema Según el Gerente de la EMOV EP de la ciudad de Cuenca, Sr Adrián Castro informó el 30 de Diciembre del 2016 que se han llegado a registrado un aproximado de 86.000 vehículos para operar dentro de dicha ciudad. Considerando esta cantidad de vehículos para una cuidad relativamente pequeña como lo es Cuenca a comparación de otras ciudades como Quito, Guayaquil o Loja, se presenta un inconveniente diario al circular por las calles del centro histórico de la cuidad y peor aun tratar de encontrar parqueadero disponible y seguro. Usualmente se optan por parquear en la calle donde son espacios permitidos por la empresa mencionada anteriormente, sin embargo, para ciertas horas (horas pico) se ven saturadas con vehículos parqueados dejando la segunda opción de los conductores que son los “PARQUEADEROS PÚBLICOS”. Sin embargo, en varias ocasiones, al tratar de usar un parqueadero público se han identificado inconvenientes, tales como, que éste se encuentra saturado (sin espacios disponibles para el uso del servicio) o por algún motivo dejó de atender ese día, o incluso el horario de atención está restringido en ciertas horas. Si a lo anterior mencionado se le adiciona que en ciertas fechas una gran cantidad de turistas provenientes de diferentes partes del país o incluso fuera de él, llegan con sus vehículos sin un conocimiento previo de los establecimientos disponibles, por lo que, al visitar alguno de los lugares turísticos de la cuidad, pueden llegar a perder horas solo en encontrar un parqueadero disponible, seguro y algo que probablemente todo conductor desea, cerca del lugar de destino del conductor. 1.2. Problemática En la actualidad, no solo en la ciudad de CUENCA sino en diferentes partes del mundo, la problemática en transporte terrestre al encontrar parqueaderos como alojamiento, se da por múltiples razones, como lo son: falta de publicidad, acceso a callejones desconocidos, distancia inapropiadas al lugar de destino, entre otras. Incluso al conocer la ubicación de algún parqueadero, se puede presentar el caso, de que éste no cuenta con espacios disponibles, o el horario de atención no fuese favorable en la visita.
  • 4. 1.3. Solución(Requerimientos del Usuario) Crear una aplicación móvil que gestione el flujo de información entre el usuario (conductor) y los parqueaderos (servicio de los usuarios registrados en la aplicación). Esta aplicación debe identificar la ubicación del peticionario (en el momento que lo requiera) y muestre por pantalla los parqueaderos relativamente más cercanos, que estén disponibles. Adicional a ello, la aplicación puede visualizar el puntaje que anteriores clientes del parqueadero han dado a través de esta aplicación al finalizar el servicio y el costo que proveen los parqueaderos para comodidad del cliente, dando como resultado, una búsqueda fiable y segura. Una vez identificado el parqueadero de preferencia, la aplicación mostrara una ruta posible para acceder al parqueadero. Adicional a ello, la aplicación permitirá el uso del servicio controlando el tiempo de estadía y mostrando el costo final que tendrá que pagar el cliente, con la única finalidad de asegurarse de que el cajero del parqueadero cobró lo justo por el servicio. Como se mencionó anteriormente, la aplicación presentara una opción final para calificar el trato al cliente para informar a futuros peticionarios. 1.4. Requerimientos Funcionales 1- La aplicación permitirá registrar, modificar y eliminar usuarios que administran los parqueaderos de la aplicación, únicamente con una clave de acceso (contraseña). 2- En la parte del registro los usuarios podrán identificar de manera automática la ubicación de su parqueadero para asegurar una mayor exactitud de geo localización. 3- La aplicación permitirá valorar el servicio brindado por los parqueaderos, generando un plano estadístico general la cual sea visible para cualquier usuario de la aplicación. 4- Deberá visualizar por pantalla empleando la api de Google, un mapa que contenga los parqueaderos más próximos, disponibles (entiéndase por disponible: con espacio de parqueo, en el horario de trabajo del parqueadero) al peticionarios, en cuando éste lo pida, inicialmente con un radio predefinido de 2km, y aumentando su rango en caso de no encontrar algún parqueadero relativamente cerca. 5- La aplicación será capaz de hacer transparente el costo por tiempo del servicio con la finalidad de permitir al usuario elegir entre una u otra opción de parqueaderos. 6- La aplicación debe indicar una ruta de acceso al parqueadero tomando como punto inicial la posición del peticionario y como llegada, el parqueadero elegido. 7- La aplicación permitirá acceder al uso del parqueadero, únicamente si el peticionario se encuentra cerca del parqueadero elegido, al igual que para finalizar, deberá considerar la misma condición. 8- La aplicación debe ser capaz de visualizar por pantalla aquellos altercados que eviten que un proceso dentro de la aplicación no haya podido ejecutar, entre estos posibles fallos se tienen: ingreso a la cuenta con un usuario y contraseña inválida, acceder al servicio del parqueadero sin haber elegido uno como referencia, términos relacionados con el acceso a la base de datos y perdiciones a los servicios que ofrece Google. 9- La aplicación habilitara o inhabilitara botones en la interfaz de manera automática para que el usuario realice únicamente las operaciones validas en cualquier campo correspondiente. 10- La aplicación estará disponible únicamente para el sistema operativo Android a partir de la versión 4.2.2. 11- La aplicación deberá realizar peticiones de acceso a internet, ubicación y manipulación de información para seguridad del cliente.
  • 5. 1.5. Requerimientos no Funcionales 1- La aplicación deberá ser escrito en lenguaje Java y ser funcional para Android. 2- La interfaz de usuario será amigable y sencilla para el manejar y comprensión de los usuarios, tanto para aquellos que se registrar con sus parqueaderos, como para los usuarios que utilizan únicamente la opción de visualizar parqueaderos en mapa. 3- El lenguaje de la interfaz de usuario será únicamente en español. 4- La aplicación deberá emplear programación concurrente para evitar fallos al trabajar en segundo plano. 5- La aplicación deberá realizarse bajo la arquitectura de programación por capas. 6- La aplicación no mostrará un direccionamiento de ruta hasta llegar al destino únicamente la ruta como tal. 7- Se trabajará con una base de datos local que simule un servidor en el cual se almacenará la información de los usuarios registrados. 8- La aplicación no ocupar más de 8 Mb de memoria en el dispositivo móvil. 9- La aplicación debe asegurar que los datos estén protegidos del acceso no autorizado. 2. Alcance del proyecto Para realizar el proyecto se tomaran a los requerimientos funcionales y no funcionales como los objetivos generales planteados en el proyecto, dejando como objetivo específico la ejecución correcta de la aplicación en un dispositivo móvil con sistema operativo Android. 3. Introducción al IDE Android Studio Android Studio es un Entorno de Desarrollo que permite diseñar aplicaciones móviles, televisoras, relojes inteligente, entre otros dispositivos con plataformas Android, en lenguajes de programación Java o C++. La estructura Básica de un proyecto en este entorno viene dada por una carpeta principal “app” la cual almacena la aplicación como tal y los “Gradle Scripts” que forman el sistema de compilación basado en JVM (Java Virtual Machine) . Dentro de la carpeta “app” las tareas se distribuyen en subcarpetas facilitando la manipulación del código por secciones, por un lado se tiene la carpeta “manifests” la cual contiene un archivo xml (AndroidManifest.xml), responsable de mostrar la información esencial de la aplicación a desarrollar, es el primer archivo al que se accede antes de compilar cualquier código del proyecto, define los componentes de la aplicación, identifica a la actividad principal del proyecto, verifica bajo qué nivel mínimo de la API de Android se está realizando el proyecto, archivo en el cual se declaran los permisos necesarios para la aplicación, entre otras importantísimas acciones. Por otro lado se tiene “java” la cual contiene las clases ya conocidas por la mayoría de programadores en lenguaje java, permiten la instanciación de objetos y a su vez de actividades, dependiendo de la funcionalidad con la que se programe, en esta carpeta también se alojan los archivos pertinentes para las pruebas Unitarias, en caso de requerirlo. Por último se identifica la subcarpeta “res”, correspondiente a los recursos de la aplicación, en las cuales se puede destacar la carpeta “drawable” en la cual se almacenan ficheros de imagen (JPG o PNG) y descriptores de imágenes en XML, la carpeta “mipmap” es similar a la anterior pero estos ficheros son generados en diferentes tamaños para su correcta manipulación, generalmente se ven involucrados los iconos de la aplicación, otra carpeta perteneciente a los recursos de la aplicación es
  • 6. “layout” la cual contiene ficheros xml y representan la vista de la aplicación (GUI), finalmente se tiene la carpeta “values” de ficheros xml los cuales permite almacenar valores a través de claves o algún id, generalmente son utilizados para definir colores y cadenas de texto que aparecerán de manera consecutiva en varios secciones de código. Android Studio en su gran mayoría, realiza los cambios necesarios automáticamente para la correcta sincronización entre estos módulos, sin embargo hay aspectos que se los debe realizar manualmente como se describirá más adelante con respecto a importaciones. 4. Etapas del Desarrollo de la aplicación A medida que avanzan las etapas,se describirán a simples rasgos, cuales fueron y como se trataron los objetivos planteados en el proyecto. 4.1. Diagrama de Clases yCasos de uso Una vez identificado los requerimientos de usuario, funcionales y no funcionales se procedió a realizar un diagrama de clases y casos de usos mediante los plugs UML de Neatbeans. Los diagramas se pueden visualizar en las figura 1 y 2 respectivamente de manera muy resumida. En esta etapa se identificó el nombre de la aplicación “Parking Finder”, se diseñó el logo y el banner correspondiente a la aplicación empleando el software de diseño RealWold Cursor Editor, ver figura 3. 4.2. Preparacióndel área de trabajo Para cubrir el primer objetivo de emplear el lenguaje de programación java y desarrollar una aplicación para Android, se procedió a descargar e instalar el entorno de desarrollo (IDE) Android Studio a través del siguiente enlace: https://developer.android.com/studio/index.html?hl=es-419. Como primer plano de desarrollo en el IDE Android Studio, se configuraron los siguientes aspectos: 1. Descargar la plataforma SDK Android 7.1.1 la cual corresponde a la versión 4.1 Jelly Bean de la plataforma de Android tomado como base en el desarrollo planteado para este proyecto, cubriendo un 87 por ciento de los dispositivos empleados con Android. 2. Instalar las herramientas SDK “Google USB Driver” y el plug de “Google Services” para la manipulación de los servicios que ofrece Google a través de su API. Como punto adicional se puede considerar a Genymotion Device Manager para manipular un emulador y realizar las pruebas a medida que se realizan nuevas implementaciones de código, sin embargo la opción considerada en este caso fue el uso físico de un dispositivo móvil Android correspondiente a un Samsung Galaxy S4, para ello se realizó la siguiente configuración. 1. Descargar e instalar samsung kies en un ordenador con sistema operativo Windows para conectar al dispositivo móvil, el software se obtuvo del siguiente enlace: http://www.samsung.com/es/support/usefulsoftware/KIES/. 2. En el dispositivo móvil se habilitó la opción “depuración USB”.
  • 7. 4.3. Diseño Puesto que la aplicación se realizara por capas, esta etapa corresponde a la capa de presentación, con lo cual se procedió a realizar las ventanas necesarias correspondientes a la interfaz de usuario de la aplicación basados en el diagrama de clases y casos de usos, ver figuras 4 y 5, estas ventanas se diseñaron de tal manera que en los campos de ingreso de información por teclado, estén restringido correspondiente a su uso futuro por ejemplo, para ingresar solo números decimales, números enteros, caracteres y en los campos de contraseña ocultar la información a través de una visualización únicamente de puntos. Las ventanas de presentación empleadas en la aplicación fueron: menú_configurar, menú_mi_cuenta, menú_principal, menú_iniciar_sesion, menú_registrar, menú_uso_parqueadero, menú_configuracion y menú_mapa. En la figura 6 se pueden visualizar las ventanas emergentes necesarias para elcomplemento del entorno gráfico, las cuales son: ventana_emergente_calificacion y ventana_emergente_estadistica. Para realizar las interfaces de usuario, fue necesario crear un archivo xml para cada uno de ellos. Android Studio facilita el diseñar para este tipo de actividades empleando plantillas de diseño, sin embargo en este proyecto se utilizaron únicamente ACTIVIDADES VACIAS (Empty Activity) diseñando desde cero un entonto amigable para el usuario, con una pequeña excepción para el menú_mapa puesto que se optó por recurrir a la actividad predefinida por Android Studio “Google Maps Activity”, proporcionando modificaciones adecuadas para elcorrecto funcionamiento del mismo, sin embargo para completar el funcionamiento del mapa en la aplicación, fue necesario acceder alfichero google_maps_api.xml dentro de la carpeta “values” la cual se creó automáticamente en el proceso mencionado anteriormente, y seguir los pasos especificado en dicho archivo. Resumiendo los pasos seguidos, se tiene: 1.- Tener una cuenta Google disponible. 2.- Enlazarse al link obtenido dentro del fichero google_maps_api.xml 3.- Crear nuevo proyecto en la ventana visualizada del paso anterior. 4.- Presionar en “Crear Clave de API” 5.- Copiar la “clave” obtenido, en el espacio correspondiente (YOUR_KEY_HERE) dentro del fichero mencionado anteriormente. 4.4. Enlace de Parámetros Una vez diseñado el entorno gráfico, se procede a crear una clases controladora .java que extienda de la clase AppCompatActivity para cada uno de estos, para manipular las actividades planeadas en las ventanas, sin considerar a las ventanas emergentes puestos que estas se verán manipuladas como clases internas desde alguna clase especifica cómo se describirá más adelante. En esta etapa arranca el diseño de la capa de negocios, espacio en el cual se validará y manipulará la información obtenida desde la interfaz de usuario y posterior, desde la capa de Datos. Como primer punto se deben enlazar los objetos de las actividades hacia las clases mediante un id previamente definido a cada uno de dichos objetos con el fin de obtener la información descrita por el usuario (en caso de un TextView), acciones (en caso de un Button), entre otros eventos. Por tanto se deben definir los objetos que se desean enlazar como atributos de la clase controladora e inicializarlos dentro del método onCreate que extiende de la clase AppCompatActivity la cual es el primer método en correr al crear una nueva ventana. La implementación de un id hacia los objetos se puede visualizar en la sección de códigos en codigo1, y la manera en que se debe enlazar estos parámetros en su clase controladora se encuentra en codigo2, adicional a ello se puede considerar la figura 7 correspondiente al
  • 8. tiempo de vida de un “Activity” en Android Studio, ya que esto facilitara la manipulación de eventos durante todo el proceso de desarrollo de un proyecto en este IDE. 4.5. Manejo de Eventos y enlace entre actividades Los eventos que se manejan dentro de este proyecto básicamente se resumen al clicar un botón o partes específicas de la pantalla (para el caso de los mapas), para ello se puede controlar de tres maneras diferentes, referenciando desde la actividad que proviene, o generando un método que almacene todos los eventos en la clase controladora y para el caso de este proyecto, empleando el método INLINE mediante setOnClickListener el cual se encuentran definidos para todos los objetos, como se mencionó anteriormente, en este caso, empleando a los objetos de tipo Button y posteriormente a los marcadores para mapas. Internamente se define la o las funcionalidades que se presentaran al realizar el evento, para ello se debe instancia un objeto de tipo View, especificando el escuchador del evento, es decir, cuando se realiza un clic simple o cuando se ha presionado por un segundo o varios segundos, entre otros. En código, estos escuchadores viene dados por los métodos onClick(), onLongClick(), onFocusChange(), entre otros. En codigo3 se puede apreciar un enlace entre las actividades menú iniciar sesión y menú registrar, para lo cual se declara un objeto de tipo Intent el cual recibe como parámetro las clases controladoras involucradas en el proceso de enlazado. Para visualizar esta interacción se hace uso del método startActivity() la cual arranca la segunda actividad desde la primera actividad del Intent, Si se desea pasar parámetros entre actividades se los puede realizar mediante el método de Intent putExtra("clave",valor);,Considere que si se desea pasar un Objeto como parámetro, este debe implementar la interfaz Serializable, cabe recalcar que este último proceso no se realizó en la aplicación, puesto que a pesar de implementar la interfaz Serializable, no fue posible pasar los Tipos Abstractos de Datos entre las Activitys, por lo cual únicamente se pasaron parámetros de tipo string para su posterior manipulación, ver codigo4. 4.6. RestriccionesenEventos Como se mencionó anteriormente los eventos disparados por clics se encuentran presentes en toda la aplicación a desarrollar, sin embargo, cada uno de ellos perciben diferentes tipos de restricciones como por ejemplo, para el caso de iniciar sesión, el usuario debe existir en la base de datos y ser coherente con la contraseña que ha ingresado, sin embargo estas restricción está relacionada con el siguiente apartado referente a la capa de Datos. Otro ejemplo de restricción puede ser que al registrarse como nuevo usuario al menos los campos estén completamente llenos para continuar con otras validaciones, es decir, que no se presenten campos vacíos para continuar con el evento, en codigo5 se muestra esta restricción al presionar el botón registrar de la clase MenuRegistrar. Para notificar al cliente alguna anomalía se lo realiza mediante el método estático de Toast “makeText” el cual recibe como parámetro, el contexto con el que se trabaja (actividad visualizada en pantalla), el mensaje que se desea mostrar y el tiempo que aparece el mensaje. Ver figura 8. 4.7. Capa de Datos La información que se obtiene de manera indirecta para el uso de la aplicación “Parking Finder”, se divide en dos secciones, por un lado se tiene la base de datos que almacena la información de los usuarios registrados (con sus respectivos parqueaderos a cargo) y por otro lado los servicio web proporcionado por Google (API de Google). Para el registro de usuarios y parqueaderos se debió emplear servidores para un correcto funcionamiento en tiempo real y de manera global, sin embargo en este caso, únicamente se ha considerado el gestor de
  • 9. base de datos SQLite para simular el comportamiento de la capa de datos. El trabajar de manera independiente entre el almacenamiento de datos y el control de información, hace posible que a futuro se implementen servidores sin alterar gran parte del proyecto. Base de Datos conSQLite Como se mencionó anteriormente, el motor de Base de Datos empleado en este proyecto corresponde a SQLite la cual trabaja de manera sencilla y sin previas configuraciones. Para emplear SQLite se consideró los siguientes aspectos. 1.- Crear una clase “Parqueadero” la cual defina la estructura fija del mismo, en este caso,se tiene como atributos: un propietario, el nombre asociado al parqueadero, la ubicación, el costo del servicio (costo por tiempo), la capacidad de almacenamiento (número máximo de vehículos disponibles y vehículos estacionados) y la valoración o puntaje obtenido. 2.- Por otro lado se define la clase “Usuario”, correspondiente a una estructura definida por el nombre del Usuario (usuario), una contraseña (contrasena) y la implementación de un único parqueadero. 3.- Correspondiente a los parqueaderos se crea la clase “BaseDeDatosParqueaderos” la cualextiende de SQLiteOpenHelper para la manipulación de información Almacenada o por Almacenar. Como requisitos se debe definir un constructor y sus metodos onCreate (para conectar con la base de datos) y onUpgrade (cuando se requieren actualizaciones en la estructura de la base de datos). La estructura para la base de datos está definido, como se presenta a continuación: usuario TEXT primary key nombre TEXT capacidadMaxima INTEGER puestosOcup INTEGER latitud DOUBLE longitud DOUBLE costo INTEGER tiempo INTEGER puntaje DOUBLE numVotantes INTEGER 4.- De la misma manera que el apartado 3, se lo hace para el manejo de información con los usuarios, creando la clase “BaseDeDatosUsuarios”,la estructura en la base de datos está definida como: usuario TEXT primary key contrasena TEXT nombreParqueadero TEXT Trabajar con SQLite facilita enormemente el acceso a los registros y obviamente a la manipulación de los mismos, sin embargo fue conveniente revisar un poco la programación en este tipo de lenguajes Lógico, en codigo7 se puede visualizar los métodos más empleados en la aplicación para esta etapa. Servicios Web(APIS DE GOOGLE) Dentro de la aplicación, el uso inherente de los servicios web se ven reflejados en 3 ámbitos, el primero correspondiente a la clase “Ubicacion” que implementa la interfaz LocationListener la cual permite obtener la última ubicación en coordenadas (latitud y longitud) definido en el método obtenerLocalizacion(). Para los dos restantes se consideraron Tareas Asíncronas, creando las clases “Direcciones” para obtener la dirección de un lugar partiendo de un par de coordenadas (latitud, longitud) y la clase “ManageGoogleRoutes” para la obtención de una lista del listas de HashMap Strings con el listado de Coordenadas Latitud y Longitud empleadas para dibujar polilineas que describan la ruta entre 2
  • 10. puntos. Ambas clases extienden de la clase AsyncTask para el uso de Hilos o ejecución de código en segundo plano para evitar retardos en la actividad empleada. La lógica tras la clase “Ubicación” se basa en acceder a la última conexión del usuario a internet o GPS y devolver la ubicación en latitud y longitud, mientras que para las clases restantes el proceso es más elaborado, puesto que primero se debe acceder al servicio web, obtener toda la información la cual se encuentra en formato Json como se puede apreciar en codigo7, manipular su contenido para filtrar la información para obtener lo que se desea y finalmente mandar a la capa de negocios para que esta información sea visualizada hacia el usuario mediante métodos definidos en dicha capa, según convenga. Cabe mencionar que la clase ManageGoogleRoutes fue reutilizada de un Blog de asesoría y formación android, IOS y web, el cual se puede apreciar mejor en el enlace [4], sin embargo fue necesario adicionar un esfuerzo extra al obtener esta clase, puesto que algunas importaciones referentes a los servicios HTTP Apache no se lograron enlazar, para ello, la solución más repentina fue copiar 3 líneas de código en el módulo buil.gradle en la sección de dependencias “dependencies”, como se aprecia en la figura 10. Para el correcto funcionamiento de las clases asíncronas, fue necesario implementar interfaces que definan el comportamiento luego de recibir las respectivas peticiones a estas clases. Para la clase MenuRegistrar y MenuMapa se emplearon estas interfaces puesto que de esta se realizaron las peticiones en segundo plano. La Estructura completa del proyecto en clase se puede apreciar claramente en la figura 11. 4.8. Implementación de Ventanas Emergentes Usualmente el usuario requiere interactuar con varias clases dentro de una aplicación, sin embargo, para todas ellas, no es necesario tener un control total, puesto que perciben una reducida interacción entre el usuario y dicha ventana, por ejemplo, para la aplicación Parking Finder, se empleó el uso de estas ventanas para calificar el servicio de un parqueadero al finalizar la actividad uso_parqueadero, para ello, se define una actividad como reacción al evento clic FINALIZAR de la actividad mencionada. Por otro lado la ventana emergente ver_estadistica, permite al cliente únicamente visualizar el ranking obtenido por las valoraciones del usuario, del mismo modo, se definió como reacción al evento clic ESTADISTICA de la actividad menú_parqueadero. 4.9. Validaciones y RestriccionesFinales Una vez definida la estructura completa del proyecto, y el manejo correcto de actividades, se procedió a validar aspectos finales tales como, mostrar en mapa, únicamente a los parqueaderos disponibles, sin considerar su cercanía por un radio de 2km como se planteó inicialmente, con el fin de apreciar todos los registros en la base de datos. Sin embargo si se consideró que el acceso al uso del parqueadero, únicamente si el rango entre el parqueadero y la posición del usuario sea muy próximo. Ver figuras 12. 5. Manual de Uso y Referencias al Código Si únicamente se desea visualizar los parqueaderos disponibles, se debe ingresar al botono VER MAPAS en la pantalla principal, y la aplicación le re-direccionará a la actividad respectiva, si adicional a ello desea acceder a la información básica de los parqueaderos como, el nombre del propietario, el costo del servicio y la valoración, se debe clicar en uno de los marcadores propuestos, habilitándose la opción de generar una ruta entre la posición inicial y el parqueadero. Si es que usted desea acceder al servicio que brinda cada marcador, primero se considera una cercanía entre usted y el parqueadero. Ya adentro se presentan dos opciones COMENZAR y TERMINAR, correspondientes al uso del servicio como tal. Lógicamente para comenzar el servicio se debe presionar el botón comenzar y al finalizar, de igual
  • 11. manera, se valida que usted como peticionario se encuentre cerca del parqueadero, caso contrario no podría terminar. Como opcional, se presenta una ventana emergente que le permita calificar el servicio, en caso de no desearlo, debe presionar OMITIR, en alguna parte de la pantalla que no corresponda a la ventana emergente. Por otro lado, para el usuario de la aplicación se presenta la opción INICIAR SESION en la ventana principal, la cual internamente permite ingresar a su cuenta a través de una cuenta ya existente o mediante la opción “¿Aun no tienes una Cuenta?” la cual le llevara a una ventana de registro en la cual todos los campos de información son necesarias, Por ahora, esta aplicación solo permite registrar la ubicación del parqueadero con una opción automática la cual devuelve la latitud y longitud actual del usuario. Para registrar únicamente se debe presionar el botón “Registrar”. Si se registra por primera vez, el servicio de parqueadero se encontrara inactivo, estado en el cual, usted puede modificar aspectos como el costo y capacidad de su parqueadero. Caso contrario “en estado activo” no lo podrá hacer. Una vez definida la capacidad y el costo del servicio usted podrá empezar a trabajar manera automática con sus clientes. El botón “Agregar Vehículo” se encontrará disponible siempre y cuando haya espacio disponible y el botón “Quitar Vehículo” se encontrará disponible siempre y cuando tenga vehículos estacionados. Como opcional se tienen los botones “Estadísticas” la cual muestra una ventana emergente informándole del número de personas que han evaluado su aplicación y la valoración final de la misma, el botón “MI CUENTA” le lleva a una ventana la cual permitirá por un lado modificar la contraseña actual de su cuenta y por otro, eliminar la cuenta. Para realizar estas actividades, la información necesaria, se encuentra explícitamente en la aplicación y la opción “VER MAPA” realiza la misma acción que el ver mapa en el menú principal, esto se realizó con el fin de no salir de la cuenta para visualizar el mapa. Cabe mencionar que si se desea salir de cuenta, únicamente es cuestión de presionar el botón hacia atrás del celular y confirmar su salida. Para mayor comprensión, se puede acceder al video Video Tutorial - Parking Finder a través del enlace https://www.youtube.com/watch?v=moVW4w9_1eA , el cual muestra la manipulación de la aplicación Parking Finder en la misma cronología como se la ha descrito anteriormente. También se puede acceder al código fuente de la aplicación a través del siguiente enlace https://github.com/cricucmar/Parking- Finder-App/tree/master/ParkinFinderProgramacion. 6. Conclusiones Como conclusiones se tiene que al finalizar este proyecto, se ha obtenido un alto conocimiento en la programación por capas, en hilos con tareas asíncronas, desarrollo en Aplicaciones Móviles, uso de API’s Externas al lenguaje Java, manipulación de Base de Datos y manejo de excepciones, dejando expectativas nuevas para futuras implementaciones de código. Uno de los aspectos más relevantes al diseñar la aplicación se ve reflejada en la facilidad de programar el IDE Android Studio, puesto que a comparación de Eclipse, este permite automatizar el comportamiento de los módulos mencionados en el apartado “Introducción al IDE Android Studio”. 7. Líneas Futuras Es evidente que unos de los cambios más próximos en esta aplicación, hace referencia al uso de servidores para el almacenamiento de usuarios y parqueaderos, sin embargo existen varios aspectos y mejoras respecto al diseño simple de esta aplicación, como por ejemplo, la implementación de un mapa que permita ubicar al usuario el punto exacto de su parqueadero, puesto que para esta aplicación
  • 12. únicamente se consideró la última ubicación del usuario como referencia a la ubicación de dicho parqueadero. Por otro lado, considerando nuevos proyectos, se puede pensar en una aplicación aún más general que permita registrar usuarios y estos sean responsables de servicios diferentes al de un parqueadero, por ejemplo como bazar, papelería, restaurantes u algunos otros campo rentables que involucren una directa interacción entre usuarios ansiosos de acceder a un servicio deseado de manera segura y fiable. 8. Referencias [1] Hermoso Programación, http://www.hermosaprogramacion.com/2014/12/android-asynctask-hilos/, fecha de Acceso:27/04/2017. [2] Jeffrey Sambells, Codigo Empleado para la manipulación de Google Maps Direction API, jeffreysambells.com/2010/05/27/decoding-polylines-from-google-maps-direction-api-with-java. [3] Hermoso Programar, http://www.hermosaprogramacion.com/2014/10/android-sqlite-bases-de-datos/, fecha de Acceso:20/04/2017 [4] expoCode, Blog estudiantil, https://expocodetech.com/el-api-de-rutas-de-google/, última Modificación Octubre 19,2014, fecha de Acceso:1/05/2017. [5] Google Maps API, https://developers.google.com/maps/?hl=es-419, fecha de Acceso:20/04/2017 [6] Vindel, R, Intruccion a colecciones de Java,Madrid, España 9. Código Codigo1: Asignación de un id a un objeto pertenecientes alarchivo menú_inicio.xml representada en la figura 4 (segunda actividad). <EditText android:id="@+id/usuarioIS" android:hint="Ingrese el usuario" android:inputType="textPersonName" /> <EditText android:id="@+id/contrasenaIS" android:hint="Ingrese la contraseña" android:inputType="textPassword" /> <Button android:id="@+id/irMenuParqueadero" android:text="INICIAR SESION" /> <Button android:id="@+id/irMenuRegistro" android:text="¿Aun no tienes una Cuenta?" /> Codigo2: enlace de los atributos de clase con los objetos referentes a codigo1 a través de la función findViewById. public class MenuIniciarSesion extends AppCompatActivity { // Atributos privados de tipo Button private Button iniciarSesion,irRegistrar; private EditText usuario, contrasena; @Override protected void onCreate(Bundle savedInstanceState) { /* CREA LA ESTRUCTURA DE LA VENTANA Y CARGA UN
  • 13. CONTENIDO --> LA ACTIVIDAD MENU INICIAR SESION*/ super.onCreate(savedInstanceState); setContentView(R.layout.activity_menu_iniciar_sesion); /* SE ENLAZAN LOS ATRIBUTOS DE ESTA CLASE MEDIANTE UN CASTING A OBJETOS DE UNA ACTIVIDAD*/ iniciarSesion = (Button) findViewById(R.id.iniciarSecionIS); irRegistrar = (Button) findViewById(R.id.sinCuencaIS); usuario = (EditText) findViewById(R.id.usuarioIS); contrasena = (EditText) findViewById(R.id.contrasenaIS); } } Codigo3: Apertura de una nueva actividad partiendo de un evento disparado por un clic en el botón irRegistrar de la clase MenuIniciarSesion (referenciado en codigo1 y codigo2). irRegistrar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { /* APERTURA DE UNA NUEVA ACTIVIDAD DESDE ESTA CLASE*/ Intent intent = new Intent(MenuIniciarSesion.this,MenuRegistrar.class); startActivity(intent); } }); Codigo4: Transferencia de parámetros entre dos Actividades (para un tipo String) // como pasa desde la primera Actividad Intent intent = new Intent(MenuRegistrar.this,MenuParqueadero.class); intent.putExtra("nombreUsuario",nuevoUsuario.getUsuario()); startActivity(intent); // como recibe desde la segunda Actividad String nombre = getIntent().getExtras().getString("nombreUsuario"); Codigo5: Evento bajo restricciones mediante notificaciones empleando toast registrar.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { if(usuario.getText().toString().isEmpty() || nombreParqueadero.getText().toString().isEmpty() || contrasena.getText().toString().isEmpty() || verificarContrasena.getText().toString().isEmpty()|| latitud.getText().toString().isEmpty() || longitud.getText().toString().isEmpty()){ // muestra un mensaje rapido que informa la restriccion Toast.makeText(getApplicationContext(),"TODOS LOS CAMPOS SON IMPORTANTES",Toast.LENGTH_SHORT).show();
  • 14. }else if(!contrasena.getText().toString().equals(verificarContrasena.getText().toString())){ // En caso de que las contraseñas no coicidan Toast.makeText(getApplicationContext(),"LA CONTRASEÑA NO CONINCIDE",Toast.LENGTH_SHORT).show(); } else{ // agrega al usuario en la base de datos } } Codigo6: Líneas de código frecuentes para eluso del gestor de base de datos SQLite // constructor de una base de datos public BaseDeDatosParqueaderos(Context context){ super(context,"parkingFinderBD2",null,1); } // primer método en acceder a la clase que la implementa @Override public void onCreate(SQLiteDatabase db) { db.execSQL(sqlTabla); } // Método empleado cuando se desea modificar o mejorar una base de datos para versiones futuras de la aplicación @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { db.execSQL("DROP TABLE IF EXIST datosParqueadero"); db.execSQL(this.sqlTabla); } ************************************************************************************** SQLiteDatabase database = this.getWritableDatabase(); // referecia a nuestra base de datos TIPO escritura // Inserta registros en una base de datos database.insertOrThrow("datosParqueadero",null,contenedor); // Actualiza información de una base de datos database.update("datosParqueadero",registroModificado,"usuario='"+usuario+"'",null); // Elimina un registro de una base de datos database.delete("datosParqueadero", "usuario='"+usuario+"'", null); Codigo7: Archivo JSON obtenido de la api de google // línea de cogido para acceder dirección partiendo de un par de coordenadas https://maps.googleapis.com/maps/api/geocode/json?latlng=-2.896637,-78.003842&sensor=false
  • 15. // resultados de la petición Results 0 address_components 0 long_name "Morona-Santiago Province" short_name "Morona-Santiago Province" types 0 "administrative_area_level_1" 1 "political" 1 long_name "Ecuador" short_name "EC" types 0 "country" 1 "political" formatted_address "Morona-Santiago Province, Ecuador" geometry place_id "ChIJh4vKJj7kzZERFyZyTNQDv4s" types 1 status "OK" 10. Figuras
  • 16. Figura 1: Diagrama de Clases Parking Finder Figura 2: Caso de Uso Parking Finder Figura 3: Banner de la aplicación Parking Finder Figura 4: Vista Previa 1 de las interfaces de usuario
  • 17. Figura 5: Vista Previa 2 de las interfaces de usuario Figura 6: Ventanas Emergentes de la aplicación
  • 18. Figura 7: ciclo de vida de un activity. Fuente: developer.android.com/reference/android/app/Activity.html Figura 8: mensaje de notificación a través de Toast.
  • 19. Figura 9: Problemas de importación en las librerías de APACHE. Figura 10: Solución al problema de importación en las librerías de APACHE de la figura 9.
  • 20. Figura 11: Modularización en el proyecto Parking Finder