Wednesday, June 5, 2019

3 Parcial

Temario

Parcial 3


  1. Introducción
  2. Intenciones (intents)
  3. Interfaces gráficas
    1. Controles básicos
    2. Controles de lista
  4. Layouts
  5. Toolbars y menús
  6. Cambios de configuracíon
  7. Dialogs
  8. Almacenamiento persistente
  9. Graficación
  10. Aplicaciones en Android
    • Aplicaciones científicas
    • Animaciones y juegos
  11. Procesos largos
  12. Media
    • Grabar y reproducir audio
    • Tomar y grabar fotografías
    • Grabar y reproducir video
  13. Sensores

1. ¿Por qué un curso avanzado de Android?

 Android es un sistema operativo multidispositivo, inicialmente diseñado para teléfonos móviles. En la actualidad se puede encontrar también en múltiples dispositivos, como ordenadores, tabletas, GPS, televisores, discos duros multimedia, mini ordenadores, cámaras de fotos, etcétera. Incluso se ha instalado en microondas y lavadoras. Está basado en Linux, que es un núcleo de sistema operativo libre, gratuito y multiplataforma. Este sistema operativo permite programar aplicaciones empleando una variación de Java llamada Dalvik, y proporciona todas las interfaces necesarias para desarrollar fácilmente aplicaciones que acceden a las funciones del teléfono (como el GPS, las llamadas, la agenda, etcétera) utilizando el lenguaje de programación Java. Su sencillez, junto a la existencia de herramientas de programación gratuitas, es principalmente la causa de que existan cientos de miles de aplicaciones disponibles, que amplían la funcionalidad de los dispositivos y mejoran la experiencia del usuario. Este sistema operativo está cobrando especial importancia debido a que está superando al sistema operativo por excelencia: Windows. Los usuarios demandan cada vez interfaces más sencillas e intuitivas en su uso; por esto, entre otras cosas, Android se está convirtiendo en el sistema operativo de referencia de facto. El tiempo dirá si se confirman las perspectivas.


2. Cambios en las últimas versiones de Android

 1.5 Cupcake 1.6 Donut 2.0/2.1 Eclair 2.2 Froyo 2.3 Gingerbread 3.0/3.1 Honeycomb ...IceCream Sandwich


