desarrollo de aplicaciones para android ii

Download Desarrollo de aplicaciones para android II

If you can't read please download the document

Upload: carlos-pardo

Post on 24-May-2015

1.405 views

Category:

Education


69 download

DESCRIPTION

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 multipla­taforma. El objetivo de este curso avanzado es que el alumno perfeccione la programación en este sistema operativo tratando materias no estudiadas en el curso de iniciación. Así, podrá desarrollar aplicaciones más complejas utilizando contenidos multimedia, 3D, sensores del dispositivo, servicios, etcétera. Las cinco unidades que lo componen son: Multimedia y gráficos en Android, interfaz de usuario avanzada, sensores y dispositivos de Android, bibliotecas, APIs y servicios de Android, y utilidades avanzadas.

TRANSCRIPT

  • 1. Desarrollo de aplicaciones para Android IICOLECCIN AULA MENTORSERIE PROGRAMACINMinisteriode Educacin, Culturay DeporteCamSpSGALV

2. Desarrollo de Aplicaciones para Android IIProgramacin 3. Catlogo de publicaciones del Ministerio: www.educacion.gob.esCatlogo general de publicaciones oficiales: www.publicacionesoficiales.boe.esAutorDavid Robledo FernndezCoordinacin pedaggicaHugo AlvarezEdicin y maquetacin de contenidosHugo AlvarezDiseo grfico e imagenAlmudena BretnNIPO: 030-14-019-1ISBN: 978-84-369-5541-5 4. NDICEPg.Unidad 0. Introduccin 111. Por qu un curso avanzado de Android?................................................................112. Cambios en las ltimas versiones de Android .......................................................113. La simbiosis de Android y Linux..............................................................................134. Instalacin del Entorno de Desarrollo ....................................................................164.1 Qu es Eclipse? 164.2 Instalacin de Java Development Kit (JDK) 164.3 Instalacin de Eclipse ADT 185. Aadir versiones y componentes de Android...........................................................236. Definicin del dispositivo virtual de Android..........................................................26Unidad 1. Multimedia y Grficos en Android 331. Introduccin.............................................................................................................332. Android Multimedia.................................................................................................333. Libreras de reproduccin y grabacin de audio.....................................................363.1 Clase SoundPool 363.2 Clase MediaPlayer 373.3 Clase MediaRecorder 393.3.1 Ejemplo de reproduccin y grabacin de audio 403.4 Cmo habilitar USB Debugging en Android 4.2 y superior Jelly Bean 493.5 Librera de reproduccin de vdeo 503.5.1 Ejemplo de reproduccin de vdeo 504. Conceptos bsicos de grficos en Android...............................................................594.1 Definicin de colores en Android 594.2 Clases de dibujo en Android 604.2.1 Clase Paint 604.2.2 Clase Rectngulo 604.2.3 Clase Path 604.2.4 Clase Canvas 614.2.4.1 Obtener tamao del Canvas: ................................................................................614.2.4.2 Dibujar figuras geomtricas: 614.2.4.3 Dibujar lneas y arcos: 624.2.4.4 Dibujar texto: 624.2.4.5 Colorear todo el lienzo Canvas: 624.2.4.6 Dibujar imgenes: 624.2.4.7 Definir un Clip (rea de seleccin): 624.2.4.8 Definir matriz de transformacin (Matrix): 63 5. 4.2.5 Definicin de dibujables (Drawable) 664.2.5.1 Dibujable de tipo bitmap (BitmapDrawable) 674.2.5.2 GradientDrawable (Gradiente dibujable) 674.2.5.3 ShapeDrawable (Dibujable con forma) 684.2.5.4 AnimationDrawable (Dibujable animado) 685. Animaciones de Android..........................................................................................705.1 Animaciones Tween 705.1.1 Atributos de las transformaciones Tween 715.2 API de Animacin de Android 745.2.1 Clases principales de la API de animacin 745.2.1.1 Animator 755.2.1.2 ValueAnimator 755.2.1.3 ObjectAnimator 765.2.1.4 AnimatorSet 765.2.1.5 AnimatorBuilder 775.2.1.6 AnimationListener 775.2.1.7 PropertyValuesHolder 785.2.1.8 Keyframe 785.2.1.9 TypeEvaluator 785.2.1.10 ViewPropertyAnimator 795.2.1.11 LayoutTransition 805.3 Animacin de Actividad 805.4 Interpolators (Interpoladores) 896. Vista de tipo Superficie (ViewSurface) ....................................................................926.1 Arquitectura de Grficos en Android 936.2 Qu es la clase ViewSurface? 937. Grficos en 3D en Android.....................................................................................1017.1 OpenGL 1027.1.1 Conceptos bsicos de geometra 1027.1.2 Conceptos bsicos de OpenGL 1047.2 Grficos en 2D 1077.3 Grficos en 3D con movimiento 1177.4 Grficos en 3D con textura y movimiento 1258. Resumen.................................................................................................................134Unidad 2. Interfaz de usuario avanzada 1361. Introduccin...........................................................................................................1362. Estilos y Temas en las aplicaciones de Android.....................................................1362.1 Cmo crear un Tema 1372.2 Atributos personalizados 1382.3 Definicin de recursos dibujables (Drawable) 1402.3.1 Recurso de color 1402.3.2 Recurso de dimensin 1412.3.3 Gradiente Drawable (Gradiente dibujable) 1412.3.4 Selector Drawable (Selector dibujable) 1422.3.5 Nine-patch drawable con botones 1432.4 Atributos de los temas 1442.5 Carga dinmica de Temas 1453. Implementacin de Widgets en la pantalla principal.............................................1473.1 Tipos de Widgets y sus limitaciones 1483.2 Ciclo de vida de un Widget 149 6. 3.3 Ejemplo de Creacin de un Widget 1503.4 Ejemplo de implementacin de un Widget 1503.4.1 Fichero de configuracin del widget: 1513.4.2 Clase que define el Widget: 1523.4.3 Servicio que actualiza el Widget: 1543.4.4 Interfaz de la Actividad de configuracin del Widget: 1573.4.5 Actividad de configuracin de las preferencias: 1583.4.6 Definicin de la aplicacin: 1613.5 Colecciones de Vistas en Widgets 1643.6 Activando Widgets en la pantalla de Bloqueo 1654. Creacin de fondos de pantalla animados.............................................................1664.1 Ejemplo de Creacin de un fondo de pantalla animado 1664.2 Ejemplo de implementacin de un fondo animado 1674.2.1 Fichero de configuracin del fondo animado: 1674.2.2 Servicio que implementa el fondo animado: 1674.2.3 Interfaz de la Actividad de configuracin del fondo animado: 1724.2.4 Actividad de configuracin de las preferencias: 1734.2.5 Actividad principal del usuario: 1744.2.6 Definicin de la aplicacin: 1745. Fragmentos............................................................................................................1795.1 Cmo se implementan los Fragmentos 1805.2 Ciclo de vida de un Fragmento 1925.2.1 Cmo guardar el estado de un Fragmento 1935.2.2 Cmo mantener los Fragmentos cuando la Actividad se recrea automticamente 1935.2.3 Cmo buscar Fragmentos 1945.2.4 Otras operaciones sobre Fragmentos (Transacciones) 1945.2.5 Cmo Gestionar la pila (Back Stack) de Fragmentos 1955.2.6 Cmo utilizar Fragmentos sin layout 1975.2.6.1 Comunicacin entre Fragmentos y con la Actividad 1975.2.7 Recomendaciones a la hora de programar Fragmentos 1985.2.8 Implementar dilogos con Fragmentos 1995.2.9 Otras clases de Fragmentos 2025.3 Barra de Accin (Action Bar) 2025.3.1 Cmo integrar pestaas en la Barra de accin 2076. Nuevas Vistas: GridView, Interruptor (Switch) y Navigation Drawer.....................2116.1 Grid View 2116.2 Interruptores (Switches) 2157. Navigation Drawer (Men lateral deslizante).........................................................2178. Resumen.................................................................................................................229Unidad 3. Sensores y dispositivos de Android 2311. Introduccin...........................................................................................................2312. Introduccin a los sensores y dispositivos............................................................2312.1 Gestin de Sensores de Android 2322.1.1 Cmo se utilizan los Sensores 2342.1.2 Sistema de Coordenadas de un evento de sensor 2393. Simulador de sensores de Android........................................................................2403.1 Instalacin del Simulador de Sensores 2413.2 Cmo utilizar el Simulador de Sensores 2433.2.1 Ejemplo de desarrollo de aplicacin con el Simulador de Sensores 2473.2.2 Grabacin de escenario de simulacin con un dispositivo real 251 7. 4. Dispositivos de Android.........................................................................................2534.1 Mdulo WIFI 2534.2 Mdulo Bluetooth 2614.3 Cmara de fotos 2674.3.1 Ejemplo de cmara mediante un Intent 2684.3.2 Ejemplo de cmara mediante API de Android 2694.4 Mdulo GPS 2815. Uso de sensores en un juego ..............................................................................2935.1 Desarrollo de un Juego en Android 2936. Resumen.................................................................................................................315Unidad 4. Bibliotecas, APIs y Servicios de Android 3171. Introduccin...........................................................................................................3172. Uso de Bibliotecas en Android...............................................................................3172.1 Ejemplo de Biblioteca de Android 3183. APIs del telfono: llamadas y SMS.........................................................................3273.1 TelephonyManager 3273.2 SMSManager 3283.3 Ejemplo de utilizacin de la API de telefona 3283.3.1 Clase Loader 3394. Calendario de Android...........................................................................................3434.1 API Calendario de Android 3434.2 Tabla Calendarios 3454.3 Tabla Eventos/Citas 3474.4 Tabla Invitados 3504.5 Tabla Recordatorios 3514.6 Tabla de instancias 3514.7 Intenciones de Calendario de Android 3524.8 Diferencias entre Intents y la API del Calendario 3544.9 Ejemplo de uso de Intents de la API del Calendario 3545. Gestor de descargas (Download manager)............................................................3665.1 Ejemplo de utilizacin del Gestor de descargas 3676. Cmo enviar un correo electrnico........................................................................3716.1 OAuth 2.0 de Gmail 3716.2 Intent del tipo message/rfc822 3716.3 Biblioteca externa JavaMail API 3716.4 Ejemplo sobre cmo envar un correo electrnico 3727. Servicios avanzados de Android.............................................................................3827.1 Teora sobre servicios de Android 3827.2 Servicios propios 3837.3 Intent Service 3857.4 Ejemplo de uso de IntentService 3857.5 Comunicacin con servicios 3927.6 Ejemplo de uso de AIDL 3938. Servicios SOAP en Android....................................................................................3988.1 Instalacin de bibliotecas SOAP en Eclipse ADT 3998.2 Desarrollo de un servidor SOAP en Eclipse ADT 4048.3 Ejemplo de uso de servidor SOAP en Android 4128.4 Peticin / Respuesta compleja SOAP en Android 4209. Resumen.................................................................................................................423 8. Unidad 5. Utilidades avanzadas 4251. Introduccin...........................................................................................................4252. Portapapeles de Android........................................................................................4252.1 Ejemplo de portapapeles 4263. Drag and Drop (Arrastrar y soltar)........................................................................4313.1 Proceso de Arrastrar y soltar 4313.2 Ejemplo de Arrastrar y soltar 4324. Gestin del toque de pantalla................................................................................4364.1 Ejemplo de gestin de toque de pantalla 4385. Tamaos de pantalla de los dispositivos Android..................................................4485.1 Android y tamaos de pantalla 4495.2 Densidades de pantalla 4505.3 Buenas prcticas de diseo de interfaces de usuario 4526. Internacionalizacin de aplicaciones Android.......................................................4536.1 Ejemplo del uso de Internacionalizacin 4547. Desarrollo rpido de cdigo Android....................................................................4598. Resumen.................................................................................................................461 9. 11Unidad 0. Introduccin1. Por qu un curso avanzado de Android?Android es un sistema operativo multidispositivo, inicialmente diseado para telfonos mviles. En la actualidad se puede encontrar tambin en mltiples dispositivos, como ordenadores, tabletas, GPS, televisores, discos duros multimedia, mini ordenadores, cmaras de fotos, etctera. Incluso se ha instalado en microondas y lavadoras.Est basado en Linux, que es un ncleo de sistema operativo libre, gratuito y multiplataforma.Este sistema operativo permite programar aplicaciones empleando una variacin de Java llamada Dalvik, y proporciona todas las interfaces necesarias para desarrollar fcilmente aplicaciones que acceden a las funciones del telfono (como el GPS, las llamadas, la agenda, etctera) utilizando el lenguaje de programacin Java.Su sencillez, junto a la existencia de herramientas de programacin gratuitas, es principalmente la causa de que existan cientos de miles de aplicaciones disponibles, que amplan 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 ms 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.El objetivo de este curso avanzado es que el alumno o alumna perfeccione la pro- gramacin en este sistema operativo tratando materias no estudiadas en el curso de iniciacin. As, podr desarrollar aplicaciones ms complejas utilizando conteni- dos multimedia, 3D, sensores del dispositivo, servicios, etctera.2. Cambios en las ltimas versiones de Android1.5 Cupcake 1.6 Donut 2.0/2.1 Eclair 2.2 Froyo 2.3 Gingerbread 3.0/3.1 Honeycomb ...IceCreamSandwichU0 Introduccin 10. 12Aula MentorQuien est familiarizado con el sistema operativo Android ya sabr que los nombres de sus diferentes versiones tienen el apodo de un postre.A continuacin, vamos a comentar la evolucin de las diferentes versiones indicando las mejoras y funcionalidades disponibles en cada una. Partiremos de la versin 3.0 ya que las versiones anteriores a sta se tratan en el curso de Iniciacin de Android de Mentor.- Android 3.0 (API 15)Esta versin se dise pensando en las tabletas, que disponen de un hardware mucho ms potente. Entre sus nuevas funcionalidades podemos encontrar: Soporte para grandes pantallas, como las tabletas. Inclusin del concepto de Fragmento (en ingls, Fragment). Nuevos elementos de interfaz como las barras de accin (action bars) y el arrastrar y soltar (drag-and-drop). Instalacin de un nuevo motor OpenGL 2.0 para animacin en 3D.Esta versin de Android se dise exclusivamente para ser utilizada en tabletas. En otros dispositivos, como los telfonos, era necesario seguir utilizando la versin 2.3.7 disponible en ese momento.- Android 4.0 (API 16)A partir de esta versin se unifica el sistema operativo para que pueda utilizarse tanto en tabletas como en otros dispositivos, como telfonos mviles. As, se unifica la experiencia de usuario en todos los dispositivos. Entre sus nuevas funcionalidades podemos destacar: Optimizacin en las notificaciones al usuario. Permite al usuario cambiar el tamao de los widgets. Aade diferentes formas de desbloquear la pantalla del dispositivo. Corrector ortogrfico integrado. NFC (Near Field Communication) Wi-Fi Direct para compartir archivos entre dispositivos. Encriptacin 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 vdeos. MTP (Media Transfer Protocol) que permite conectar el dispositivo al ordenador por USB de forma ms simple. Gestin de derechos de autor mediante Digital Rights Management (DRM).- Android 4.2 (API 17)Esta versin no supone un salto en cuanto a las posibilidades que ofrece desde el punto de vista del desarrollador. Sin embargo, es una versin estable y madura. Entre sus nuevas funcionalidades podemos destacar: Soporte multiusuario. Posibilidad e inclusin de Widgets en la ventana de bloqueo. Mejoras de interfaz y de cmara de fotos.- Android 4.3 (API 18)De igual forma que en la versin anterior, esta versin no supone un cambio radical en funcionalidades disponibles al desarrollador. Sin embargo, es una versin ms 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 batera de estos dispositivos. Inclusin de la librera OpenGL ES 3.0 que permite mejorar en grficos 3D. 11. 13 Definicin de perfiles de usuario limitados que, desde el punto de vista del desarrollador, implican una gestin de las Intenciones implcitas (Implicit Intent) para comprobar si el usuario tiene permisos para acceder a ese tipo de Intencin. Mejoras en la gestin multimedia y de codecs de archivos de vdeo. Adems, permite crear un vdeo de una Superficie dinmica. Nuevos tipos de sensores relacionados con juegos. Nueva Vista ViewOverlay que permite aadir 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 depuracin USB de todos los ordenadores o mostrar informacin 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.Este curso est basado en la ltima versin de Android disponible que es la 4.3 y todos los ejemplos y aplicaciones son compatibles con sta. De todas formas, no debe haber ningn problema en utilizar este cdigo fuente en versiones futuras de Android.ImportanteLos contenidos de este curso estn diseados para alumnos que estn familiariza- dos con el entorno de desarrollo Eclipse / Android / Emulador de Android. Por ello, los alumnos deben conocer y manejar con soltura Vistas bsicas, Actividades, Me- ns, Dilogos, Adaptadores, sistema de ficheros, Intenciones, Notificaciones, Con- tent Providers y utilizacin de SQLite. Todos estos conceptos bsicos de desarrollo en este sistema operativo se tratan en el curso de Iniciacin a Android de Mentor.3. La simbiosis de Android y LinuxU0 Introduccin 12. 14Aula MentorComo sabes, Android est basado en Linux para los servicios base del sistema, como seguridad, gestin de memoria, procesos y controladores. El diagrama de la arquitectura de Android tiene este aspecto:Antes del ao 2005, Linux estaba disponible en servidores web, aplicaciones de escritorio de algunas empresas y administraciones, as como en ordenadores de programadores y entusiastas. Sin embargo, con el despegue de Android, Linux empieza a estar instalado en nuestros mviles y tabletas de forma masiva. En este apartado vamos a ver por qu es tan importante la simbiosis Android y Linux.El desarrollo de Linux empez el ao 1991 de la mano del famoso estudiante finlands Linus Torvalds que crea la primera versin de este sistema operativo con el fin de implementar una versin libre de licencias (Open Source) de Unix que cualquier programador pudiera modificar o mejorar a su antojo.Al poco tiempo, grandes compaas como Intel e IBM advirtieron su potencial frente a Windows e invirtieron grandes cantidades de dinero. Su objetivo principal era no depender de Microsoft y, de paso, obtener un sistema operativo sin tener que empezar de cero.En la actualidad, los sistemas operativos basados en Linux son sinnimo de estabilidad, seguridad, eficiencia y rendimiento.Sin embargo, hasta la aparicin de Android, a Linux le faltaba el xito entre el gran p 13. 15blico quedando casi relegado a los servidores.Desde entonces, cada nuevo proyecto basado en Linux ha tenido como objetivo el gran pblico. Ubuntu, con una interfaz muy sencilla e intuitiva y teniendo en cuenta al usuario como primera prioridad, es hasta ahora la distribucin de escritorio ms popular de la historia del sistema operativo, gracias a que sus desarrolladores crearon una instalacin automtica de drivers y cdecs. Adems, su interfaz actual, llamada Unity, aplica conceptos del entorno mvil, y, de hecho, ya hay una versin preliminar de Ubuntu para telfonos.A pesar de todo esto, sin embargo, a Linux le faltan los programas comerciales ms importantes, por lo que nicamente el 1% de los PCs del mundo funcionan con Linux.En el ao 2005 surge Android, que, debido a su carcter abierto, emple el kernel (ncleo) de Linux como base. Tcnicamente, Android no es una distribucin de Linux, ya que la cantidad de modificaciones realizadas al cdigo hace que se considere un sistema operativo independiente, aunque gran parte del cdigo se comparte con el Linux normal de escritorio. Pero, por qu ha conseguido Google llegar a tal cantidad de dispositivos en todo el mundo? La respuesta es simple: ha colaborado con los fabricantes.Para que Android (o cualquier sistema operativo) pueda ejecutarse en un dispositivo mvil, son necesarios los drivers. Los drivers son programas integrados en una librera que indica al sistema operativo cmo controlar las distintas partes de hardware. Por ejemplo, para poder utilizar la red WiFi, Android necesita conocer cmo indicar al chip las instrucciones que necesita mediante los drivers. Dado que los drivers incluyen informacin sobre cmo funciona el hardware fsicamente, los fabricantes son siempre reacios a publicar su informacin por temor a que los competidores los copien. Google consigui garantizar a los fabricantes la independencia de sus tecnologas al mismo tiempo que aprovechaba la filosofa abierta de Linux para fabricar un sistema alrededor de ellos. Por esta razn, puedes descargarte Android de Internet pero realmente no puedes ejecutarlo en tu mvil sin obtener los drivers antes y compilarlos.A lo largo de este tiempo, la relacin Android/Linux ha tenido unos cuantos altibajos ya que Google ha exigido cambios en Linux para mejorar Android sin tener en cuenta que Linux es un proyecto global.Con todo, la historia de Android y Linux no ha terminado, ni mucho menos. De hecho, se podra decir que acaba de empezar. Algunos analistas de Internet hablan de que al final Linux s vencer al otrora omnipotente Windows, pero ser a travs de Android. El tiempo dir.U0 Introduccin 14. 16Aula Mentor4. Instalacin del Entorno de Desarrollo4.1 Qu es Eclipse?Como sabes, Eclipse es un entorno de software multi-lenguaje de programacin que incluye un entorno de desarrollo integrado (IDE). Inicialmente, se dise pensando principalmente en el lenguaje de programacin Java y se puede utilizar para desarrollar aplicaciones en este lenguaje.En la web oficial de Eclipse (www.eclipse.org), se define como An IDE for everything and nothing in particular (un IDE para todo y para nada en particular). Eclipse es, en realidad, un armazn (workbench) sobre el que se pueden instalar herramientas de desarrollo para cualquier lenguaje, mediante la implementacin de los plugins adecuados. El trmino plugin procede del ingls to plug, que significa enchufar. Es un software que permite cambiar, mejorar o agregar funcionalidades.La arquitectura de plugins de Eclipse permite, adems de integrar diversos lenguajes sobre un mismo IDE, introducir otras aplicaciones accesorias que pueden resultar tiles durante el proceso de desarrollo, tales como herramientas UML (modelado de objetos), editores visuales de interfaces, ayuda en lnea para libreras, etctera.Si has realizado el curso de Iniciacin de Android de Mentor habrs utilizado ya Eclipse y tendrs soltura en su uso.Google ha simplificado todo el proceso de instalacin del entorno de desarrollo preparando en un nico archivo todos los archivos necesarios. Este entorno se denomina ADT (Android Developer Tools) que denominaremos en el curso Eclipse ADT. Adems, el nuevo entorno ya es compatible con Java 1.7.4.2 Instalacin de Java Development Kit (JDK)Es muy importante tener en cuenta que, para poder ejecutar el entorno de desarrollo Eclipse ADT, es necesario tener instaladas en el ordenador las libreras de desarrollo de Java. La ltima versin 1.7 ya es compatible con Eclipse ADT.Podemos descargar la versin correcta del JDK de Java en:http://www.oracle.com/technetwork/es/java/javase/downloads/index.html 15. 17Si haces clic en el enlace anterior indicado, puedes encontrar un listado con todos los JDK de Java:U0 Introduccin 16. 18Aula MentorNota: en el caso de Linux o Mac, es posible tambin instalar Java usando los programas habituales del sistema operativo que permiten la actualizacin de paquetes.Nota: si vas a instalar Eclipse ADT en Linux, lee las notas que se encuentran en Preguntas y Respuestas de esta Introduccin en la mesa del curso.4.3 Instalacin de Eclipse ADTLa instalacin es muy sencilla. Simplemente accedemos a la pgina web:http://developer.android.com/intl/es/sdk/index.htmlSi vamos a instalar Eclipse ADT en Windows, podemos hacer clic directamente en el enlace Download the SDK. En caso contrario debemos hacer clic en el enlace DOWNLOAD FOR OTHER PLATFORMS y seleccionar el sistema operativo correspondiente.Hay que tener en cuenta que debemos descargar la versin 32 bits o 64 bits en funcin del sistema operativo de que dispongamos.En el caso de Windows podemos ver el tipo de sistema operativo haciendo clic con el botn derecho del ratn en el icono Equipo o Mi PC del Escritorio y haciendo clic de nuevo en Propiedades: 17. 19En el caso de Linux, desde la lnea de comandos podemos ejecutar el siguiente comando para saber si el sistema operativo es de 64bits:$ uname -mx86_64En el caso de Apple Mac, desgraciadamente, slo est disponible Eclipse ADT si ests utilizando un kernel de 64 bits. Para saber si tu Mac ejecuta el sistema operativo de 64 bits sigue estas instrucciones:- En el men Apple (), selecciona Acerca de este Mac y a continuacin, haz clic en Ms informacin:- En el panel Contenido, selecciona Software.- Si Extensiones y kernel de 64 bits est configurada como S, ests utilizando un kernel de 64 bits.Cuando hayamos descargado el fichero correspondiente, lo copiamos a un directorio o carpeta del ordenador y descomprimimos este fichero.Es recomendable usar un directorio sencillo que podamos recordar fcilmente, por ejemploU0 Introduccin 18. 20Aula MentorC:cursosMentoradt. Adems, es muy importante que los nombres de los directorios no contengan espacios, pues Eclipse ADT puede mostrar errores y no funcionar correctamente.Una vez descomprimido el fichero, Eclipse ADT est listo para ser utilizado; no es necesario hacer ninguna operacin adicional.Recomendamos que conviene hacer un acceso directo del archivo C:cursosMentoradteclipse eclipse.exe en el Escritorio del ordenador para arrancar rpidamente el entorno de programacin Eclipse ADT.Si arrancamos Eclipse ADT haciendo doble clic sobre el acceso directo que hemos creado anteriormente, a continuacin, Eclipse pedir que seleccionemos el workspace, es decir, el directorio donde queremos guardar los proyectos. 19. 21Seleccionaremos un directorio sencillo y fcil de recordar.Importante: Recomendamos usar el directorio C:cursosMentorproyectos como carpeta per- sonal.Finalmente hacemos clic en OK para abrir Eclipse ADT:U0 Introduccin 20. 22Aula MentorSi cerramos la pestaa abierta, podemos ver ya el entorno de desarrollo que deberas conocer si has hecho del curso de inciacin:Ahora vamos a comprobar en las preferencias que la versin de Java en Eclipse ADT es correcta para compilar proyectos de Android. Para ello, hacemos clic en la opcin del men Window-> Preferences..., hacemos clic en el panel izquierdo sobre Java->Installed JREs y seleccionamos jre7 en el campo Installed JREs: 21. 23Para finalizar, en esta ventana hay que seleccionar la versin de Java utilizada para compilar los proyectos de Android. Para ello hacemos clic en Java->Compiler y elegimos 1.6 en el campo Compiler compliance settings:Es muy importante comprobar la versin de java de compilacin5. Aadir versiones y componentes de AndroidAunque Eclipse ADT incluye ya la ltima versin del SDK Android, el ltimo paso de la configuracin consiste en descargar e instalar los componentes restantes del SDK que utilizaremos en este curso.El SDK utiliza una estructura modular que separa las distintas versiones de Android, complementos, herramientas, ejemplos y la documentacin en un nico paquete que se puede instalar por separado. En este curso vamos a usar la versin 4.3, por ser la ltima en elU0 Introduccin 22. 24Aula Mentormomento de redaccin de la documentacin. No obstante, vamos a emplear sentencias compatibles y recompilables en otras versiones.Para aadir esta versin hay que hacer clic en la opcin Android SDK Manager del men principal Window de Eclipse:Eclipse ADT tambin dispone de un botn de acceso directo:Si lo hacemos, se abrir la ventana siguiente: 23. 25Para instalar la versin 4.3 (si no lo est ya), seleccionamos los paquetes que se muestran en la siguiente ventana:Nota: la revisin de las versiones de Android puede ser superior cuando al alumno o alumna instale el SDK.Una vez hemos pulsado el botn Install 4 packages, aparece esta ventana y seleccionamos la opcin Accept All y, despus, hacemos clic en Install:U0 Introduccin 24. 26Aula MentorEl instalador tarda un rato (10-20 minutos) en descargar e instalar los paquetes. Una vez acabado se indicar que la instalacin ha finalizado correctamente.6. Definicin del dispositivo virtual de AndroidPara poder hacer pruebas de las aplicaciones Android que desarrollemos sin necesidad de disponer de un telfono Android, el SDK incluye la posibilidad de definir un Dispositivo Virtual de Android (en ingls, AVD, Android Virtual Device). Este dispositivo emula un terminal con Android instalado.Antes de crear el AVD, es recomendable instalar el acelerador por hardware de Intel del AVD llamado Intel Hardware Accelerated Execution Manager. As, conseguiremos que el AVD se ejecute con mayor rapidez y eficiencia. Si abres el explorador de ficheros en el directorio:Debes ejecutar el archivoC:cursosMentoradtsdkextrasintelHardware_Accelerated_Execution_ ManagerIntelHaxm.exe: 25. 27Es recomendable dejar que el instalador elija la memoria por defecto utilizada:A continuacin, pulsamos el botn Next:U0 Introduccin 26. 28Aula MentorSi pulsamos el botn Install, se instalar el la utilidad:Atencin: Este acelerador de hardware slo est disponible en algunos procesadores de Intel que disponen de tecnologa de virtualizacin (VT=Virtualization Technology). Adems, slo est disponible para el sistema operativo Windows. 27. 29Independientemente de que hayas podido instalar el acelerador, continuamos definiendo el AVD. A continuacin, hacemos clic en la opcin Android AVD Manager del men principal Window de Eclipse:Aparecer la siguiente ventana:U0 Introduccin 28. 30Aula MentorHacemos clic en el botn New de la ventana anterior y la completamos como se muestra en la siguiente ventana: 29. 31Si no has podido instalar el acelerador del emulador, debes seleccionar el campo CPU/ABI siguiente:La opcin Snapshot-> Enabled permite guardar el estado del dispositivo de forma que todos los cambios que hagamos, como cambiar la configuracin de Android o instalar aplicaciones, queden guardados. As, la prxima vez que accedamos al emulador, se recupera automticamente el ltimo estado.Importante: En el curso hemos creado un dispositivo virtual que no guarda el estado porque puede producir problemas de ejecucin con Eclipse ADT. En todo caso, el alumno o alumna puede usar la opcin Edit del AVD cuando crea necesario que los lti- mos cambios sean almacenados para la siguiente sesin de trabajo.U0 Introduccin 30. 32Aula MentorPara acabar, basta con hacer clic en OK:Puedes encontrar el vdeo Cmo instalar Eclipse ADT, que muestra de manera visual los pasos seguidos en las explicaciones anteriores. 31. 33Unidad 1. Multimedia y Grficos en Android1. IntroduccinEn esta Unidad vamos a explicar cmo disear aplicaciones multimedia Android para or msica, grabar con el micrfono y cargar vdeos desde una tarjeta SD.Algunas aplicaciones Android deben mostrar un aspecto dinmico o representar algn dato en forma grfica para que el usuario visualice mejor la informacin que se le est ofreciendo. Como hemos comentado anteriormente en el curso, una aplicacin Android tiene xito si est bien programada internamente y, adems, si tiene una apariencia atractiva exteriormente.Para poder desarrollar aplicaciones que incluyan estas funcionalidades es necesario adquirir previamente los Conceptos bsicos de grficos en Android.Los grficos 2D/3D y las animaciones suelen ser muy tiles para presentar visualmente informacin al usuario.Para adquirir estas destrezas como programador Android, aprenderemos a animar imgenes de forma sencilla utilizando la API de animaciones de Android.Despus, veremos qu es una Vista de tipo Superficie (ViewSurface) y sus aplicaciones ms interesantes.Finalmente, estudiaremos cmo aplicar a proyectos Android la conocidsima librera OpenGL para crear grficos en 2D y 3D, aplicarles colores, animarlos y permitir que el usuario interaccione con ellos.2. Android MultimediaHoy en da, los dispositivos mviles han sustituido a muchos antiguos aparatos que utilizbamos para escuchar msica, grabar conversaciones, ver vdeos, etctera.En este apartado vamos a ver cmo disear aplicaciones multimedia Android y reproducir este tipo de archivos de audio y vdeo.Mediante ejemplos prcticos expondremos una explicacin detallada de las funciones propias del SDK que permitirn implementar una aplicacin multimedia.La integracin 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 vdeo desde:- Un fichero almacenado en el dispositivo, normalmente en la tarjeta externa SD.- Un recurso que est embutido en el paquete de la aplicacin (fichero .apk).- Mediante el streaming: distribucin de multimedia a travs 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://.Tambin es posible grabar audio y vdeo, siempre y cuando el hardware del dispositivo lo permita.U1 Multimedia y Grficos en Android 32. 34Aula MentorA continuacin, se muestra un listado de las clases de Android que nos permiten acceder a estos servicios Multimedia:- MediaPlayer: reproduce audio y vdeo desde ficheros o de streamings.- MediaController: representa los controles estndar para MediaPlayer (botones de reproducir, pausa, stop, etctera).- VideoView: Vista que permite la reproduccin de vdeo.- MediaRecorder: clase que permite grabar audio y vdeo.- AsyncPlayer: reproduce una lista de archivos de tipo audio desde un hilo secundario.- AudioManager: gestor del sonido del sistema operativo de varias propiedades como son el volumen, los tonos de llamada/notificacin, etctera.- AudioTrack: reproduce un archivo de audio PCM escribiendo un bfer directamente en el hardware. PCM son las siglas de Pulse Code Modulation, que es un procedimiento de modulacin utilizado para transformar una seal analgica en una secuencia de bits.- SoundPool: gestiona y reproduce una coleccin de recursos de audio de corta duracin.- JetPlayer: reproduce audio y video interactivo creado con SONiVOX JetCreator.- Camera: clase para tomar fotos y video con la cmara.- FaceDetector: clase para identificar la cara de las personas en una imagen de tipo bitmap.El sistema operativo Android soporta una gran cantidad de tipos de formatos multimedia, la mayora de los cuales pueden ser tanto decodificados como codificados. A continuacin, mostramos una tabla con los formatos nativos multimedia soportados por Android. Hay que tener en cuenta que algunos modelos de dispositivos pueden incluir formatos adicionales que no se incluyen en esta tabla, como DivX.TipoFormatoCodificaDecodificaInformacinExtensin ficheroVideoH.263SS3GPP (.3gp)MPEG-4 (.mp4)H.264 AVCa partir Android 3.0SBaseline Profile (BP)3GPP (.3gp)MPEG-4 (.mp4)MPEG-4 SPS3GPP (.3gp)WP8a partir Android 2.3.3Streaming a partir de Android 4.0WebM (.webm)Matroska (.mkv)TipoFormatoCodificaDecodificaInformacinExtensin ficheroImagenJPEGSSBase + progresivoJPEG (.jpg)GIFSGIF (.gif)PNGSSPNG (.png)BMPSBMP (.bmp)WEBPa partir Android 4.0a partir Android 4.0WebP (.webp) 33. 35TipoFormatoCodificaDecodificaInformacinExtensin ficheroAudioAAC LC/LTPSSMono/estreo con cualquier combinacin estndar de frecuencia > 160 Kbps y ratios de muestreo de 8 a 48kHz3GPP (.3gp)MPEG-4(. mp4)No soporta raw AAC (.aac) ni MPEG-TS (.ts)HE-AACv1a partir Android 4.1SHE-AACv2SAAC ELDa partir Android 4.1a partir Android 4.1Mono/estreo,16-8kHzAMR-NBSS4.75 a 12.2 Kbps muestreada a @ 8kHz3GPP (.3gp)AMR-WBSS9 ratios de 6.60 Kbps a 23.85 Kbps a @ 16kHz3GPP (.3gp)MP3SMono/estreo de 8 a 320 Kbps, frecuencia de muestreo constante (CBR) o variable (VBR)MP3 (.mp3)MIDISMIDI tipo 0 y 1. DLS v1 y v2. XMF y XMF mvil. Soporte para tonos de llamada RTTTL / RTX, OTA y iMelody.Tipo 0 y 1 (.mid, .xmf, .mxmf).RTTTL / RTX(.rtttl, .rtx),OTA (.ota)iMelody (.imy)Ogg VorbisSOgg (.ogg)Matroska (.mkva partir 4.0)FLACa partir Android 3.1mono/estereo(no multicanal)FLAC (.flac)PCM/WAVEa partir Android 4.1S8 y 16 bits PCM lineal (frecuencias limitadas por el hardware)WAVE (.wav)Aunque el listado anterior pueda parecer muy complicado y amplio, te recomendamos que le eches un vistazo a la Wikipedia donde se explica los distintos Formatos de archivo de audio.U1 Multimedia y Grficos en Android 34. 36Aula Mentor3. Libreras de reproduccin y grabacin de audioAndroid incluye distintos tipos de flujos de audio con sus respectivos volmenes de sonido dependiendo del propsito de estos audios: msica, tono de notificacin, tono de llamada, alarma, etctera.Para obtener informacin sobre cmo ha configurado el usuario el volumen de los diferentes flujos de audio, debemos utilizar la clase AudioManager que permite acceder a la configuracin de sonidos del sistema. Mediante la llamada al mtodo getSystemService(AUDIO_ SERVICE) se obtiene una instancia a este gestor de Audio.Entre sus mtodos, podemos destacar:- getStreamVolume(int streamType): obtiene el volumen definido por el usuario para el tipo de flujo indicado como parmetro.- getStreamMaxVolume(int streamType): obtiene el volumen mximo que se puede definir para este tipo de flujo.- isMusicActive(): indica si se est reproduciendo msica.- getRingerMode(): devuelve el modo de sonidos del dispositivo; puede tomar las contantes RINGER_MODE_NORMAL, RINGER_MODE_SILENT, o RINGER_MODE_VIBRATE.Existen mtodos adicionales que permiten conocer si el audio se reproduce a travs de un dispositivo Bluetooth, ajustar el volumen de un tipo de audio, etctera. Te recomendamos que le eches un vistazo a la documentacin oficial.Para establecer el volumen del audio que vamos a reproducir en esa actividad debemos utilizar el mtodo setVolumeControlStream() en el evento onCreate() de la Actividad dependiendo del propsito:- Volumen para msica o vdeo:this.setVolumeControlStream(AudioManager.STREAM_MUSIC);- Permite, adems, que el usuario utilice los botones del dispositivo para subir y bajar su volumen.- Volumen para tono de llamada del telfonothis.setVolumeControlStream(AudioManager.STREAM_RING);- Volumen de alarmathis.setVolumeControlStream(AudioManager.STREAM_ALARM);- Volume de notificacinthis.setVolumeControlStream(AudioManager.STREAM_NOTIFICATION);- Volumen del sistemathis.setVolumeControlStream(AudioManager.STREAM_SYSTEM);- Volumen de llamada por vozthis.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 SoundPoolLa clase SoundPool permite reproducir sonidos de forma rpida y simultneamente.Es recomendable utilizar la primera API SoundPool para reproducir pequeos archivos de audio que no deben exceder 1 MB de tamao, por lo que es el mecanismo ideal para reproducir efectos de sonido como en los juegos.Con la clase SoundPool podemos crear una coleccin de sonidos que se cargan en la 35. 37memoria desde un recurso (dentro de la APK) o desde el sistema de archivos. SoundPool utiliza el servicio de la clase MediaPlayer, que estudiaremos a continuacin, para descodificar el audio en un formato crudo (PCM de 16 bits) y mantenerlo cargado en memoria; as, el hardware lo reproduce rpidamente sin tener que decodificarlas cada vez.La clase SoundPool realiza esta carga en memoria de los archivos multimedia de forma asncrona, 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 repeticin al reproducirlo, o mantenerlo reproduciendo en un bucle infinito con el valor -1. En este ltimo caso, es necesario detenerlo con el mtodo stop().Tambin podemos establecer la velocidad de reproduccin del sonido, cuyo rango puede estar entre 0.5 y 2.0. Una velocidad de reproduccin 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 parmetro el nmero mximo de sonidos que se pueden reproducir simultneamente. Este parmetro no tiene por qu coincidir con el nmero de sonidos cargados. Adems, cuando se reproduce un sonido con su mtodo play(), hay que indicar su prioridad. As, cuando el nmero de reproducciones activas supere el valor mximo establecido en el constructor, esta prioridad permite que el sistema detenga el flujo con la prioridad ms baja y, si todos tienen la misma prioridad, se parar el ms antiguo. Sin embargo, en el caso de que el nuevo flujo sea el de menor prioridad, ste no se reproducir.En el ejemplo prctico vamos a estudiar los mtodos ms importantes de esta clase.3.2 Clase MediaPlayerLa segunda API es la ms importante de Android y realiza la reproduccin multimedia mediante la clase bsica MediaPlayer (reproductor multimedia) que permite reproducir audio de larga duracin. A continuacin, estudiaremos las caractersticas ms importantes de esta clase y cmo podemos sacarle partido.La diferencia entre utilizar la clase SoundPool y MediaPlayer est en la duracin y tamao del archivo de sonido. Para sonidos cortos, debemos utilizar la primera clase, dejando la segunda para reproducciones largas como canciones de msica.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 reproduccin de un archivo multimedia.- Prepared: preparado para reproducir un recurso.- Started: reproduciendo un contenido.- Paused: en pausa.- Stopped: parado.- Playback Completed: reproduccin completada.- End: finalizado.- Error: indica un error.U1 Multimedia y Grficos en Android 36. 38Aula MentorEs importante conocer en qu estado se encuentra el reproductor multimedia, ya que muchos de sus mtodos nicamente se pueden invocar desde determinados estados.Por ejemplo, no podemos cambiar al modo en reproduccin (con su mtodo start()) si no se encuentra en el estado preparado. Lgicamente, tampoco podremos cambiar al modo en pausa (con su mtodo pause()) si ya est parado. Ocurrir un error de ejecucin si invocamos un mtodo no admitido para un determinado estado.El siguiente esquema permite conocer los mtodos que podemos invocar desde cada uno de sus estados y cul es el nuevo estado al que cambiar el objeto tras invocarlo: 37. 39Existen dos tipos de mtodos:- Asncronos: onPrepared(), onError(), onCompletion(). Los lanza el sistema cuando ha acabado una tarea.- Sncronos: el resto de mtodos que se ejecutan de forma continua cuando se invocan, es decir, no hay que esperar.Mediante un ejemplo prctico vamos a estudiar los mtodos ms importantes de esta clase.3.3 Clase MediaRecorderLa API de Android ofrece tambin la posibilidad de capturar audio y vdeo, permitiendo su codificacin en diferentes formatos. La clase MediaRecorder permite, de forma sencilla, integrar esta funcionalidad a una aplicacin.La mayora de los dispositivos Android disponen de un micrfono que puede capturar audio.La clase MediaRecorder dispone de varios mtodos que puedes utilizar para configurar la grabacin:- setAudioSource(int audio_source): dispositivo que se utilizar como fuente del sonido, es decir, el micrfono. Normalmente, indicaremos MediaRecorder.AudioSource.MIC. Si bien, es posible utilizar otras constantes como DEFAULT (micrfono por defecto), CAMCORDER (micrfono que tiene la misma orientacin que la cmara), VOICE_CALL (micrfono para llamadas), VOICE_COMUNICATION (micrfono para VoIP), etctera.- setOutputFile (String fichero): permite indicar el nombre del fichero donde se guardar la informacin.- setOutputFormat(int output_format): establece el formato del fichero de salida. Se pueden utilizar las constantes siguientes de la clase MediaRecorder.OutputFormat: DEFAULT, AMR_NB, AMR_WB, RAW_AMR (ARM), MPEG_4 (MP4) y THREE_GPP (3GPP).- setAudioEncoder(int audio_encoder): permite seleccionar la codificacin del audio. Podemos indicar cuatro posibles constantes de la clase MediaRecorder.AudioEncoder: AAC, AMR_NB, AMR_WB y DEFAULT.- setAudioChannels(int numeroCanales): especifica el nmero de canales de la grabacin: 1 para mono y 2 para estreo.- setAudioEncodingBitRate(int bitRate): indica los bits por segundo (bps) utilizados en la codificacin (desde nivel de API 8).- setAudioSamplingRate(int samplingRate): permite indicar el nmero de muestreo por segundo empleados en la codificacin (desde nivel de API 8).- setProfile(CamcorderProfile profile): permite elegir un perfil de grabacin de vdeo.- setMaxDuration(int max_duration_ms): indica la duracin mxima de la grabacin. Pasado este tiempo, sta se detendr.- setMaxFileSize(long max_filesize_bytes): establece el tamao mximo para el fichero de salida. Si se alcanza este tamao, la grabacin se detendr.- prepare(): prepara la grabacin para la captura del audio o vdeo.- start(): inicia la grabacin.- stop(): finaliza la grabacin.- reset(): reinicia el objeto como si lo acabramos de crear por lo que debemos configurarlo de nuevo.- release(): libera todos los recursos utilizados del objeto MediaRecorder. Si no invocas este mtodo, los recursos se liberan automticamente cuando el objeto se destruya.U1 Multimedia y Grficos en Android 38. 40Aula MentorAdicionalmente, la clase MediaRecorder dispone de mtodos que puedes utilizar para configurar la grabacin de video.Tal y como ocurre con la clase MediaPlayer, para poder invocar los diferentes mtodos de la clase MediaRecorder debemos estar en un estado determinado. El siguiente esquema permite conocer los mtodos que podemos invocar desde cada uno de sus estados y cul es el nuevo estado al que cambiar el objeto tras invocarlo:En el ejemplo prctico vamos a aprender los mtodos ms importantes de esta clase.3.3.1 Ejemplo de reproduccin y grabacin de audioEs recomendable abrir el Ejemplo 1 de esta Unidad para seguir la explicacin siguiente.La aplicacin de este ejemplo muestra tres botones: el primero permite reproducir un tono utilizando la clase SoundPool, el segundo botn reproduce un archivo largo de audio y el ltimo botn, graba una conversacin utilizando el micrfono 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 39. 41pulsa en un botn.En cdigo del layout activity_main.xml se incluye el diseo de la Actividad principal:Una vez expuesto el sencillo diseo de la Actividad, veamos la lgica de sta en el fichero MainActivity.java:public class MainActivity extends Activity {// Objetos de las clases SoundPool y MediaPlayerprivate SoundPool sPool;private MediaPlayer mPlayer;// Guarda los IDs de sonidos que se deben reproducir por SoundPoolprivate int soundID1=-1, soundID2=-1;// Vistas de la Actividadprivate TextView logTextView;private ScrollView scrollview;// Grabador de audioprivate MediaRecorder recorder;// Fichero donde guardamos el audioprivate File audiofile = null;// Botones de la Actividadprivate Button boton_spool1, boton_spool2;private Button boton_mplayer;private Button boton_mrecorder;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.main_layout);// Localizamos las Vistas del layoutlogTextView = (TextView) findViewById(R.id.Log); 41. 43scrollview = ((ScrollView)findViewById(R.id.ScrollView));// Establecemos el tipo de flujo de audio que deseamosthis.setVolumeControlStream(AudioManager.STREAM_MUSIC);// Cargamos el tono con SoundPool indicando el tipo de flujo// STREAM_MUSICsPool = new SoundPool(2, AudioManager.STREAM_MUSIC, 0);// Cuando la carga del archivo con SoundPool se completa...sPool.setOnLoadCompleteListener(new OnLoadCompleteListener() {@Overridepublic void onLoadComplete(SoundPool soundPool, int sampleId,int status) {// Mostramos un loglog(Tono + sampleId + cargado con SoundPool);}});// Cargamos los archivos para SoundPool y guardamos su ID para// poder reproducirlosoundID1 = sPool.load(this, R.raw.bigben, 1);soundID2 = sPool.load(this, R.raw.alarma, 1);// Definimos el mismo evento onClick de los botones SoundPool y// los distinguimos por su propiedad TagView.OnClickListener click = new View.OnClickListener() {public void onClick(View v) {// Obtenemos acceso al gestor de Audio para obtener// informacinAudioManager audioManager =(AudioManager)getSystemService(AUDIO_SERVICE);// Buscamos el volumen establecido para el tipo// STREAM_MUSICfloat volumenMusica = (float) audioManager.getStreamVolume(AudioManager.STREAM_MUSIC);// Obtenemos el vlumen mx para el tipo STREAM_MUSICfloat volumeMusicaMax = (float) audioManager.getStreamMaxVolume(AudioManager.STREAM_MUSIC);// Vamos a reducir el volumen del sonidofloat volumen = volumenMusica / volumeMusicaMax;// Qu botn se ha pulsado? Se ha cargado el tono?if (v.getTag().toString().equals(1) && soundID1>-1)// Reproducimos el sonido 1sPool.play(soundID1, volumen, volumen, 1, 0, 1f);elseif (v.getTag().toString().equals(2) && soundID2>-1)// Reproducimos el sonido 2sPool.play(soundID2, volumen, volumen, 1, 0, 1f);}}; // end onClick botn// Buscamos los botones de SoundPool y asociamos su evento// onClickboton_spool1 = (Button) findViewById(R.id.soundpool1);boton_spool2 = (Button) findViewById(R.id.soundpool2);boton_spool1.setOnClickListener(click);U1 Multimedia y Grficos en Android 42. 44Aula Mentorboton_spool2.setOnClickListener(click);// Buscamos el botn que reproduce MediaPlayer y definimos su// evento onClickboton_mplayer = (Button) findViewById(R.id.mediaplayer);boton_mplayer.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {// Si ya estamos reproduciendo un sonido, lo paramosif (mPlayer!=null && mPlayer.isPlaying()) {mPlayer.stop();// Cambiamos los botones y mostramos logboton_mplayer.setText(Reproducir Audio con Mediaplayer);boton_spool.setEnabled(true);boton_mrecorder.setEnabled(true);log(Cancelada reproduccin MediaPlayer);} else // Si no, iniciamos la reproduccin{// Cambiamos los botones y hacemos logboton_mplayer.setText(Cancelar);boton_spool.setEnabled(false);boton_mrecorder.setEnabled(false);log(Reproduciendo Audio con MediaPlayer);// Creamos el objeto MediaPlayer asocindole la cancinmPlayer = MediaPlayer.create(MainActivity.this,R.raw.beethoven_para_elisa);// Iniciamos la reproduccinmPlayer.start();// Definimos el listener que se lanza cuando la cancin// acabamPlayer.setOnCompletionListener(newOnCompletionListener() {public void onCompletion(MediaPlayer arg0) {// Hacemos log y cambiamos botoneslog(Fin Reproduccin MediaPlayer);boton_spool.setEnabled(true);boton_mrecorder.setEnabled(true);}}); // end setOnCompletionListener}}}); // end onClick botn// Buscamos el botn que graba con MediaRecorder y definimos su// evento onClickboton_mrecorder = (Button) findViewById(R.id.mediarecorder);boton_mrecorder.setOnClickListener(new View.OnClickListener() {public void onClick(View v) {// Si estamos grabando sonidoif (boton_mrecorder.getText().equals(Parar grabacin)){// Paramos la grabacin, liberamos los recursos y la// aadimosrecorder.stop(); 43. 45recorder.release();addRecordingToMediaLibrary();// Refrescamos interfaz usuarioboton_mrecorder.setText(Grabar conversacin);boton_spool.setEnabled(true);boton_mplayer.setEnabled(true);// Log de la accinlog(Parada grabacin MediaRecorder);} else{// Cambiamos los botones y hacemos logboton_mrecorder.setText(Parar grabacin);boton_spool.setEnabled(false);boton_mplayer.setEnabled(false);log(Grabando conversacin);// Obtenemos el directorio de tarjeta SDFile directorio =Environment.getExternalStorageDirectory();try {// Definimos el archivo de salidaaudiofile = File.createTempFile(sonido, .3gp,directorio);} catch (IOException e) {Log.e(ERROR, No se puede acceder a la tarjetaSD);return;}// Creamos el objeto MediaRecorderrecorder = new MediaRecorder();// Establecemos el micrfonorecorder.setAudioSource(MediaRecorder.AudioSource.MIC);// Tipo de formato de salidarecorder.setOutputFormat(MediaRecorder.OutputFormat.THREE_GPP);// Codificacin de la salidarecorder.setAudioEncoder(MediaRecorder.AudioEncoder.AMR_NB);// Fichero de salidarecorder.setOutputFile(audiofile.getAbsolutePath());try {// Preparamos la grabacinrecorder.prepare();} catch (IllegalStateException e) {Log.e(ERROR, Estado incorrecto);return;} catch (IOException e) {Log.e(ERROR, No se puede acceder a la tarjetaSD);return;}// Iniciamos la grabacinrecorder.start();} // end else}}U1 Multimedia y Grficos en Android 44. 46Aula Mentor); // end onClick botnlog();}// Mtodo que aade la nueva grabacin a la librera// multimedia del dispositivo. Para ello, vamos a// utilizar un Intent del sistema operativoprotected void addRecordingToMediaLibrary() {// Valores que vamos a pasar al IntentContentValues values = new ContentValues(4);// Obtenemos tiempo actuallong tiempoActual = System.currentTimeMillis();// Indicamos que queremos buscar archivos de tipo audiovalues.put(MediaStore.Audio.Media.TITLE, audio +audiofile.getName());// Indicamos la fecha sobre la que deseamos buscarvalues.put(MediaStore.Audio.Media.DATE_ADDED, (int)(tiempoActual /1000));// Tipo de archivovalues.put(MediaStore.Audio.Media.MIME_TYPE, audio/3gpp);// Directorio destinovalues.put(MediaStore.Audio.Media.DATA,audiofile.getAbsolutePath());// Utilizamos un ContentResolverContentResolver contentResolver = getContentResolver();// URI para buscar en la tarjeta SDUri base = MediaStore.Audio.Media.EXTERNAL_CONTENT_URI;Uri newUri = contentResolver.insert(base, values);// Enviamos un mensaje Broadcast para buscar el nuevo contenido de// tipo audiosendBroadcast(new Intent(Intent.ACTION_MEDIA_SCANNER_SCAN_FILE,newUri));Toast.makeText(this, Se ha aadido archivo + newUri + a la librera multimedia., Toast.LENGTH_LONG).show();} // end addRecordingToMediaLibrary// Mtodo que aade a la etiqueta Log un nuevo eventoprivate void log(String s) {logTextView.append(s + n);// Movemos el Scroll abajo del todoscrollview.post(new Runnable() {@Overridepublic void run() {scrollview.fullScroll(ScrollView.FOCUS_DOWN);}});} // end log} // end claseRepasemos ahora con cuidado el cdigo Java anterior.Puedes ver que el constructor de la clase SoundPool es el siguiente:SoundPool(int maxStreams , int streamType , int srcQuality) 45. 47Donde sus parmetros son:- maxStreams: indica el nmero 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 msica, 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 mtodo siguiente: SoundPool.load(Context context, int resId, int priority). Donde resId es la Id de nuestro archivo de msica. El parmetro priority permite seleccionar la prioridad de este sonido frente a otro en caso de que se llegue al mximo nmero de sonidos simultneos 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 mtodo play (int soundID, float leftVolume, float rightVolume, int priority, int loop, float rate) cuyos parmetros indican:- soundID: ID del sonido que ha indicado el mtodo 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 ms baja)- loop: modo en bucle si establecemos el valor -1.- rate: velocidad de reproduccin (1.0 = normal, rango de 0.5 a 2.0)En el siguiente bloque de cdigo hemos utilizado la clase Mediaplayer para reproducir una pista de audio mediante su mtodo start() y pararla con el mtodo stop().Por simplificacin, en este ejemplo hemos utilizado un recurso que se incluye en la carpeta /res/raw/. En una aplicacin real no haramos esto ya que el fichero mp3 se empaqueta con la aplicacin y hace que sta ocupe mucho espacio. Si queremos reproducir una cancin 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 mtodo 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 cdigo realiza una grabacin empleando la clase MediaRecorder. Hemos definido la variable audiofile para guardar la grabacin. Para iniciar la grabacin utilizamos los mtodos setAudioSource() que establece el micrfono de entrada; setOutputFormat() selecciona el formato de salida; setAudioEncoder() indica la codificacin del audio; setOutputFile() establece el fichero de salida y start() inicia la grabacin.A la hora de parar la grabacin, simplemente debemos invocar los mtodos stop() y release() que libera los recursos del sistema.Para finalizar con el cdigo Java, hemos desarrollado el mtodo local addRecordingToMediaLibrary() que aade la nueva grabacin a la librera 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 tipoU1 Multimedia y Grficos en Android 46. 48Aula Mentoraudio con la orden sendBroadcast().Por ltimo, para poder ejecutar esta aplicacin 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 cdigo fuente y ejectalo en el AVD para ver el resultado del programa anterior, en el que hemos utilizado la API de Audio de Android.Si ejecutas en Eclipse ADT este Ejemplo 1 en el AVD, vers que se muestra la siguiente aplicacin:Para poder or en tu AVD los sonidos, debes encender los altavoces de tu ordena- dor. Prueba a ejecutar sonidos mediante SoundPool simultneamente, incluso si se est reproduciendo msica con el MediaPlayer.Sin embargo, la funcionalidad de grabacin de audio no est integrada en el AVD y, para poder 47. 49probar esta funcionalidad del Ejemplo debes instalarlo en un dispositivo real.Para poder usar un dispositivo real desde Eclipse ADT es necesario conectar este dispositivo mediante un cable al ordenador y modificar Ajustes del dispositivo en las opciones siguientes: En Opciones del desarrollador, marcar Depuracin de USB. En Seguridad, sealar Fuentes desconocidas.3.4 Cmo habilitar USB Debugging en Android 4.2 y superior Jelly BeanA partir de la versin de Android Jelly Bean 4.2, Google esconde la opcin de Desarrollo (Developer) en los Ajustes (Settings) del dispositivo. Para que aparezca esta opcin debes dar los pasos siguientes:- Abre Opciones->Informacin del telfono/Tablet.- Haz clic repetidamente en la opcin Nmero de compilacin (Build Number) hasta 7 veces seguidas.Eso es todo, aparecer un mensaje de que Ya eres un developer y vers que aparece la nueva opcin Opciones de desarrollo (Developer) y dentro encontrars USB Debugging.Fjate en las siguientes capturas de pantalla:U1 Multimedia y Grficos en Android 48. 50Aula Mentor3.5 Librera de reproduccin de vdeoLa clase VideoView permite al programador incluir vdeos en las aplicaciones y abarca una gran cantidad de mtodos para hacerlo. Los mtodos ms utilizados son los siguientes:- setVideoPath(String path): especifica el directorio y archivo de vdeo que se reproduce. Podemos indicar tanto una URL para vdeos en Internet como un archive local en el dispositivo.- setVideoUri(Uri uri): de igual forma que el mtodo anterior, establece la fuente del vdeo en formato URI.- start(): inicia la reproduccin del vdeo.- stopPlayback(): para la reproduccin del vdeo.- pause(): pausa la reproduccin del vdeo.- isPlaying(): devuelve true o false indicando as si se est reproduciendo un vdeo o no.- setOnPreparedListener(MediaPlayer.OnPreparedListener): define un mtodo callback que se invoca cuando el vdeo est preparado para reproducirse.- setOnErrorListener(MediaPlayer.OnErrorListener): establece el mtodo callback que el sistema invocar en caso de un error en reproduccin del vdeo. Este mtodo es muy til cuando el vdeo est mal codificado u ocurre un error de conexin a Internet al reproducir un vdeo remoto.- setOnCompletionListener(MediaPlayer.OnCompletionListener): permite definir un mtodo callback para detectar que la reproduccin del vdeo ha terminado.- getDuration(): indica la duracin del vdeo. Devuelve siempre -1 salvo que lo ejecutemos dentro del evento OnPreparedListener().- getCurrentPosition(): devuelve la posicin actual de reproduccin del vdeo.- setMediaController(MediaController): establece el objeto MediaController que veremos a continuacin.Si reproducimos un vdeo utilizando directamente la clase VideoView, el usuario no podr controlar la reproduccin, que continuar hasta que finalice el vdeo. Para permitir que el usuario gestione la visualizacin del vdeo podemos definir una interfaz ad hoc para la aplicacin o emplear una instancia de la clase MediaController que asignaremos al VideoView.La clase MediaController muestra un conjunto de controles que permiten al usuario gestionar la reproduccin del vdeo, por ejemplo, hacer una pausa, buscar hacia atrs y hacia adelante, etctera.Estos controles aparecern brevemente cuando el usuario toca en la vista VideoView a la que estn asignados.Entre sus mtodos ms importantes podemos destacar:- setAnchorView(View view): indica la Vista de la Actividad donde aparecern estos controles.- show() : muestra los controles.- show(int timeout): muestra los controles durante el tiempo indicado como parmetro en milisegundos.- hide(): oculta los controles.- isShowing():devuelve true o false indicando as si se estn mostrando los controles o no.3.5.1 Ejemplo de reproduccin de vdeoEn el Ejemplo 2 de esta Unidad hemos desarrollado un reproductor sencillo de vdeo. Es recomendable abrirlo en Eclipse ADT para seguir la explicacin siguiente. 49. 51La interfaz de la aplicacin muestra una barra de herramientas en la parte superior con botones que permiten al usuario controlar la reproduccin del vdeo. En la parte central hemos incluido un objeto heredado de la clase VideoView. En la parte de abajo de la Actividad hemos incluido una vista de tipo TextView desplazable que muestra las acciones del usuario.En cdigo del Layout activity_main.xml se incluye el diseo de la Actividad principal:Puedes observar que en lugar de utilizar directamente la clase VideoView hemos indicado la clase heredada de sta es.mentor.unidad3.eje2.video.CustomVideoView. Esto se hace as porque hemos redefinido los eventos onPlay(), onPause() y onTimeBarSeekChanged() y, para hacerlo, es necesario extender la clase VideoView.Una vez expuesto el sencillo diseo de la Actividad, veamos la lgica de sta en el fichero MainActivity.java:public class MainActivity extends Activity {// Vistas de la interfaz de usuario de la Actividadprivate ImageButton bPlay, bPause, bStop, bLog, bControls;private TextView logTextView;ScrollView scrollview;// VideoView extendido y mejorado con nuevos eventos (listeners)private CustomVideoView visorVideo;// Control del vdeo por parte del usuarioprivate MediaController mediaC;// Posicin actual de reproduccin del vdeo que usaremos// cada vez que el usuario vuelva a la aplicacinprivate int posActual=0;@Overrideprotected void onCreate(Bundle estado) {super.onCreate(estado);setContentView(R.layout.main_layout);// Buscamos las Vistasscrollview = ((ScrollView)findViewById(R.id.ScrollView));visorVideo = (CustomVideoView) findViewById(R.id.videoView);// Definimos la URI del vdeoUri uri = Uri.parse(android.resource:// + getPackageName()+ /+R.raw.video);visorVideo.setVideoURI(uri);// Si se encuentra en el sistema de ficheros deberamos// haber escrito//visorVideo.setVideoPath(sdcard/video.mp4);// Creamos el controlador del vdeo y lo asignamos al visor// de vdeo y viceversamediaC = new MediaController(this); 51. 53mediaC.setMediaPlayer(visorVideo);visorVideo.setMediaController(mediaC);// Definimos el listener cuando el usuario reproduce, para o// cambia la posicin del vdeovisorVideo.setPlayPauseListener(newCustomVideoView.PlayPauseListener() {// Reproduce vdeo@Overridepublic void onPlay() {// Hacemos log y deshabilitamos botoneslog(REPRODUCIENDO VIDEO);bPause.setEnabled(true);bStop.setEnabled(true);bPlay.setEnabled(false);}@Overridepublic void onPause() {// Hacemos log y deshabilitamos botoneslog(VIDEO EN PAUSA);bPause.setEnabled(false);bPlay.setEnabled(true);}@Overridepublic void onTimeBarSeekChanged(int currentTime) {// Hacemos loglog(CAMBIO POSICION VIDEO: +currentTime);// Si se ha parado el vdeo lo indicamosif (currentTime==0 && !visorVideo.isPlaying()) {bStop.setEnabled(false);log(PARADA VIDEO);}}}); // end setPlayPauseListener// Definimos el listener cuando finaliza la reproduccin del// vdeovisorVideo.setOnCompletionListener(newMediaPlayer.OnCompletionListener() {@Overridepublic void onCompletion(MediaPlayer mp) {// Hacemos log y deshabilitamos botoneslog(FIN DE VIDEO);bPause.setEnabled(false);bStop.setEnabled(false);bPlay.setEnabled(true);}});// Definimos el listener cuando el visor ha preparado// la reproduccin del vdeovisorVideo.setOnPreparedListener(new OnPreparedListener() {@Overridepublic void onPrepared(MediaPlayer mp) {// Hacemos log. Slo se puede llamar a// getDuration() desde este eventoU1 Multimedia y Grficos en Android 52. 54Aula Mentorlog(VIDEO PREPARADO. Duracin: +visorVideo.getDuration()+ msegundos);}});// Definimos el listener cuando el usuario toca la pantalla del// vdeovisorVideo.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {log(CLIC VIDEOVIEW: MUESTRA CONTROLADOR);return false;}});// Definimos el listener cuando ocurre un error en la reproduccinvisorVideo.setOnErrorListener(new MediaPlayer.OnErrorListener() {@Overridepublic boolean onError(MediaPlayer mp, int what, int extra){log(ERROR AL REPRODUCIR VIDEO);return false;}});logTextView = (TextView)findViewById(R.id.Log);// Buscamos el botn Reproducir y definimos su evento onClickbPlay = (ImageButton)findViewById(R.id.play);bPlay.setOnClickListener(new OnClickListener() {public void onClick(View view) {// Pedimos el foco del vdeo y lo reproducimosvisorVideo.requestFocus();visorVideo.start();}});// Buscamos el botn Pausa y definimos su evento onClickbPause = (ImageButton)findViewById(R.id.pause);bPause.setOnClickListener(new OnClickListener() {public void onClick(View view) {// Pausamos la reproduccinvisorVideo.pause();}});// Buscamos el botn Parada y definimos su evento onClickbStop = (ImageButton)findViewById(R.id.stop);bStop.setOnClickListener(new OnClickListener() {public void onClick(View view) {// Pausamos la reproduccin y vamos al principio del// vdeovisorVideo.pause();visorVideo.seekTo(0);}});// Buscamos el botn Controles y definimos su evento onClickbControls = (ImageButton)findViewById(R.id.controls); 53. 55bControls.setOnClickListener(new View.OnClickListener() {public void onClick(View arg0) {// Mostramos los controles de usuario del vdeomediaC.show();}});// Buscamos el botn Log y definimos su evento onClickbLog = (ImageButton)findViewById(R.id.logButton);bLog.setOnClickListener(new OnClickListener() {public void onClick(View view) {if (scrollview.getVisibility()==TextView.VISIBLE) {scrollview.setVisibility(TextView.INVISIBLE);} else {scrollview.setVisibility(TextView.VISIBLE);}}});// Inicializamos Vistaslog();bPause.setEnabled(true);bStop.setEnabled(true);} // end onCreate// Debemos guardar la posicin de reproduccin en el evento onPause()// porque en el evento onSaveInstanceState ya est parado el vdeo y// es tarde.@Overrideprotected void onPause() {super.onPause();posActual = visorVideo.getCurrentPosition();}// Cuando vuelve a estar activa la ACtividad volvemos a reproducir// donde lo dejamos@Overridepublic void onResume() {super.onResume();Log.d(POS , onResume called);// Volvemos a la posicin guardadavisorVideo.seekTo(posActual);// Continuamos la reproduccin del vdeovisorVideo.resume();}// Mtodo que aade a la etiqueta Log un nuevo eventoprivate void log(String s) {logTextView.append(s + n);// Movemos el Scroll abajo del todoscrollview.post(new Runnable() {@Overridepublic void run() {scrollview.fullScroll(ScrollView.FOCUS_DOWN);}});} // end log} // end claseU1 Multimedia y Grficos en Android 54. 56Aula MentorEn el cdigo fuente anterior puedes ver que la aplicacin extiende la clase Activity. Adems, implementa varias interfaces que corresponden a varios eventos. Despus, se sigue con la declaracin de los diferentes elementos de la aplicacin. La variable posActual almacena la posicin de reproduccin.En lugar de utilizar directamente la clase VideoView, la hemos extendido en la nueva clase CustomVideoView para poder definir los eventos onPlay(), onPause() y onTimeBarSeekChanged() ya que la clase base no los incluye y es necesario redefinir sus mtodos start(), pause() y seekTo() respectivamente para poder detectar cundo el usuario realiza una de estas acciones.Con el mtodo setVideoURI() hemos indicando el fichero local del paquete de la aplicacin. Por simplificacin, en este ejemplo hemos utilizado un recurso que se incluye en la carpeta /res/raw/. En una aplicacin real no haramos esto ya que el fichero mp4 se empaqueta con la aplicacin y hace que sta ocupe muchsimo espacio. Si queremos reproducir vdeo desde el sistema de ficheros externo debemos escribir las siguientes sentencias:videoView.setVideoURI(Uri.parse(file:// +Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_MOVIES) + /video.mp4));A continuacin, invocamos el mtodo setMediaController() para que el usuario pueda dirigir la reproduccin del vdeo mediante el objeto MediaController.El cdigo contina asignando al objeto CustomVideoView varios escuchadores (listeners) de eventos. Veamos su funcionalidad:- setPlayPauseListener(): mtodo de la clase extendida definido para controlar la reproduccin, parada y movimiento del vdeo. En estos casos, se realiza un log y se habilitan o deshabilitan los botones correspondientes en la interfaz de usuario.- OnCompletionListener(): implementa la interfaz onCompletion() que ser invocada cuando el vdeo llegue al final. Igualmente, hacemos un log y gestionamos los botones.- setOnPreparedListener(): implementa la interfaz onPrepared() que ser invocada cuando el vdeo est preparado para su reproduccin. Igualmente, hacemos un log indicando la duracin del vdeo con el mtodo getDuration().- setOnTouchListener(): implementa la interfaz onTouch() que ser invocada cuando el usuario toca la pantalla del vdeo. Hacemos tambin un log de la accin.- setOnErrorListener(): implementa la interfaz onError() que ser invocada cuando se produce un error en la reproduccin del vdeo. Hacemos tambin un log de la accin.Posteriormente, definimos los eventos onClick() de los botones de la interfaz de usuario. Es sencillo y auto explicativo ver en el cdigo de arriba cmo hemos usado los distintos mtodos de la clase VideoView para reproducir, parar y pausar el vdeo.Hemos definido tambin los mtodos onPause() y onResume() de la Actividad que se invocan cuando sta pasa a un segundo plano y cuando vuelve de nuevo a primer plano. El vdeo debe parar la reproduccin y continuar en la posicin anterior en cada uno de estos casos, por lo que se invocan a sus mtodos pause() y start() respectivamente.El ltimo mtodo log() es utilizado por varios escuchadores de eventos para mostrar informacin sobre lo que est pasando. Esta informacin puede visualizarse o no, utilizando el botn correspondiente.Una vez expuesto la lgica de la Actividad principal, veamos la implementacin de la clase extendida de VideoView en el fichero CustomVideoView.java:// Para poder definir los eventos onPlay, onPause y// onTimeBarSeekChanged es necesario redefinir la clase// VideoView extendiendo sus mtodos 55. 57public class CustomVideoView extends VideoView {private PlayPauseListener mListener;// Definimos los constructores de la clasepublic CustomVideoView(Context context) {super(context);}public CustomVideoView(Context context, AttributeSet attrs) {super(context, attrs);}public CustomVideoView(Context context, AttributeSet attrs, intdefStyle) {super(context, attrs, defStyle);}// Mtodo que establece el listenerpublic void setPlayPauseListener(PlayPauseListener listener) {mListener = listener;}// Redefinimos los mtodo internos de la clase VideoView@Overridepublic void pause() {// Primero llamamos al mtodo de la clase originalsuper.pause();if (mListener != null) {// Si el listener est asignado, ejecutamos el mtodomListener.onPause();}}@Overridepublic void start() {// Primero llamamos al mtodo de la clase originalsuper.start();if (mListener != null) {// Si el listener est asignado, ejecutamos el mtodomListener.onPlay();}}@Overridepublic void seekTo(int msec){// Primero llamamos al mtodo de la clase originalsuper.seekTo(msec);if (mListener != null) {// Si el listener est asignado, ejecutamos el mtodomListener.onTimeBarSeekChanged(msec);}}// Definimos las interfaces de la nueva clase que debenU1 Multimedia y Grficos en Android 56. 58Aula Mentor// implementarseinterface PlayPauseListener {void onPlay();void onPause();void onTimeBarSeekChanged(int currentTime);}} // end claseComo puedes ver, la clase anterior es muy sencilla: hemos redefinimos los mtodo internos start(), pause() y seekTo() de la clase VideoView para poder invocar dentro de sta los mtodos que se definen en la interfaz PlayPauseListener: onPlay(), onPause() y onTimeBarSeekChanged() respectivamente. Mediante su mtodo setPlayPauseListener() podemos establecer el listener correspondiente.Desde Eclipse ADT puedes abrir el proyecto Ejemplo 2 (Vdeo) de la Unidad 1. Estudia el cdigo fuente y ejectalo en el AVD para ver el resultado del programa anterior, en el que hemos utilizado la API de Vdeo de Android.Si ejecutas en Eclipse ADT este Ejemplo 2 en el AVD, vers que se muestra la siguiente aplicacin: 57. 59La reproduccin de un vdeo en el AVD se realiza mediante software, por lo que puedes observar saltos o paradas al visualizarlo. Es recomendable utilizar un dis- positivo real Android que reproduzca el vdeo mediante el hardware.4. Conceptos bsicos de grficos en AndroidAntes de comenzar a trabajar con grficos conviene que el alumno o alumna se familiarice con las clases bsica de Android que permiten crear y manipular grficos en Android.4.1 Definicin de colores en AndroidAndroid representa un color utilizando un nmero entero de 32 bits. Estos bits se dividen en 4 campos de 8 bits: alfa, rojo, verde y azul (ARGB, si usamos las iniciales en ingls). Dado que cada componente de color consta de 8 bits, podr tomar 256 valores diferentes.Las componentes rojo, verde y azul son utilizadas para definir un color y la componente alfa define su grado de transparencia con respecto al fondo (capa inferior). Un valor de 255 significa un color opaco y, a medida que reduzcamos este valor, el color se ir haciendo ms transparente.Podemos definir un color de diferentes maneras.- Definiendo un color estndar de Android:int color = Color.RED; // Rojo opaco- Indicando sus valores en el modo ARGB:color = Color.argb(127, 255, 0, 0); // Rojo transparente- Especificando sus valores en hexadecimal:color = 0xFFFF0000; // Rojo- Utilizando un recurso de la aplicacin:color = getResources().getColor(R.color.color_rojo);Para conseguir una ptima separacin entre la programacin Java y el diseo de la interfaz de usuario, se recomienda utilizar la ltima opcin, es decir, no definir directamente los colores en el cdigo fuente, sino utilizar el fichero de recursos res/values/colors.xml del proyecto:#ffff0000As, si deseamos cambiar los colores de la aplicacin, nicamente debemos modificar este archivo de recursos.U1 Multimedia y Grficos en Android 58. 60Aula Mentor4.2 Clases de dibujo en AndroidA continuacin, expondremos las clases ms importantes que se utilizan para dibujar en Android:4.2.1 Clase PaintLa clase Paint se emplea para definir el pincel que utilizaremos para pintar. Podemos definir su color, su tipo de trazo, transparencia, etctera. Veamos los mtodos de esta clase ms utilizados por el programador:- setColor(int color): indica el color del pincel utilizando una de las definiciones anteriores de colores.- setAlpha(int alfa): modifica el grado de transparencia del pincel.- setStrokeWidth(float grosor): define el grosor del trazado.- setStyle(Paint.Style estilo): marca el estilo de relleno con las constante FILL (relleno), FILL_AND_STROKE (relleno y borde), STROKE (slo dibuja borde).- setShadowLayer(float radio, float x, float y, int color): realiza un segundo trazado a modo de sombra.- setTextAlign(Paint.Align justif): justifica el texto segn las constantes CENTER, LEFT y RIGHT.- setTextSize(float size): establece el tamao de la fuente del texto.- setTypeface (Typeface typeface): indica el tipo de fuente MONOSPACE, SERIF y SANS_ SERIF. Adems, podemos definir negrita e itlica.- setTextScaleX(float escala): seala el factor de escalado horizontal. Un valor de 1.0 indica sin escalado.- setTextSkewX(float inclinacion): indica el factor de inclinacin del texto. 0 denota sin inclinacin.- setUnderlineText(boolean subrayado): determina si un texto aparece subrayado o no.4.2.2 Clase RectnguloLa clase Rect permite dibujar un rectngulo que se representa mediante sus cuatro lados: izquierdo, derecho, alto y bajo. Su constructor tiene este aspecto:Rect(int left, int top, int right, int bottom)Podemos obtener su ancho y largo mediante los mtodos height() y width() respectivamente.4.2.3 Clase PathLa clase Path (del ingls, camino) permite definir un trazado mediante segmentos de lnea y curvas. Un Path tambin se puede utilizar para dibujar un texto sobre el trazado marcado y para ocultar (tramas) o difuminar.Entre sus mtodos ms importante podemos encontrar:- moveTo(float x, float y): mueve el pincel de dibujo a la posicin x, y.- lineTo(float x, float y): pinta un lnea desde la posicin actual hasta la posicin x, y. 59. 61- addRect(float left, float top, float right, float bottom, Path.Direction dir): aade un rectngulo del tamao indicado siguiendo el sentido dir que puede tomar los valores CW (giro de la agujas del reloj) y CCW (sentido contrario a las agujas del reloj).- addCircle(float x, float y, float radio, Path.Direction dir): aade un crculo de radio siguiendo el sentido dir que puede tomar los valores CW (giro de la agujas del reloj) y CCW (sentido contrario a las agujas del reloj).- offset (float dx, float dy): desplaza el trazado en dx y dy.- reset(): limpia el trazado actual.- close(): cierra el trazado actual, es decir, ya no se pueden aadir nuevos elementos al mismo.Fjate en el siguiente ejemplo que dibuja una lnea y un crculo:Path trazado = new Path();trazado.moveTo(10, 10);trazado.lineTo(10, 50);trazado.addCircle(50, 50, 60, Direction.CCW);4.2.4 Clase CanvasLa clase Canvas (del ingls, lienzo) representa la superficie bsica donde podemos dibujar grficos. Dispone de varios mtodos que permiten representar lneas, crculos, texto, etctera.Para dibujar en un lienzo debemos utiliza un pincel (clase Paint que hemos visto) donde indicamos el color, grosor de trazo, transparencia, etctera.Tambin es posible definir una matriz de 3x3 (Matrix) que permite transformar coordenadas aplicando una translacin, escala o rotacin del lienzo.Adems, podemos seleccionar un rea conocida como Clip para que los mtodos de dibujo afecten solo a esta rea.A continuacin, veamos los mtodos ms importantes de esta clase Canvas segn su funcin. Como vers, no hemos incluido todos sus mtodos, por lo que recomendamos consultar la documentacin oficial para obtener informacin ms detallada.4.2.4.1 Obtener tamao del Canvas:- int getHeight(): devuelve el ancho del lienzo.- int getWidth(): devuelve el largo del lienzo.Puedes notar que el tamao del lienzo es un nmero entero aunque, para dibujar en l, debes indicar posiciones con nmeros decimales (float) contenidos en ste.4.2.4.2 Dibujar figuras geomtricas:- drawCircle(float x, float y, float r, Paint paint): dibuja un crculo en la posicin (x, y), de radio r y utilizando el pincel paint.- drawOval(RectF rect, Paint paint): dibuja una eclipse contenida en el rectngulo rect y utilizando el pincel paint.- drawRect(RectF rect, Paint paint): dibuja un rectngulo utilizando el pincel paint.- drawPoint(float x, float y, Paint paint): pinta un punto en la posicin (x, y) empleando el pincel paint.U1 Multimedia y Grficos en Android 60. 62Aula Mentor- drawPoints(float[] puntos, Paint paint): pinta los puntos de la matriz bidimensional puntos empleando el pincel paint.4.2.4.3 Dibujar lneas y arcos:- drawLine(float iniX, float iniY, float finX, float finY, Paint paint): pinta un lnea empezando en la posicin (iniX, iniY) y finalizando en (finX, finY) empleando el pincel paint.- drawLines(float[] puntos, Paint paint): pinta una lnea continua siguiendo los puntos de la matriz bidimensional puntos empleando el pincel paint.- drawArc(RectF rect, float iniAngulo, float finAngulo, boolean usarCentro, Paint paint): dibuja un arco en el rectngulo rect, de ngulo inicial iniAngulo y final finAngulo, muestra el centro del valo si lo indicamos en el parmetro usarCentro y emplea el pincel paint.- drawPath(Path trazo, Paint paint): dibuja un camino utilizando el pincel paint.4.2.4.4 Dibujar texto:- drawText(String texto, float x, float y, Paint paint): aade un texto en la posicin (x, y) utilizando el pincel paint.- drawTextOnPath(String texto, Path trazo, float desplazamHor, float desplazamVert, Paint paint): aade un texto a lo largo del trazo con un desplazamiento horizontal o vertical y utilizando el pincel paint.- drawPosText(String texto, float[] posicion, Paint paint): aade un texto en la posicin utilizando el pincel paint.4.2.4.5 Colorear todo el lienzo Canvas:- drawColor(int color): rellena el lienzo completo con el color.- drawARGB(int alfa, int rojo, int verde, int azul): rellena el lienzo completo utilizando la terminologa ARGB.- drawPaint(Paint paint): rellena el lienzo completo con el pincel paint.4.2.4.6 Dibujar imgenes:- drawBitmap (Bitmap bitmap, Rect src, RectF dst, Paint paint): dibuja la imagen bitmap en el rectngulo dst del lienzo recortando la imagen original con el rectngulo src y utilizando el pincel paint.- drawBitmap(Bitmap bitmap, Matrix matriz, Paint pincel): dibuja la imagen bitmap recortando la imagen original utilizando la matriz y el pincel paint.4.2.4.7 Definir un Clip (rea de seleccin):- boolean clipRect(RectF rect): selecciona el rea mediante un rectngulo rect sobre el que se aplicarn los dibujos. 61. 63- boolean clipRegion(Region region): selecciona el rea mediante la region (superficie que se define con la clase Path) sobre la que se aplicarn los dibujos.- boolean clipPath(Path trazo): selecciona el rea mediante el path sobre el que se aplicarn los dibujos.4.2.4.8 Definir matriz de transformacin (Matrix):Una matriz de transformacin Matrix permite transformar las coordenadas de referencia aplicando una translacin, escala o rotacin mediante una matriz 3x3. Veamos sus mtodos bsicos:- setMatrix(Matrix matriz): establece la matriz en el lienzo.- Matrix getMatrix(): obtiene la matriz en el lienzo.- concat(Matrix matriz): aade una nueva matriz a la transformacin ya existente.- translate(float despazX, float despazY): mueve el eje de coordenadas.- scale(float escalaX, float escalaY): escala la matriz activa.- rotate(float grados, float centroX, float centroY): rota la matriz activa.- skew(float despazX, float despazY): inclina la matriz activa.A continuacin, se muestra el Ejemplo 3 donde se crea una Vista que se dibuja mediante cdigo Java empleando la clase Canvas, es decir, no se define un fichero layout xml en el proyecto. Si abres el archivo MainActivity.java vers que contiene:public class MainActivity extends Activity {@Overridepublic void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// No definimos Layout, el layout ser definido por CanvasViewsetContentView(new CanvasView(this));}} // end claseEl cdigo anterior comienza con la creacin de una Activity en la que asociamos un objeto CanvasView extendido de tipo View mediante el mtodo setContentView() que no est definido mediante un layout XML.Sin embargo, si accedes al fichero CanvasView.java vers que define:zpublic class CanvasView extends View {// Trazo del dibujoPath trazo = new Path();// Pincel del dibujoPaint pincel = new Paint();// Bitmap con el icono MentorBitmap miBitmap = BitmapFactory.decodeResource(getResources(),R.drawable.mentor);// Variables para almacenar largo, ancho, centro_x y centro_yfloat l, a, cx, cy;// Constructor de la clasepublic CanvasView(Context context) {super(context);}@OverrideU1 Multimedia y Grficos en Android 62. 64Aula Mentorprotected void onDraw(Canvas canvas) {// Buscamos el largo, ancho y centro del canvasl = getWidth();a = getHeight();cx = l/2;cy = a/2;// Dibujamos un trazo de tipo rectngulotrazo.addRect(l/5, a/4, l-l/5, a-a/4, Direction.CW);// Rellenamos de color blanco todo el fondo del canvascanvas.drawColor(Color.WHITE);// Definimos pincel de color azul de ancho 8 y con bordepincel.setColor(Color.BLUE);pincel.setStrokeWidth(8);pincel.setStyle(Style.STROKE);// Dibujamos el rectngulocanvas.drawPath(trazo, pincel);// Limpiamos el trazotrazo.reset();// Movemos puntero a posicintrazo.moveTo(0, a/7);// Trazamos una lneatrazo.lineTo(l, a/7);// Indicamos estilo de rellenopincel.setStyle(Style.FILL);// Tamao del texto, tipo de fuente y alineamientopincel.setTextSize(25);pincel.setTypeface(Typeface.SANS_SERIF);pincel.setTextAlign(Paint.Align.CENTER);// Imprimimos el textocanvas.drawTextOnPath(Curso avanzado de Android deMentor., trazo, 0, 0, pincel);// Imprimimos la imagen de Mentorcanvas.drawBitmap(miBitmap, cx-miBitmap.getWidth() / 2, cy -miBitmap.getHeight() / 2, null);} // end onDraw// Evento que se lanza cada vez que cambia el tamao de la Vista@Overrideprotected void onSizeChanged(int ancho, int alto,int ancho_anterior, int alto_anterior){// Mostramos un mensaje indicndoloToast.makeText(getContext(), Cambio de tamao de pantalla. Altonuevo: + alto + - Ancho nuevo: + ancho,Toast.LENGTH_LONG).show();}} // end clase CanvasViewLa clase CanvasView se extiende de View cambiando su mtodo onDraw() que es el responsable de dibujar la vista. Puedes ver que hemos utilizado los mtodos que hemos utilizado anteriormente y vemos su funcin en los comentarios del cdigo fuente. Adems, hemos implementado el mtodo onSizeChanged() que Android invoca cada vez que cambia el tamao de la Vista. 63. 65Desde Eclipse ADT puedes abrir el proyecto Ejemplo 3 (Canvas) de la Unidad 1. Estudia el cdigo fuente y ejectalo para mostrar en el AVD el resultado del pro- grama anterior, en el que hemos utilizado la clase Canvas.Si ejecutas en Eclipse ADT este Ejemplo 3, vers que se muestra la siguiente aplicacin en el Emulador:Si cambias la orientacin del AVD con el atajo de teclado [CTRL+F12] vers que la imagen se amolda al nuevo tamao de pantalla y muestra un mensaje indicndolo.U1 Multimedia y Grficos en Android 64. 66Aula Mentor4.2.5 Definicin de dibujables (Drawable)Un Dibujable (del ingls, Drawable) es un mecanismo para dibujar la interfaz de una aplicacin Android. Existen muchos tipos de recursos dibujables, tales como, archivos de imgenes, colores, gradientes, formas geomtricas, etctera. A continuacin, vamos a estudiar los ms importantes.Podemos entender la clase Drawable como una abstraccin que representa algo que se puede dibujar. Muchos de estos dibujables pueden ser definidos como recursos mediante ficheros XML.Aquellos Drawables que se pueden especificar mediante ficheros XML debemos crearlos en la carpeta res/drawable del proyecto.Entre ellos, podemos encontrar los siguientes:- BitmapDrawable: imagen basada en un fichero de imagen PNG o JPG. En un recurso XML se define con la etiqueta .- ShapeDrawable: permite dibujar un grfico mediante primitivas vectoriales bsicas como crculos, cuadrados, etctera, y trazados (Path). No puede ser definido mediante un fichero XML.- LayerDrawable: contiene una matriz de elementos de tipo Drawable que podemos utilizar despus en la aplicacin. En un recurso XML se define con la etiqueta .- StateLis