Temario
Parcial 3
- Introducción
- Intenciones (intents)
- Interfaces gráficas
- Controles básicos
- Controles de lista
- Layouts
- Toolbars y menús
- Cambios de configuracíon
- Dialogs
- Almacenamiento persistente
- Graficación
- Aplicaciones en Android
- Aplicaciones científicas
- Animaciones y juegos
- Procesos largos
- Media
- Grabar y reproducir audio
- Tomar y grabar fotografías
- Grabar y reproducir video
- 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
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…
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.
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