Quien esté familiarizado con el sistema operativo Android
 ya sabrá que los nombres de sus diferentes versiones tienen el apodo de un postre. A continuación, vamos a comentar la evolución de las diferentes versiones indicando las mejoras y funcionalidades disponibles en cada una.
 Partiremos de la versión 3.0 ya que las versiones anteriores a ésta se tratan en el curso de Iniciación de Android de Mentor. - Android 3.0 (API 15) Esta versión se diseñó pensando en las tabletas, que disponen de un hardware mucho más potente. Entre sus nuevas funcionalidades podemos encontrar: • Soporte para grandes pantallas, como las tabletas. • Inclusión del concepto de Fragmento (en inglés, Fragment). • Nuevos elementos de interfaz como las barras de acción (action bars) y el arrastrar y soltar (drag-and-drop). • Instalación de un nuevo motor OpenGL 2.0 para animación en 3D. Esta versión de Android se diseñó exclusivamente para ser utilizada en tabletas. En otros dispositivos, como los teléfonos, era necesario seguir utilizando la versión 2.3.7 disponible en ese momento. - Android 4.0 (API 16) A partir de esta versión se unifica el sistema operativo para que pueda utilizarse tanto en tabletas como en otros dispositivos, como teléfonos móviles. Así, se unifica la experiencia de usuario en todos los dispositivos. Entre sus nuevas funcionalidades podemos destacar: • Optimización en las notificaciones al usuario. • Permite al usuario cambiar el tamaño de los widgets. • Añade diferentes formas de desbloquear la pantalla del dispositivo. • Corrector ortográfico integrado. • NFC (Near Field Communication) • Wi-Fi Direct para compartir archivos entre dispositivos. • Encriptación total del dispositivo. • Nuevos protocolos de Internet como RTP (Real-time Transport Protocol) para que el dispositivo accede en tiempo real a contenidos de audio y vídeos. • MTP (Media Transfer Protocol) que permite conectar el dispositivo al ordenador por USB de forma más simple. • Gestión de derechos de autor mediante Digital Rights Management (DRM). - Android 4.2 (API 17) Esta versión no supone un salto en cuanto a las posibilidades que ofrece desde el punto de vista del desarrollador. Sin embargo, es una versión estable y madura. Entre sus nuevas funcionalidades podemos destacar: • Soporte multiusuario. • Posibilidad e inclusión de Widgets en la ventana de bloqueo. • Mejoras de interfaz y de cámara de fotos. - Android 4.3 (API 18) De igual forma que en la versión anterior, esta versión no supone un cambio radical en funcionalidades disponibles al desarrollador. Sin embargo, es una versión más estable y madura sin ninguna duda. Entre sus nuevas funcionalidades podemos destacar: • Bluetooth Low Energy (Smart Ready) y modo Wi-Fi scan-only que optimizan el consumo de batería de estos dispositivos. • Inclusión de la librería OpenGL ES 3.0 que permite mejorar en gráficos 3D. 13 • Definición de perfiles de usuario limitados que, desde el punto de vista del desarrollador, implican una gestión de las Intenciones implícitas (Implicit Intent) para comprobar si el usuario tiene permisos para acceder a ese tipo de Intención. • Mejoras en la gestión multimedia y de codecs de archivos de vídeo. Además, permite crear un vídeo de una Superficie dinámica. • Nuevos tipos de sensores relacionados con juegos. • Nueva Vista ViewOverlay que permite añadir elementos visuales encima de otros ya existentes sin necesidad de incluir en un Layout. Útil para crear animaciones sobre la interfaz de usuario. • Nuevas opciones de desarrollo como revocar el acceso a la depuración USB de todos los ordenadores o mostrar información del uso de la GPU del dispositivo. • Notification Listener es un nuevo servicio que permite que las aplicaciones reciban notificaciones del sistema operativo y sustituye al servicio Accessibility APIs.


 Multimedia y Gráficos en Android 1

. Introducción En esta Unidad vamos a explicar cómo diseñar aplicaciones multimedia Android para oír música, grabar con el micrófono y cargar vídeos desde una tarjeta SD. Algunas aplicaciones Android deben mostrar un aspecto dinámico o representar algún dato en forma gráfica para que el usuario visualice mejor la información que se le está ofreciendo. Como hemos comentado anteriormente en el curso, una aplicación Android tiene éxito si está bien programada internamente y, además, si tiene una apariencia atractiva exteriormente. Para poder desarrollar aplicaciones que incluyan estas funcionalidades es necesario adquirir previamente los Conceptos básicos de gráficos en Android. Los gráficos 2D/3D y las animaciones suelen ser muy útiles para presentar visualmente información al usuario. Para adquirir estas destrezas como programador Android, aprenderemos a animar imágenes de forma sencilla utilizando la API de animaciones de Android. Después, veremos qué es una Vista de tipo Superficie (ViewSurface) y sus aplicaciones más interesantes. Finalmente, estudiaremos cómo aplicar a proyectos Android la conocidísima librería OpenGL para crear gráficos en 2D y 3D, aplicarles colores, animarlos y permitir que el usuario interaccione con ellos. 2. Android Multimedia Hoy en día, los dispositivos móviles han sustituido a muchos antiguos aparatos que utilizábamos para escuchar música, grabar conversaciones, ver vídeos, etcétera. En este apartado vamos a ver cómo diseñar aplicaciones multimedia Android y reproducir este tipo de archivos de audio y vídeo. Mediante ejemplos prácticos expondremos una explicación detallada de las funciones propias del SDK que permitirán implementar una aplicación multimedia. La integración de contenido multimedia en aplicaciones Android resulta muy sencilla e intuitiva gracias a la gran variedad de clases que proporciona su SDK. En concreto, podemos reproducir audio y vídeo desde: - Un fichero almacenado en el dispositivo, normalmente en la tarjeta externa SD. - Un recurso que está embutido en el paquete de la aplicación (fichero .apk). - Mediante el streaming: distribución de multimedia a través de una red de manera que el usuario accede al contenido al mismo tiempo que se descarga. Los protocolos admitidos son dos: http:// y rtp://. También es posible grabar audio y vídeo, siempre y cuando el hardware del dispositivo lo permita.




Librerías de reproducción y grabación de audio

 Android incluye distintos tipos de flujos de audio con sus respectivos volúmenes de sonido dependiendo del propósito de estos audios: música, tono de notificación, tono de llamada, alarma, etcétera. Para obtener información sobre cómo ha configurado el usuario el volumen de los diferentes flujos de audio, debemos utilizar la clase AudioManager que permite acceder a la configuración de sonidos del sistema. Mediante la llamada al método getSystemService(AUDIO_ SERVICE) se obtiene una instancia a este gestor de Audio. Entre sus métodos, podemos destacar: - getStreamVolume(int streamType): obtiene el volumen definido por el usuario para el tipo de flujo indicado como parámetro. - getStreamMaxVolume(int streamType): obtiene el volumen máximo que se puede definir para este tipo de flujo. - isMusicActive(): indica si se está reproduciendo música. - getRingerMode(): devuelve el modo de sonidos del dispositivo; puede tomar las contantes RINGER_MODE_NORMAL, RINGER_MODE_SILENT, o RINGER_MODE_VIBRATE. Existen métodos adicionales que permiten conocer si el audio se reproduce a través de un dispositivo Bluetooth, ajustar el volumen de un tipo de audio, etcétera. Te recomendamos que le eches un vistazo a la documentación oficial. Para establecer el volumen del audio que vamos a reproducir en esa actividad debemos utilizar el método setVolumeControlStream() en el evento onCreate() de la Actividad dependiendo del propósito: - Volumen para música o vídeo: this.setVolumeControlStream(AudioManager.STREAM_MUSIC); - Permite, además, que el usuario utilice los botones del dispositivo para subir y bajar su volumen. - Volumen para tono de llamada del teléfono this.setVolumeControlStream(AudioManager.STREAM_RING); - Volumen de alarma this.setVolumeControlStream(AudioManager.STREAM_ALARM); - Volume de notificación this.setVolumeControlStream(AudioManager.STREAM_NOTIFICATION); - Volumen del sistema this.setVolumeControlStream(AudioManager.STREAM_SYSTEM); - Volumen de llamada por voz this.setVolumeControlStream(AudioManager.STREAM_VOICECALL); El SDK de Android dispone de dos APIs principales que permiten reproducir ficheros de tipo audio: SoundPool y MediaPlayer. 3.1 Clase SoundPool La clase SoundPool permite reproducir sonidos de forma rápida y simultáneamente. Es recomendable utilizar la primera API SoundPool para reproducir pequeños archivos de audio que no deben exceder 1 MB de tamaño, por lo que es el mecanismo ideal para reproducir efectos de sonido como en los juegos. Con la clase SoundPool podemos crear una colección de sonidos que se cargan en la 37 memoria desde un recurso (dentro de la APK) o desde el sistema de archivos. SoundPool utiliza el servicio de la clase MediaPlayer, que estudiaremos a continuación, para descodificar el audio en un formato crudo (PCM de 16 bits) y mantenerlo cargado en memoria; así, el hardware lo reproduce rápidamente sin tener que decodificarlas cada vez. La clase SoundPool realiza esta carga en memoria de los archivos multimedia de forma asíncrona, es decir, el sistema operativo lanzará el sonido con el listener OnLoadCompleteListener cuando se haya completado la carga de cada uno de los archivos. Es posible repetir los sonidos en un bucle tantas veces como sea necesario, definiendo un valor de repetición al reproducirlo, o mantenerlo reproduciendo en un bucle infinito con el valor -1. En este último caso, es necesario detenerlo con el método stop(). También podemos establecer la velocidad de reproducción del sonido, cuyo rango puede estar entre 0.5 y 2.0. Una velocidad de reproducción de 1.0 indica que el sonido se reproduce en su frecuencia original. Si definimos una velocidad de 2.0, el sonido se reproduce al doble de su frecuencia original y, por el contrario, si fijamos una velocidad de 0.5, lo hará lentamente a la mitad de la frecuencia original. Cuando se crea un objeto del tipo SoundPool hay que establecer mediante un parámetro el número máximo de sonidos que se pueden reproducir simultáneamente. Este parámetro no tiene por qué coincidir con el número de sonidos cargados. Además, cuando se reproduce un sonido con su método play(), hay que indicar su prioridad. Así, cuando el número de reproducciones activas supere el valor máximo establecido en el constructor, esta prioridad permite que el sistema detenga el flujo con la prioridad más baja y, si todos tienen la misma prioridad, se parará el más antiguo. Sin embargo, en el caso de que el nuevo flujo sea el de menor prioridad, éste no se reproducirá. En el ejemplo práctico vamos a estudiar los métodos más importantes de esta clase. 3.2 Clase MediaPlayer La segunda API es la más importante de Android y realiza la reproducción multimedia mediante la clase básica MediaPlayer (reproductor multimedia) que permite reproducir audio de larga duración. A continuación, estudiaremos las características más importantes de esta clase y cómo podemos sacarle partido. La diferencia entre utilizar la clase SoundPool y MediaPlayer está en la duración y tamaño del archivo de sonido. Para sonidos cortos, debemos utilizar la primera clase, dejando la segunda para reproducciones largas como canciones de música. Un objeto MediaPlayer puede estar en uno de los siguientes estados: - Initialized: ha inicializado sus recursos internos, es decir, se ha creado el objeto. - Preparing: se encuentra preparando o cargando la reproducción de un archivo multimedia. - Prepared: preparado para reproducir un recurso. - Started: reproduciendo un contenido. - Paused: en pausa. - Stopped: parado. - Playback Completed: reproducción completada. - End: finalizado. - Error: indica un error. U1 Multimedia y Gráficos en Android 38 Aula Mentor Es importante conocer en qué estado se encuentra el reproductor multimedia, ya que muchos de sus métodos únicamente se pueden invocar desde determinados estados. Por ejemplo, no podemos cambiar al modo en reproducción (con su método start()) si no se encuentra en el estado preparado. Lógicamente, tampoco podremos cambiar al modo en pausa (con su método pause()) si ya está parado. Ocurrirá un error de ejecución si invocamos un método no admitido para un determinado estado. El siguiente esquema permite conocer los métodos que podemos invocar desde cada uno de sus estados y cuál es el nuevo estado al que cambiará el objeto tras invocarlo: 



3.3.1 Ejemplo de reproducción y grabación de audio Es recomendable abrir el Ejemplo 1 de esta Unidad para seguir la explicación siguiente. La aplicación de este ejemplo muestra tres botones: el primero permite reproducir un tono utilizando la clase SoundPool, el segundo botón reproduce un archivo largo de audio y el último botón, graba una conversación utilizando el micrófono del dispositivo. Para los dos últimos botones usamos la clase MediaPlayer. En la parte de debajo de la Actividad hemos incluido una vista de tipo TextView desplazable que muestra las acciones del usuario cuando 41 pulsa en un botón. En código del layout activity_main.xml se incluye el diseño de la Actividad principal:


Donde sus parámetros son: - maxStreams: indica el número de sonidos que puede reproducir al mismo tiempo. - streamType: marca el tipo de flujo de audio que usaremos. - srcQuality: indica la calidad. Este atributo no tiene uso en la API de Android. La siguiente sentencia establece el tipo de flujo a música, lo que permite que el usuario utilice los botones de subida y bajada de volumen del dispositivo: this.setVolumeControlStream(AudioManager.STREAM_MUSIC); Por último, debemos precargar con el objeto SoundPool los archivos de audio con el método siguiente: SoundPool.load(Context context, int resId, int priority). Donde resId es la Id de nuestro archivo de música. El parámetro priority permite seleccionar la prioridad de este sonido frente a otro en caso de que se llegue al máximo número de sonidos simultáneos establecidos en el constructor de la clase. Mediante el listener OnLoadCompleteListener el sistema operativo avisará cada vez que complete la carga de un archivo de sonido. Para reproducir un sonido debemos usar el método play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) cuyos parámetros indican: - soundID: ID del sonido que ha indicado el método load() al cargarlo. - leftVolume: volumen del altavoz izquierdo (rango de 0.0 a 1.0) - rightVolume: volumen del altavoz derecho (rango de 0.0 a 1.0) - priority: prioridad del sonido (0 es la más baja) - loop: modo en bucle si establecemos el valor -1. - rate: velocidad de reproducción (1.0 = normal, rango de 0.5 a 2.0) En el siguiente bloque de código hemos utilizado la clase Mediaplayer para reproducir una pista de audio mediante su método start() y pararla con el método stop(). Por simplificación, en este ejemplo hemos utilizado un recurso que se incluye en la carpeta /res/raw/. En una aplicación real no haríamos esto ya que el fichero mp3 se empaqueta con la aplicación y hace que ésta ocupe mucho espacio. Si queremos reproducir una canción desde el sistema de ficheros externo debemos escribir las siguientes sentencias: - MediaPlayer mPlayer = new MediaPlayer(); - mPlayer.setDataSource(RUTA+NOMBRE_FICHERO); - mPlayer.prepare(); - mPlayer.start(); Observa que, en este caso, hay que invocar previamente el método prepare() para cargar el archivo de audio. En el ejemplo del curso no es necesario hacerlo ya que esta llamada se hace desde el constructor create(). El último bloque de código realiza una grabación empleando la clase MediaRecorder. Hemos definido la variable audiofile para guardar la grabación. Para iniciar la grabación utilizamos los métodos setAudioSource() que establece el micrófono de entrada; setOutputFormat() selecciona el formato de salida; setAudioEncoder() indica la codificación del audio; setOutputFile() establece el fichero de salida y start() inicia la grabación. A la hora de parar la grabación, simplemente debemos invocar los métodos stop() y release() que libera los recursos del sistema. Para finalizar con el código Java, hemos desarrollado el método local addRecordingToMediaLibrary() que añade la nueva grabación a la librería multimedia del dispositivo. Para ello, vamos a utilizar un Intent del tipo ACTION_MEDIA_SCANNER_SCAN_FILE y enviar un mensaje Broadcast al sistema operativo para buscar el nuevo contenido multimedia de tipo U1 Multimedia y Gráficos en Android 48 Aula Mentor audio con la orden sendBroadcast(). Por último, para poder ejecutar esta aplicación es necesario que tenga permisos de grabar audio y acceso a la tarjeta SD del dispositivo. Para ello, hay que incluir en el fichero AndroidManifest.xml las siguientes etiquetas: Desde Eclipse ADT puedes abrir el proyecto Ejemplo 1 (Audio) de la Unidad 1. Estudia el código fuente y ejecútalo en el AVD para ver el resultado del  programa anterior, en el que hemos utilizado la API de Audio de Android

Requisitos no funcionales

Realiza una prueba que comprueba la correcta creación de la vista de Mapa sobre la actividad principal. testLayout() Realiza una prueba que comprueba la existencia del botón obtener posición y de que el texto que incluye sea el correcto. testStateDestroy(): Realiza una prueba de ciclo de vida de la actividad. La actividad se destruye y se vuelve a crear. testStatePause() Realiza una prueba de ciclo de vida de la actividad. La actividad pasa del estado Pause al estado Resume. 

Eclipse es una plataforma de desarrollo open source basada en Java. Eclipse fue desarrollado originalmente por IBM como el sucesor de su familia de herramientas para VisualAge. Actualmente es desarrollado por la Eclipse Foundation, una organización independiente sin ánimo de lucro que fomenta una comunidad de código abierto. En sí mismo Eclipse es un marco y un conjunto de servicios para construir un entorno de desarrollo a partir de componentes conectados, plugins…

Entorno de desarrollo y compilación 

Existen plugins para el desarrollo en Java, JDT Java Development Tools, así como para el desarrollo en otros lenguajes como C/C++, PHP, Cobol, plataformas como Android, etc. Eclipse es el IDE recomendado para el desarrollo sobre Android y se incluye de facto en el paquete Bundle de las Android Developer Tools, por lo que el proyecto hará uso de esta herramienta complementándose con los plugins necesarios para facilitar el desarrollo del mismo. Java Java es un lenguaje orientado a objetos que alcanzó su madurez con la popularización de Internet y que es, en cierta manera, el heredero legítimo de C++. La expansión de este lenguaje entre la comunidad de programadores ha sido vertiginosa y se ha impuesto como el paradigma de los lenguajes de programación orientados a objetos. En el entorno académico y de investigación, la enseñanza de Java ha remplazado (y está remplazando) a la enseñanza de lenguajes de programación estructurada como Pascal e incluso C, que siempre se han considerado lenguajes de elección para la introducción a la programación.


Control de versiones de código fuente 


De forma resumida, Java es un lenguaje neutral, portable, robusto, estable, independiente de la plataforma, sencillo de aprender para programadores que hayan trabajado previamente con lenguajes orientados a objetos. Java puede utilizarse para realizar aplicaciones en múltiples plataformas hardware y sistemas operativos (Unix, Linux, OS/390, Windows, o HP-UX entre otros sistemas operativos para ordenadores personales o estaciones de trabajo, Android, Palm OS o EPOC entre otros sistemas operativos para dispositivos de telefonía móvil). TFC Página 9 de 72 TFC Página 9 de 72 Una de las novedades revolucionarias que introdujo Java es la portabilidad. Sun abordó el problema introduciendo el modelo de bytecode: cuando un programa Java se compila no se transforma en un conjunto de instrucciones en código máquina nativas de la plataforma utilizada, lo cual impediría su completa portabilidad, sino que se transforma en un conjunto de bytecodes independientes de la plataforma utilizada que son leídos e interpretados por la máquina virtual Java, JVM, para ejecutar el programa. Por ejemplo, cuando se compila un programa Java en una plataforma Windows/Intel, se obtiene la misma salida compilada, el mismo bytecode, que en un sistema Macintosh o Unix. Los requisitos de desarrollo para Android exigen el uso del JDK (Java Development Kit) en su versión 6. El desarrollo para aplicaciones Android se realiza de forma común en Java, aunque existe la posibilidad de realizar parte de una aplicación mediante otros lenguajes mediante el set de herramientas NDK (Native Development Kit) aunque no es recomendable debido a que aumenta la complejidad del desarrollo de las aplicaciones. Siguiendo las recomendaciones de Google el proyecto usará el lenguaje de desarrollo Java. . TFC Página 10 de 72 TFC Página 10 de 72 Especificación de requisitos La elección del trabajo conlleva una serie de requisitos funcionales explícitos y otra serie de requisitos no funcionales implícitos que se van a presentar a continuación. Requisitos funcionales Los requisitos del trabajo de final de carrera elegido constan de dos módulos principales con una serie de funcionalidades requeridas. En la tabla resumen de los requisitos se ha añadido la columna funcionalidad objetiva que es la que se corresponde con la funcionalidad correspondiente que se va a implementar en la aplicación final MapaQuejas. Módulos principales Funcionalidad requerida Funcionalidad objetiva Mapa basado en Api de Google Maps Localizar usuarios Localizar puntos denunciables o consulta de puntos cercanos Mostrar múltiples pines Consultar puntos dados de alta Configurar diálogos de los pines Proporcionar Información básica sobre los puntos Aplicar acciones al diálogo de los pines Ampliación de información, comentarios, fotos y posibilidad de enviar denuncia Zooming Realizar zoom sobre los mapas Cómo llegar Obtener indicaciones de la ruta hasta un punto Gestión de GPS Gestión de conversiones entre coordenadas de geolocalizacióndirecciones y viceversa a partir de la API de Google Facilitar la ubicación de los puntos y su interpretación por parte de los usuarios TFC Página 11 de 72 TFC Página 11 de 72 maps Gestión de cache local en base de datos SQLite Almacenar datos necesarios para el correcto funcionamiento de la app y mejora de performance Requisitos no funcionales Aunque no se especifiquen en el trabajo, son imprescindibles para el desarrollo del proyecto. Entorno de desarrollo y compilación El desarrollo de la aplicación se llevará a cabo usando Eclipse como entorno de desarrollo con los plugins necesarios para el desarrollo de aplicaciones Android. Control de versiones de código fuente Se usará un sistema de control de versiones para el código fuente de la aplicación de tipo GIT, el elegido es Bitbucket de Atlassian, ya que no obliga a hacer público el repositorio. Persistencia de datos Los datos de la aplicación deben almacenarse en un sistema, para ello se hará uso de un backend en el que se almacenarán los objetos necesarios. Lenguaje de programación Para desarrollar de forma nativa para Android se utilizará el lenguaje de programación Java, requisito imprescindible para tal fin. Librerías Se utilizará el framework para desarrollo nativo para Android así como las librerías adicionales para el acceso a la API de Maps y al Backend Parse.


Este sistema almacena la información en forma de objetos que pueden relacionarse entre sí. Para la aplicación se han creado tres tipos de objeto:  Poi: contiene los punto de interés Su estructura es la siguiente en formato JSON { "descripcion": "lleva dos meses rota", "titulo": "farola rota", "CP": "07008", "Coordenadas": { "__type": "GeoPoint", "latitude": 39.5814531, "longitude": 2.6676795 }, "Localidad": "Palma de Mallorca", "Direccion": "Carrer Semolera, 8A", "createdAt": "2012-12-13T20:46:41.317Z", "updatedAt": "2012-12-13T20:46:41.317Z", "objectId": "wYo5Btul74" }  Comentarios: contiene los comentarios asociados a un punto de interés Su estructura es la siguiente en formato JSON { "parent": { "__type": "Pointer", "className": "Poi", "objectId": "dVShuGj1Aw" }, "File": { "__type": "File", "name": "157f6760-be82-48a6-a446-da137b9f92d8-imagen.png", "url": "http://files.parse.com/4ce6afd8-5390-4e86-84e6- 1e743f3903e9/157f6760-be82-48a6-a446-da137b9f92d8-imagen.png" }, TFC Página 51 de 72 TFC Página 51 de 72 "Direccion": "Carrer Jacint Verdaguer, 94", "createdAt": "2012-12-16T21:38:13.001Z", "updatedAt": "2012-12-16T21:38:13.001Z", "objectId": "Q55593OdTd" }  PoiImage: contiene las imágenes asociadas a un punto de interés Su estructura es la siguiente en formato JSON { "parent": { "__type": "Pointer", "className": "Poi", "objectId": "O11zKogyjJ" }, "Comentario": "otro", "createdAt": "2012-12-16T21:24:40.719Z", "updatedAt": "2012-12-16T21:24:40.719Z", "objectId": "l1nbYuK6sa" } 


Conclusiones

Las conclusiones que se pueden derivar de la realización de este trabajo de final de carrera son muy positivas. Los requisitos iniciales que se presentaban tras la elección del proyecto se han cumplido en su mayoría si son revisados uno a uno, lo que se puede considerar un éxito. El hecho de trabajar con la metodología de trabajo de diseño centrado en el usuario me ha permitido mejorar mis conocimientos y valorar positivamente este tipo de técnicas para incluirlas en futuros proyectos en los que pueda participar. Utilizar nuevas tecnologías muy actuales como el uso de un software tipo Baas, herramientas de test de usuarios o el propio desarrollo en Android que evoluciona constantemente ha supuesto un reto y una fuente de aprendizaje inimaginable con respecto a mis objetivos iniciales. El volver a programar en Java después de haber trabajado en los últimos años en el entorno .NET, me ha servido de refresco para los conocimientos en ese lenguaje y en las herramientas de desarrollo empleadas como Eclipse, aparte de ser una dificultad añadida. Reiterar que el aprendizaje del conocimiento del desarrollo nativo en Android conseguido proyecto ha sido enriquecedor y espero no acabe aquí ya que la sensación que me queda es que tengo mucho que aprender. El resultado final no es perfecto, pero después de haber atravesado algunos problemas laborales, estoy contento con el resultado conseguido. En el siguiente punto me gustaría destacar los objetivos pendientes que tiene el proyecto. 






No comments:

Post a Comment