Anda di halaman 1dari 64

DESARROLLO DE APLICACIONES EN DISPOSITIVOS MVILES

Por Juan Antonio lvarez Garca, Luis Miguel Soria Morillo e Ivn Reina Conde

Desarrollo en Android

Por Luis Miguel Soria

Desarrollo en Android por Luis Miguel Soria

ndice de contenido
DESARROLLO DE APLICACIONES EN DISPOSITIVOS MVILES...........................................1 Por Juan Antonio lvarez Garca, Luis Miguel Soria Morillo e Ivn Reina Conde............................1 Desarrollo en Android..........................................................................................................................1 - El sistema operativo de Google: Android..........................................................................................4 - Qu es Android?..........................................................................................................................4 - Estructura de Android....................................................................................................................4 - Programacin en Android..................................................................................................................6 - Caractersticas de Android.............................................................................................................6 - Herramientas de desarrollo............................................................................................................7 - Componentes de una aplicacin Android......................................................................................7 - Programacin en Eclipse...............................................................................................................8 - Instalacin de los programas necesarios...................................................................................8 - Creacin de un proyecto...........................................................................................................9 - Creacin de un emulador. ...................................................................................................................................................10 - Instalacin de un dispositivo mvil para usarlo en el desarrollo. (Probado con HTC Magic). ...................................................................................................................................................11 - Hola Android..........................................................................................................................12 - Descripcin de la aplicacin del curso.............................................................................................20 - Interfaces grficas en Android................................................................................................21 - Estructura de una interfaz en Android.........................................................................................21 - Views de nuestra aplicacin........................................................................................................22 - Ejercicios. Interfaces de la aplicacin.........................................................................................23 - Ejercicio 1:..............................................................................................................................23 - Ejercicio 2:..............................................................................................................................25 - Ejercicio 3:..............................................................................................................................25 - Actividades en Android....................................................................................................................28 - Creacin de una actividad en Eclipse..........................................................................................28 - Uso de actividades.......................................................................................................................28 - Actividades especiales.................................................................................................................30 - Comunicacin entre actividades..................................................................................................31 - Ejercicio. Actividades de la aplicacin del curso........................................................................32 - Ejercicio 4:..............................................................................................................................33 -Mens y dilogos en Android...........................................................................................................34 - Creacin y uso de mens.............................................................................................................34 - Creacin y uso de dilogos..........................................................................................................35 - Secuencia para crear un AlertDialog......................................................................................36 - Secuencia para crear un Dialog..............................................................................................36 - Ejercicio. Creacin de dilogos y mens en la actividad. Comunicacin entre actividades.......37 - Ejercicio 5:..............................................................................................................................37 - Ejercicio 6:..............................................................................................................................39 - Ejercicio 7:..............................................................................................................................39 - Ejercicio 8:..............................................................................................................................40 - Ejercicio 9:..............................................................................................................................40 - Mapas en Android............................................................................................................................42 - La clase MapView.......................................................................................................................42

Desarrollo en Android por Luis Miguel Soria

- Elementos de un MapView..........................................................................................................42 - Overlay....................................................................................................................................42 - ItemizedOverlay......................................................................................................................43 - MyLocationOverlay................................................................................................................44 - Ejercicio. Mapa de la aplicacin del curso..................................................................................44 - Ejercicio 10:............................................................................................................................44 - Ejercicio 11:............................................................................................................................45 - Ejercicio 12:............................................................................................................................45 - GPS en Android................................................................................................................................47 - Descripcin de las clases para la geolocalizacin.......................................................................47 - GeoPoint.................................................................................................................................47 - GeoCoder................................................................................................................................47 - Address...................................................................................................................................48 - Location..................................................................................................................................48 - LocationListener.....................................................................................................................48 - LocationManager....................................................................................................................48 - Ejercicio. GPS en la aplicacin del curso....................................................................................49 - Ejercicio 13:............................................................................................................................49 - Ejercicio 14:............................................................................................................................50 - Ejercicio 15:............................................................................................................................53 - Bases de datos en Android...............................................................................................................54 - Creacin de una base de datos.....................................................................................................54 - Uso de bases de datos..................................................................................................................56 - Ejercicio. Base de datos de la aplicacin del curso. Finalizando la aplicacin...........................56 - Ejercicio 16:............................................................................................................................56 - Ejercicio 17;............................................................................................................................57 - Ejercicio 18:............................................................................................................................59 - Ejercicio 19:............................................................................................................................60 - Ejercicio 20:............................................................................................................................60 - Ejercicio 21:............................................................................................................................60 - Ejercicio 22:............................................................................................................................61 - Ejercicio 23:............................................................................................................................62 - Ejercicio 24:............................................................................................................................63 - Ejercicio 25:............................................................................................................................63 - Extra 1: El simulador de GPS y cmo crear rutas para l................................................................64 - Extra 2: Configurar regiones para el funcionamiento del simulador GPS.......................................64

Desarrollo en Android por Luis Miguel Soria

-ElsistemaoperativodeGoogle:Android.

- Qu es Android?.
Android es un sistema operativo para mviles del tipo smartphone y est orientado, sobre todo, a mviles tctiles. Android se basa en un kernel de Linux, la versin 2.6 exactamente. El sistema operativo adems trae un paquete inicial de utilidades para el usuario, entre estas aplicaciones hay: - Cliente de correo electrnico. - Programa de SMS. - Calendario. - Mapas. - Explorador de Internet. - Organizador de contactos. Android ha sido desarrollado por el grupo Open Handset Alliance (http://www.openhandsetalliance.com/) formado por ms de 30 empresas de tecnologa y mviles. Entre ellas se encuentra Google, con todo lo que ello conlleva, facilidad de programar en mapas o cualquier otra API de esta empresa, apoyo de una de las ms grandes empresas del sector, tanto en la solucin de problemas con la plataforma en la que desarrollamos, como en la posterior venta de la aplicacin. Adems, tenemos la seguridad de que este sistema operativo no ser flor de un da y continuar expandindose por el mercado de la telefona mvil. Android ofrece un sistema de desarrollo totalmente abierto y gratuito al programador.

- Estructura de Android.
En la siguiente figura podemos observar la arquitectura del sistema operativo Android:

Desarrollo en Android por Luis Miguel Soria

Los principales componentes del sistema operativo Android son:

- Aplicaciones: Todas escritas en un lenguaje Java adaptado para Android. Ya mencionamos, en el punto anterior, varias de ellas.

- Framework de aplicaciones: Los programadores pueden acceder a las mismas API que las aplicaciones creadas por Google para el mvil. La arquitectura de las aplicaciones de Android est orientada a una divisin en componentes que ayuda al aprovechamiento del mismo cdigo en distintas aplicaciones. - Libreras: Android incluye un conjunto de libreras C/C++ que usan varios componentes de su sistema operativo y que podemos usar desde el framework de Android. Entre ellas podemos encontrar libreras de grficos 2D y 3D, libreras de bases de datos (SQLite), etc. - Runtime de Android: Android incluye libreras base que dan casi todas las funcionalidades de las libreras base de Java. Android usa la mquina virtual Dalvik para correr sus aplicaciones, pudiendo, cada aplicacin tener su propia instancia de la mquina virtual. Adems, se ha optimizado el uso de recursos, por parte de la mquina virtual, para adaptarla a dispositivos con pocos recursos como los dispositivos mviles.

- Ncleo Linux: Como dijimos antes, el ncleo es la versin 2.6 de Linux, adems el ncleo trabaja como capa traductora entre el hardware y el resto del software del mvil.
Desarrollo en Android por Luis Miguel Soria

- ProgramacinenAndroid.

- Caractersticas de Android.
Android es una plataforma neutral en cuanto al desarrollo de aplicaciones, es decir, el programador tiene las mismas posibilidades para crear una aplicacin que Google o que cualquier empresa perteneciente al Open Handset Alliance. La siguiente lista destaca las caractersticas ms importantes de Android: No existen costes de licencias, distribucin o desarrollo. Acceso al hardware WiFi. Conexin GSM, EDGE y 3G para telefona o transferencia de datos. API GPS fcil de utilizar. Control total sobre el hardware multimedia, pudiendo usar tanto la cmara como el micrfono. API para el acelermetro y el comps. Acceso total al almacenamiento del sistema. Acceso al explorador de Internet que es gratuito. Soporte total para aplicaciones que integran el uso de la API maps de Google. Grficos 3D y 2D optimizados para hardware de mvil usando OpenGL ES. Un Framework que te permite el reciclaje de componentes, de una aplicacin, para varias aplicaciones y el reemplazo de aplicaciones nativas al sistema operativo.

A destacar entre todas estas caractersticas es el soporte de Google con la API Google maps. Se pueden crear una gran cantidad de aplicaciones basadas en mapas de una forma fcil y potente, superando a cualquier otra opcin en el mercado actual. Los servicios de localizacin de Android se basan en el GPS y en la localizacin mediante las antenas del operador mvil.

Desarrollo en Android por Luis Miguel Soria

- Herramientas de desarrollo.
Existen una gran variedad de herramientas de desarrollo que nos aporta Android. A continuacin, se listar las ms importantes dando una pequea descripcin. El plugin de herramientas de desarrollo de Android: Es una extensin para la plataforma Eclipse, permitindote desarrollar aplicaciones Android en ella. El emulador de Android: Es un simulador de mvil que se instala al instalar Android en tu sistema y que te ayuda a poder probar tus aplicaciones. Configuraciones de dispositivos virtuales de Android: Son configuraciones de dispositivos que el programador puede crear en el emulador y que configuran su funcionamiento (programas instalados, skins, posibilidad de aadir tarjetas SD, etc.) Visor de Interfaces: Ayuda a poder crear las interfaces de nuestra aplicacin, dndonos la opcin de ver el resultado de nuestro diseo de interfaces sin tener que ejecutar la aplicacin. El monitor de depuracin sobre Dalvik: Est integrado con la mquina virtual Dalvik y se encarga de dar al programador todas las opciones de control sobre la mquina virtual. El puente de depuracin de Android: Es la herramienta que te permite instalar aplicaciones en el emulador y poder acceder a ste desde lnea de comando, adems da soporte a depuradores estndar, como puede ser el de Eclipse. Mksdcard: Te ayuda a crear una imagen de disco para que el emulador la tome como su tarjeta SD.

- Componentes de una aplicacin Android.


Debido a que Android permite el uso de elementos de unas aplicaciones por parte de otras sin necesidad de agregar el cdigo del elemento, el sistema debe ser capaz de arrancar una aplicacin cuando cualquier parte de sta sea llamada. As que las aplicaciones de Android no tienen slo un punto de entrada si no que tendrn componentes que el sistema puede arrancar cuando sea necesario. Los 4 tipos de componentes son: Actividades: Las actividades son como aplicaciones dentro de una aplicacin, muestran al usuario una interfaz y controlan las acciones que tome ste dentro de esa interfaz. Las actividades son independientes unas de otras y todas son subclases de la clase Activity.

Desarrollo en Android por Luis Miguel Soria

Las aplicaciones pueden componerse de una o varias actividades. Cada actividad tiene una ventana en la cual mostrar su interfaz, tambin independiente del resto de las ventanas de otras actividades. Las interfaces se componen de objetos llamados Views. Un objeto View puede ser, desde un botn hasta un recuadro mostrando Google maps. Estos objetos representan la interactividad del usuario con la aplicacin. Servicios: Los servicios a diferencia de las actividades no ofrecen la opcin de una interfaz. Estos se ejecutan en segundo plano por un tiempo indefinido. Por lo dems, se podra decir que son iguales a las actividades. En este curso no se usarn este tipo de componentes, y directamente usaremos clases que implementen hilos secundarios para ejecucin en segundo plano. Receptores de broadcast: Son componentes que slo escuchan a mensajes de otros y dependiendo del mensaje ejecutan un proceso. Estos mensajes son enviados normalmente por las aplicaciones, pueden ser desde avisos del sistema operativo a mensajes creados por el propio programador. As podremos usar los receptores de broadcast como medio para que, dependiendo del caso, nuestra aplicacin ejecute otra aplicacin distinta. Proveedores de contenido: Los proveedores de contenido son los componentes que guardan la informacin en disco de una aplicacin, as esta informacin puede ser usada por otras aplicaciones. Los datos de los proveedores pueden estar guardados en bases de dato tipo SQLite, en los directorios del mvil, o en cualquier otro tipo de formato.

- Programacin en Eclipse.

- Instalacin de los programas necesarios.


Para realizar este curso necesitaremos los siguientes programas (versiones de finales de 2009). Eclipse IDE 3.5 (Galileo): http://www.eclipse.org/downloads/ JDK 6: http://java.sun.com/javase/downloads/index.jsp Android SDK 2.1: http://developer.android.com/sdk/download.html?v=android-sdk_r04windows.zip

Primero instalaremos el JDK de java y tras ello extraeremos los archivos comprimidos de Eclipse y de Android en las carpetas que creamos convenientes. Ahora, debemos de aadir Android al PATH de Windows. Para ello hacemos botn derecho sobre Mi PC y vamos a la pestaa de Opciones avanzadas. Pulsamos sobre Variables de entorno y en la parte de variables de sistema, modificamos la variable path,
Desarrollo en Android por Luis Miguel Soria

aadiendo la ruta completa a la carpeta /tools dentro del SDK de Android. Tras estos pasos de instalacin arrancamos Eclipse. Lo primero que haremos ser instalar el plugin de desarrollo de Android o ADT para Eclipse. Para ello, vamos a Help/Install new software y en la nueva ventana que aparece pulsamos sobre Add.... Aqu ponemos un nombre para el repositorio de donde vamos a descargar el plugin y metemos la direccin https://dl-ssl.google.com/android/eclipse/ . Tras aadir la nueva direccin deberemos de ver como nos aparece en la ventana de software disponible el plugin de Android o ADT. Lo seleccionamos y pulsamos sobre Next. Para las siguientes ventanas pulsamos Next hasta finalizar la instalacin. Para finalizar reiniciamos Eclipse. Cuando Eclipse arranca de nuevo necesitamos, configurar la localizacin del SDK de Android. Para ello vamos a Window/Preferences y pulsando sobre Android en la parte izquierda. En el men que nos aparece pulsamos sobre Browse... y seleccionamos la carpeta donde se encuentra el SDK. Pulsamos sobre Apply y cerramos la ventana. Como paso final debemos de lanzar el ADT y desde l en Aviable Packages instalar la ltima versin (o la que queramos usar) del SDK de Android.

- Creacin de un proyecto.
Necesitaremos tener instalado las ltimas versiones de Java, Eclipse y Android. Cuando tengamos instalado todo lo necesario para desarrollar nuestra aplicacin, arrancaremos Eclipse, marcando una direccin para el directorio de trabajo. Con eclipse arrancado, realizaremos los siguientes pasos: 1. Vamos a la zona de men File/New/Android Project y pulsamos en este ltimo.

2. En la siguiente ventana configuramos las opciones del proyecto, como son su nombre, el nombre de la actividad, nombre del paquete, etc.
Desarrollo en Android por Luis Miguel Soria

Cuando hemos pulsado Finish ya tenemos nuestro proyecto.

- Creacin de un emulador.

Para crear un emulador en el que ejecutar nuestras aplicaciones, necesitamos acceder al Android SDK and AVD Manager dentro de Eclipse. Para abrir esta venta, podemos, o pulsar sobre el icono de telfono en la parte superior izquierda de la ventana de Eclipse, o bien abrirlo desde el men Window.

Desarrollo en Android por Luis Miguel Soria

1 0

Dentro de sta ventana pulsamos sobre Virtual Devices y despus sobre el botn New... En la siguiente ventana que aparece debemos definir las caractersticas del emulador que vamos a crear (nombre, resolucin, a que servicios tendr acceso, memoria SD, etc.), tras configurar el emulador pulsaremos sobre Create AVD y ya tendremos nuestro emulador creado.

- Instalacin de un dispositivo mvil para usarlo en el desarrollo. (Probado con HTC


Magic).

Para los que tengan un dispositivo mvil con sistema operativo Android, siempre tienen la recomendable opcin de desarrollar sus aplicaciones usando ste como sustituto del emulador.

Desarrollo en Android por Luis Miguel Soria

1 1

Para instalar el dispositivo mvil, primero necesitaremos el driver de Windows. El driver lo podemos descargar con el Android SDK and AVD Manager" que antes usamos para instalar el emulador. Tenemos que abrir ste plugin y en l pulsamos sobre Available Packages. Buscamos el controlador, que tendr que venir con un nombre parecido a Usb Driver package, revision X, lo seleccionamos y pulsamos sobre el botn Install Selected. El plugin de desarrollo de Android te habr creado en la carpeta del SDK un directorio con el nombre Usb_driver. Donde se encuentra el driver para el dispositivo mvil. Con el driver ya descargado, debemos ahora conectar el dispositivo mvil al ordenador. Primero, antes que nada, deberemos asegurarnos que nuestro mvil Android est configurado para permitir depuracin de aplicaciones en l. Hecho esto conectamos el mvil. Cuando salga el men de instalacin de nuevo hardware de Windows pulsamos sobre Instalar desde una lista o lugar y pulsamos Siguiente. En el siguiente men seleccionamos manualmente el driver desde la direccin de nuestro SDK y pulsamos Siguiente para finalizar la instalacin.

- Hola Android.
Para hacer nuestra primera aplicacin en Android, vamos a crear un proyecto para Android en Eclipse. Tenemos que pulsar sobre el men File/New/Android Project donde nos aparecer una ventana para la creacin del proyecto.

Desarrollo en Android por Luis Miguel Soria

1 2

En esta ventana debemos de darle un nombre al proyecto (HolaAndroid), seleccionar una versin destino, que en nuestro caso ser Android 2.1 y darle nombre tanto a la aplicacin como al paquete y a la actividad principal del programa (en nuestro caso podemos darles HolaAndroid, curso.android.holandroid y HolaAndroid respectivamente). La versin mnima permitida, la configuraremos a 4. Hay que tener en cuenta que si decimos que la versin mnima permitida es N, la aplicacin deber funcionar perfectamente desde N hasta la versin del SDK usado por la aplicacin. Tras toda la configuracin de nuestro proyecto, pulsamos sobre Finish. Ya tenemos el proyecto creado. Si vamos a la izquierda, en el explorador de paquetes de
Desarrollo en Android por Luis Miguel Soria

1 3

Eclipse podemos encontrar la estructura de carpetas y ficheros que forma nuestro proyecto. En src/curso.android.holaandroid nos aparecer el fichero java de nuestra actividad. Pulsando dos veces sobre l se visualizar en pantalla.

Antes de entrar a comentar el cdigo que nos aparece nos centramos en la parte izquierda de la pantalla donde nos aparece la siguiente imagen.

Desarrollo en Android por Luis Miguel Soria

1 4

Vamos a explicar un poco ms en detalle algunas cosas de las que aparecen: La carpeta res y assets, son carpetas donde guardaremos nuestros recursos del programa, desde imgenes hasta cadenas de texto, pasando por xml, tipos de colores... (Nosotros no usaremos la carpeta assets ya que las dos carpetas se usan para recursos y, en principio, tienen casi la misma funcionalidad. La carpeta res se puede acceder directamente con un mtodo en el cdigo y se compila junto a la aplicacin y la carpeta assets debes crear un objecto administrador para acceder a ella). Aunque podemos organizar nuestros recursos como queramos, por defecto, se organizan de la siguiente forma: Carpeta anim: Aqu se guardan las animaciones de la aplicacin. Suelen ser creadas con ficheros XML. Carpeta drawable: Aqu se guardan las imgenes usadas en la aplicacin. En el cdigo se puede acceder a esta carpeta mediante la instruccin
Desarrollo en Android por Luis Miguel Soria

1 5

mContext.getResources().getDrawable(R.drawable.imageId). Carpeta layout: Aqu se guardan los ficheros xml que representan las interfaces de cada actividad de la aplicacin. Carpeta values: Distintos tipos de recursos, suele contener ficheros XML del tipo: arrays.xml: Para arrays de datos. colors.xml: Para guardar distintos tipos de colores. Se puede acceder en cdigo a ste fichero mediante Resources.getDrawable() and Resources.getColor(). strings.xml: Aqu se pueden definir los textos que aparezcan en la herramienta, como por ejemplo texto de botones o de etiquetas. styles.xml: Aqu se definen los los estilos para nuestra aplicacin. Carpeta xml: Otro tipo de XML que cree el programador y que se pueden acceder en cdigo mediante Resources.getXML(). Carpeta raw: Cualquier otro tipo de fichero que son accesibles en cdigo mediante Resources.openRawResource(). Una forma rpida de tener acceso rpido en cdigo a todos los recursos que contienen estas carpetas es directamente accediendo a sus Ids (cada recurso dentro de cada fichero dentro de cada carpeta distinta, tiene una ID) mediante la instruccin R.IdContenedorRecurso.IdRecurso que nos devuelve un identificador nico de un recurso en concreto y que muchas de las clases de la SDK de Android admiten como sustituto del recurso en s en sus mtodos. El fichero AndroidManifest.xml contiene informacin referida al proyecto en s y a la organizacin de las actividades. Este fichero no puede faltar en ninguna aplicacin Android ya que da informacin de la aplicacin al sistema cuando se ejecuta en ste. Algunas funcionalidades del manifiesto son: Contiene el nombre del paquete para la aplicacin y que le sirve al sistema como identificador de la aplicacin. El manifiesto describe los componentes de la aplicacin (Actividades, Servicios, Proveedores de contenido,...). As el manifiesto guarda las capacidades de cada componente para que la aplicacin sepa como ejecutarlos y qu condiciones son necesarias para hacerlo. En el manifiesto se declaran los permisos que necesita la aplicacin sobre componentes protegidos del sistema operativo y sobre la API de Android. Volviendo a la creacin de nuestra primera aplicacin, habamos acabado de crear el proyecto, el cdigo que tenemos en el fichero java es:
package curso.android.HolaAndroid; import android.app.Activity; import android.os.Bundle; public class HolaAndroid extends Activity {

Desarrollo en Android por Luis Miguel Soria

1 6

/** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } }

Como vemos nuestra clase HolaAndroid implementa la clase Activity que como ya explicamos antes es el componente principal de una aplicacin. Dentro de la clase tenemos el mtodo onCreate, que se ejecutar cuando la actividad comience por primera vez a ejecutarse (esto ser cuando lo haga la aplicacin). El mtodo setContentView se encarga de representar la interfaz, pasada como R.layout.main, de la actividad. Pasaremos ahora a crear esa interfaz que se muestra en nuestra Actividad. Para ello abrimos el fichero main.xml dentro de res/layout. Podemos ver como se nos abre un editor especial para interfaces, donde podemos crear nuestras interfaces sin tener que escribir pesado cdigo (aunque tambin podemos hacerlo de esta manera), en vez de ello arrastrando los Views a la pantalla que aparece y configurando sus propiedades podremos obtener la interfaz que buscamos.

Para crear nuestro programa HolaAndroid necesitaremos un TextView que mostrar nuestro saludo. Como vemos ya viene aadido por defecto dentro del proyecto. Vamos a observar un poco ms de cerca el XML del layout.
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent"

Desarrollo en Android por Luis Miguel Soria

1 7

> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> </LinearLayout>

Vemos que el primer objeto que est descrito en el XML es un LinearLayout. Este tipo de objeto tiene la funcin de organizar al resto de Views que se inserten en la interfaz (ya hablaremos de l ms adelante). El siguiente objeto, que es hijo de LinearLayout, es un TextView, el cual tiene la funcin de presentar texto en pantalla (tambin hablaremos de l ms adelante). En cuanto a las propiedades de cada elemento dentro del XML, hay que tener claro que todas empiezan con la etiqueta android y que, al menos, todo objeto debe de contener las propiedades android:layout_width y android:layout_height. Lo ltimo que nos queda por hacer es arrancar la aplicacin en el emulador o en el dispositivo mvil (depende de lo que estemos usando para depurar sta). Vamos al men Run/Run Configurations donde vamos a crear nuestra configuracin de ejecucin. Dentro de la nueva ventana pulsamos con botn derecho sobre Android Application y pulsamos sobre New.

Desarrollo en Android por Luis Miguel Soria

1 8

Se nos crea una nueva configuracin para ejecutar la aplicacin, dentro de sta escribimos un nombre y seleccionamos el proyecto que se ejecutar (pulsando sobre Browse), en nuestro caso ser HolaAndroid. En la pestaa Target seleccionamos el dispositivo sobre el que se ejcutar nuestra aplicacin. Si seleccionamos el dispositivo mvil, tendremos que escribir en el campo Additional Emulator Command Line Options, el comando -d, para marcar que es un dispositivo externo. Ya tenemos todo configurado, as que pulsamos sobre Run para ejecutar la aplicacin. As debera de quedar nuestro HolaAndroid en nuestro emulador/mvil.

Desarrollo en Android por Luis Miguel Soria

1 9

- Descripcindelaaplicacindelcurso.
Durante los siguientes puntos tericos del curso, vamos a ir desarrollando una aplicacin en la que podamos aplicar los conocimientos que vamos a ir adquiriendo. Esto servir para reafirmar los conceptos aprendidos y para explicar de una forma mas entretenida el funcionamiento de la SDK de Android. La aplicacin a desarrollar se basar en el uso de mapas y de geolocalizacin, y su objetivo ser mostrar a los amigos que el usuario agregue a la aplicacin, en un mapa para que el usuario pueda saber donde se encuentran en cualquier momento. La aplicacin dispondr de opciones de configuracin, as podremos ver cmo funcionan los mens y las listas de opciones. Algunas de estas opciones sern, el tipo de vista de mapa, la distancia mxima para buscar amigos, el tiempo de refresco para la posicin de los amigos... Adems aadiremos otro tipo de funcionalidades que no tendrn un uso prctico, sino ms bien un uso acadmico. Por ejemplo, aadiremos una barra de bsqueda de lugares y explicaremos como realizar el proceso de bsqueda hasta llegar a pinchar una chincheta donde se encuentra el lugar. La aplicacin usar un servidor SOAP que guardar las posiciones actualizadas de los usuarios del sistema. Las conexiones al servidor SOAP, no se explicarn en el curso, aunque si que se dar en la solucin de la aplicacin la clase que realiza las conexiones con el servidor. La aplicacin se construir a base de ejercicios que iremos realizando en cada tema, cada ejercicio tendr una solucin que se enviar al alumno al acabar el tiempo del ejercicio.

Desarrollo en Android por Luis Miguel Soria

2 0

-InterfacesgrficasenAndroid.

- Estructura de una interfaz en Android.


La interfaz de usuario, en una aplicacin Android,est formada por Views. La clase View sirve como la clase base para unos widgets que ofrecen objetos totalmente implementados para ser usados en la interfaz (estos widgets pueden ser botones, cuadros de texto, listas de elementos, listas desplegables,). Aparte de la clase View existe otra clase que tambin es unidad bsica de la interfaz, esta clase es ViewGroup, clase base para los layouts, que ofrecen distintos tipos de capas organizadas para distribuir los objetos (lineal, relativa, tabular, etc.) Toda la interaccin del usuario con la interfaz ser soportada por los objetos tipo View, siendo dentro de estos donde tendremos que implementar los eventos relacionados con las acciones del usuario dentro la interfaz. En la siguiente imagen podemos ver una jerarqua tpica de clases dentro de una interfaz:

Los objetos Views siempre han de ser hijos de objetos ViewGroup, por lo tanto, siempre hemos de comenzar el diseo de la interfaz con un objeto ViewGroup, a partir de ah, se pueden hacer los rboles que queramos para organizar la interfaz. Todo este rbol se implementa en archivos XML, donde cada elemento del XML es un objeto View o ViewGroup y los atributos del elemento son las propiedades de los objetos. As para que Android cargue una interfaz, solo tendr que leer este archivo e iniciar los objetos ah marcados. Un ejemplo simple de un archivo XML sera:
<?xml versin="1.0" encoding="utf-8"?>

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/text" android:layout_width="wrap_content"

Desarrollo en Android por Luis Miguel Soria

2 1

android:layout_height="wrap_content" android:text="Hello, I am a TextView" /> <Button android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="Hello, I am a Button" /> </LinearLayout>

- Views de nuestra aplicacin.


Vamos a comentar los Views ms importantes que vamos a usar dando una pequea descripcin de cada uno. Tras ello veremos como acceder a ellos en cdigo y como controlar los eventos que generan por cdigo. LinearLayout: Este tipo de layout aade cada View hijo en una linea recta, se puede elegir entre hacerlo en horizontal o en vertical. Dentro de un LinearLayout podemos configurar un peso para cada View dentro de l, que servir para asignar a cada View hijo un tamao que pueden tomar en pantalla. RelativeLayout: Usando este tipo de layout podemos definir la posicin de cada View hijo respecto al resto de Views hijos y respecto al padre y el borde de pantalla. Button: Este tipo de View representa un botn en pantalla. TextView: Este tipo de View representa una etiqueta en pantalla. EditText: Este tipo de View representa un texto editable por el usuario. MapView: Este tipo de View representa un mapa que usa Google maps. Ser explicado ms adelante en el curso. Para poder acceder a cualquier View que tengamos en una interfaz, en el cdigo, deberemos de ejecutar la siguiente lnea: View v = ( View ) findViewById( R.id.view_id ); Con esto hemos recogido el View con id igual a view_id y ahora podemos acceder, tanto a sus propiedades, como a sus eventos de interfaz. Los Views tiene muchos tipos de mtodos y de propiedades que usaremos, pero no entraremos ahora a explicarlos (se ir explicando en el curso cuando sea necesario). Para usar los eventos de un View y as poder hacer interfaces dinmicas y que ejecuten procesos, segn desee el usuario, deberemos de implementarlos de la siguiente forma. v.eventoInterfaz( new InterfazImplementaEvento() { mtodoParaEjecuccinEvento( parmetrosEntrada ) { Ejecucin del evento.

Desarrollo en Android por Luis Miguel Soria

2 2

} }); Como vemos lo que hemos hecho es implementar la interfaz del evento, para que as se ejecute el proceso deseado cuando el evento se produzca en el View v. Un ejemplo, para entender mejo esto, sera:
//Primero tenemos que recoger los botones creados en main.xml final Button entrar = (Button) findViewById(R.id.ButtonPresentacion1); final Button salir = (Button) findViewById(R.id.ButtonPresentacion2); //Agregamos a cada botn un evento click para cuando se produzca su pulsacin. entrar.setOnClickListener(new OnClickListener() { /** Se llama a este mtodo cuando se produzca el click en el botn. * * @param v Ser el View clickeado, en nuestro caso, un Button. */ @Override public void onClick(View v) { //Mostramos un dilogo para introducir el usuario y llamamos al lanzador //de la actividad ActividadMapa pasndole el nombre de usuario //introducido. showDialog(0); } }); salir.setOnClickListener(new OnClickListener() { /** Se llama a este mtodo cuando se produzca el click en el botn. * * @param v Ser el View clickeado, en nuestro caso, un Button. */ @Override public void onClick(View v) { //Salimos de la aplicacin. finish(); } });

- Ejercicios. Interfaces de la aplicacin.

- Ejercicio 1: Implementar la interfaz de la pantalla de presentacin de nuestra aplicacin en el curso. Abrimos el proyecto ya creado de Aplicacin curso que puedes encontrar en la carpeta de sta documentacin. Con el proyecto ya abierto vamos a editar el fichero main.xml. Lo primero que tenemos que hacer es borrar el TextView que nos viene por defecto. Ahora vamos a crear la interfaz intentando que se parezca lo ms posible a la que
Desarrollo en Android por Luis Miguel Soria

2 3

podemos ver en la siguiente imagen.

Pistas para poder hacer la interfaz: Hay que usar dos RelativeLayout. El primero contendr a dos TextView y al segundo RelativeLayout, mientras que el segundo RelativeLayout contendr a los botones. Usar la propiedad gravity para colocar cualquier View o cualquier texto de cualquier View. Usar la propiedad Text size para dar el tamao al texto de un View, el tamao viene dado en sp unidades. Usar la propiedad Text color para dar el color al texto. Usar las propiedades de Layout... para alinear los View. Para poner los textos de los Views usar los recursos que vienen con el proyecto (Ver fichero strings.xml dentro de res/values/). Para acceder a ellos escribiremos en la propiedad @string/id_string Cambiar las ids de los Views a unas que podamos reconocer ms tarde. Una id se declara de la siguiente forma: @+id/id_View.

Desarrollo en Android por Luis Miguel Soria

2 4

- Ejercicio 2: Implementar el funcionamiento de la interfaz del ejercicio 1. Vamos a abrir el fichero AplicacionCurso.java y guardaremos los Views de la interfaz en variables para despus poder implementar sus eventos. Alguna pista: Acordarse de usar el mtodo findViewById para acceder a la interfaz. Ctr+Shift+O cuando os falte un import en la clase y os lo importar slo. Primero, siempre se guardan referencias a los Views de la interfaz y despus se trabaja sobre esos objetos View. Usar la clase Toast para enviar mensajes por pantalla. Crear una instruccin del tipo: Toast.makeText( NombreClase.this, TextoAMostrar, Toast.LENGH_SHORT).show(); Para el evento de pulsar sobre Cancelar llamaremos al mtodo finish() que cierra nuestra aplicacin.

- Ejercicio 3: Crear la interfaz de la actividad que llevar el mapa. Necesitamos crear un nuevo fichero XML de interfaz y agregarlo a la carpeta res/layout /. Para crear un fichero nuevo XML, pulsamos botn derecho sobre la carpeta del proyecto y en el men desplegable pulsamos sobre New / File. Dentro de la nueva ventana que aparece seleccionamos la carpeta donde vamos a guardar el fichero (layout) y el nombre del fichero (escribir la extensin .xml). Hecho esto, pulsamos sobre Finish y ya tenemos el XML vaco aadido al proyecto. Tras crear el nuevo fichero, lo abrimos, y Eclipse , automticamente, abrir el editor de layouts de la SDK de Android. La interfaz que vamos a crear debera de parecerse a la siguiente:

Desarrollo en Android por Luis Miguel Soria

2 5

Para esta interfaz necesitaremos realizar un paso extra. Crear una clave de acceso para nuestra aplicacin a Google maps (el elemento MapView en el XML de interfaz, posee una propiedad llamada android:apiKey donde hay que introducir la clave de acceso a Google maps). Para crear la clave de Google maps, deberemos de realizar los siguientes pasos: 1. Crear la clave MD5 del certificado del SDK en modo Debug (como vamos a desarrollar la aplicacin usaremos esta). Necesitamos para ello ejecutar el fichero keystore que tenemos por defecto para modo debug. La ruta por defecto, donde encontrar ese fichero, es C:\Document and Settings \ <usuario> \ .android \ debug.keystore. Tambin podemos comprobar la localizacin de keystore mediante Eclipse es el men Windows/Prefs/Android/Build. Cuando tenemos la ruta completa al fichero, deberemos de ejecutar el siguiente comando en consola para cread la clave MD5: $ keytool -list -alias androiddebugkey -keystore <path_to_debug_keystore>.keystore -storepass android -keypass android Este comando nos devolver la deseada clave MD5 que deberemos de guardar
Desarrollo en Android por Luis Miguel Soria

2 6

para crear nuestra clave de Google maps.

2. Cargamos la siguiente pgina web: http://code.google.com/android/maps-api-signup.html Necesitaremos tener una cuenta de Google (con una de Gmail basta). Introducimos la clave MD5 y pulsamos sobre Generate API Key. En la pgina que se abra, aparecer la clave que necesitamos. Guardamos la clave. Ahora ya podemos crear nuestra interfaz, aqu se pueden ver algunas pistas para ello: El layout que usaremos para nuestra interfaz ser un RelativeLayout, dentro de l tendremos un elemento MapView, dos elementos ImageButton y un elemento EditText. Crear el elemento MapView desde el siguiente ejemplo:
<com.google.android.maps.MapView android:id="@+id/mapa" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:fitsSystemWindows="true" android:apiKey="Tu_API_Key"/>

Usar las propiedades de alineacin para colocar los ImageButton y el EditText donde querramos. Para cargar las imgenes en en los ImageButton usar la propiedad android:src, a las imgenes se accede con @drawable/menu_map y @drawable/menu_search. Un fondo transparente se consigue configurando la propiedad android:background a valor #00000000. Recordar poner ids a todos los elementos que vayamos a usar ms adelante en cdigo.

Desarrollo en Android por Luis Miguel Soria

2 7

-ActividadesenAndroid.

- Creacin de una actividad en Eclipse.


Para crear una actividad en Eclipse hay que realizar dos pasos: 1. Primero deberemos de crear una clase que extienda a Activity. Pulsamos botn derecho sobre el paquete donde estn nuestros archivos java y vamos a New/Class/ en la ventana que aparece deberemos de escribir un nombre para nuestra clase y hacerla que extienda de Activity, para ello, vamos a la propiedad superclass y escribimos Activity, slo tendremos que pulsar ctrl + espacio para que aparezca la ruta de paquetes de la clase. Escrito el nombre de la clase y aadida la superclase slo nos queda pulsar sobre Finish. 2. Ya tenemos creada nuestra nueva actividad, ahora debemos hacerle saber a la aplicacin que existe una nueva actividad. Tenemos que aadirla en el manifiesto de la aplicacin. Abrimos el manifiesto, y en la primera pestaa que aparece, en la parte de Application nodes pulsamos sobre Add... y seleccionamos Activity. Creado el nuevo nodo de nuestra aplicacin, slo tendremos que asignarle la clase que acabamos de crear. Pulsamos sobre el botn Browse... de la propiedad Name y aadimos nuestra clase creada. Con estos dos rpidos pasos, ya tenemos creada una actividad, ahora veremos cmo funcionan las actividades y algunas actividades especiales que nos ayudarn a crear nuestra aplicacin.

- Uso de actividades.
Ya se explic que una actividad se poda considerar, casi, como una aplicacin dentro de la aplicacin que desarrollamos. Las actividades representan el proceso en ejecucin que el usuario ve en el dispositivo mvil en un momento dado. Por lo tanto, una aplicacin slo puede tener a la vez una actividad en ejecucin, esto provoca que las actividades tengan unos ciclos de vida y puedan pasar por diversos estados, mientras estn en ejecucin, en segundo plano, pausadas, etc. Vamos a ver los distintos tipos de estado (y los eventos que se producen al llegar a ellos) que puede tomar una actividad, con una pequea resea de cada uno.

Desarrollo en Android por Luis Miguel Soria

2 8

En este dibujo, podemos ver los distintos estados, y mtodos que los implementan, que puede tomar una actividad. Pasemos a describirlos: Activity onCreate: Se llama al mtodo onCreate cuando la actividad es creada por primera vez. En esta zona de cdigo es donde debemos de configurar todos los Views de la interfaz y dar valores a los objetos y variables que vayamos a usar. ste mtodo tiene un parmetro de entrada de tipo Bundle que contiene el estado de la ltima ejecucin de la actividad, si esta fue ejecutada hace poco tiempo. Activity onRestart: Mtodo que se ejecuta justo antes de que una actividad comience de nuevo y despus de haber sido parada.

Desarrollo en Android por Luis Miguel Soria

2 9

Activity onStart: Mtodo que se ejecuta cuando la actividad se est convirtiendo en visible al usuario. Activity onResume: Mtodo que se ejecuta cuando la actividad se convierte en la visible por el usuario y ste puede empezar a interactuar con ella. Activity onPause: Mtodo que se ejecuta cuando otra actividad va a pasar a primer plano o esta actividad va a ser cerrada. Activity onStop: Mtodo que se ejecuta cuando la actividad ya no es visible al usuario y hay otra ya en primer plano, o esta actividad va a ser destruida. Activity onDestroy: Mtodo que se ejecuta cuando la actividad est siendo destruida, y va a desaparecer de la cola de actividades del mvil. Una actividad puede ser destruida por el usuario, al salir de sta, o por Android si sta actividad no est en primer plano y el sistema operativo necesita ms recursos. Al ser Android un sistema multitarea, se pueden estar ejecutando varias actividades de distintas aplicaciones a la vez. El sistema administra sto con una cola de actividades, en la que la posicin ms alta la ocupa la actividad que se muestra por pantalla en el momento, y la posicin ms baja la ocupa la actividad ms cercana a ser destruida. Una actividad no puede ser destruida si se encuentra en los estados de onCreate, onRestart, onStart y onResume. En el resto de estados, la actividad puede ser destruida por el sistema, si ste lo considera necesario (necesidad de recursos). Para nuestra aplicacin usaremos, solamente, los estados de onCreate (para abrir la aplicacin) y de onDestroy (para cerrar la aplicacin). El resto de estados no los tomaremos en cuenta en este curso.

- Actividades especiales.
En Android existen varias actividades que podramos calificar de especiales. Este tipo de actividades suelen servir para un funcionamiento concreto, implementan funcionalidad de distintos tipos de Views para que as le sea ms fcil al programador desarrollar una interfaz usando principalmente ese tipo de View. Nosotros usaremos dos tipos de actividades especiales: ListActivity: Implementa una interfaz tipo lista de Views. Para poder usar esta actividad, no se necesita ningn tipo de XML de interfaz, ya que la actividad tiene una interfaz por defecto. Pero, si se desea implementar una interfaz algo diferente, siempre se puede asignar un XML de interfaz, siempre y cuando, ste contenga un ListView con el ID @id/android:list. Dentro de la clase que implementa a la atividad ser necesario, que tras aadir la interfaz a la actividad llamemos al mtodo: setListAdapter(ArrayAdapter); La clase ArrayAdapter es la clase que le dar la funcionalidad a la lista, es decir,
Desarrollo en Android por Luis Miguel Soria

3 0

los eventos de interfaz y el acceso a los elementos se harn a travs de sta clase. Para crear un ArrayAdapter se llama al constructor: new ArrayAdapter<Tipo>( Context, tipo_de_lista, String[]); El parmetro tipo_de_lista es un ID para un recurso proveniente del paquete android.R.layout, en nuestra aplicacin usaremos el ID simple_list_item_1. MapActivity: Este tipo de actividad implementa una actividad con mapa. Si se desea usar un mapa en una aplicacin hay que usar sta actividad obligatoriamente. Para que este tipo de actividad funcione, la clase que extienda a MapActivity necesita implementar el mtodo isRouteDisplayed. Tambin existe otro tipo de actividad especial, como el TabActivity, que implementa una actividad con varias pestaas. Siempre hay que tener en cuenta que una Actividad slo puede extender a una actividad especial, es decir, no podemos, por ejemplo, mezclar mapas con organizacin por pestaas.

- Comunicacin entre actividades.


Es normal que queramos dividir nuestra aplicacin en varias actividades (actividades para la ejecucin principal, para las opciones, para la pantalla de incio, etc.), por ello es necesario tener a mano recursos que nos permitan ejecutar actividades desde otras actividades y que puedan usarse para comunicar datos entre ellas. Para el caso de la aplicacin del curso, usaremos la clase Intent, que es la clase encargada de llamar a una actividad desde otra, pudiendo pasar parmetros. No haremos un uso avanzado de esta clase ni de varias otras que ayudan a la comunicacin entre actividades y procesos. Nos basaremos en la ejecucin de una aplicacin con una actividad principal que llamar a otras para que ejecuten diversas operaciones y tras ello le devuelvan un resultado a la actividad principal. Mientras una actividad secundaria, est ejecutndose, la actividad principal estar pausada, esperando el resultado de la secundaria. Podemos definir la clase Intent como la descripcin de una operacin a ser realizada. La clase Intent es la encargada de lanzar una actividad desde otra, y es la que guarda los datos que queremos pasar entre actividades. Una llamada estndar de una actividad a otra sera (cdigo de la solucin de la aplicacin del curso):
//Creamos el objeto intent para realizar la llamada. Intent actividadMapa = new Intent(this, ActividadMapa.class); actividadMapa.putExtra(BaseDatosCurso.CLAVE_USUARIO, usuario); actividadMapa.putExtra(BaseDatosCurso.CLAVE_PASSWORD, password); actividadMapa.putExtra(BaseDatosCurso.CLAVE_VISTA, vista); actividadMapa.putExtra(BaseDatosCurso.CLAVE_RADIO, radio); actividadMapa.putExtra(BaseDatosCurso.CLAVE_TIEMPO_ACTUALIZACION, tiempo); //Realizamos la llamada y cerramos esta actividad. startActivity(actividadMapa);

Desarrollo en Android por Luis Miguel Soria

3 1

finish();

Hemos creado el objeto Intent (pasando this, contexto de la actividad y ActividadMapa.class clase que implementa a la actividad) y hemos aadido varios parmetros con el mtodo putExtra(NombreParmetro, parmetro). Cuando hemos finalizado de cargar el objeto Intent hemos comenzado la actividad nueva usando el mtodo startActivity(ObjetoIntent) y hemos finalizado la que se estaba ejecutando con el mtodo finish(). En la actividad lanzada, si queremos recoger los datos enviados por la actividad lanzadora, deberemos de usar el siguiente mtodo: getIntent().getTipoExtra(clave_param); Donde tipo, ser el tipo de datos que tiene el parmetro con clave igual a clave_param. Si queremos que la actividad que lanzamos nos devuelva algn tipo de resultado, en vez de llamar a starActivity, debemos de llamar a startActivityForResult(ObjetoIntent), e implementar un nuevo mtodo en la actividad lanzadora, el mtodo onActivityResult, podemos ver su declaracin en el siguiente ejemplo:
protected void onActivityResult(int requestCode, int resultCode, Intent data)

Este mtodo es el que recibe el evento de fin de actividad, setResult(codigoResultado, intent), cuando la actividad lanzada finaliza su ejecucin. Si tenemos que recibir algn tipo de resultado, lo haremos por el parmetro de entrada data. Para recoger los datos, tendremos que hacerlo con el mtodo getTipoExtra(NombreDeParmetro) del objeto Intent. Ejemplo:
String pass = data.getStringExtra("password")

- Ejercicio. Actividades de la aplicacin del curso.


Dentro de la aplicacin que estamos desarrollando tendremos las siguientes actividades: Una actividad de presentacin, que ya hemos creado, por defecto el nombre ser AplicacionCurso. Una actividad principal, que contendr el mapa y por lo tanto extender de MapActivity. Una actividad que ser lanzada de la principal, donde tendremos listadas las opciones de la aplicacin y extender de ListActivity.
Desarrollo en Android por Luis Miguel Soria

3 2

Ya tenemos creada la actividad AplicacionCurso, la creamos al crear el proyecto, y ser la actividad que se ejecutar al comenzar la aplicacin. Vamos ahora a crear las otras dos actividades.

- Ejercicio 4: Crear las dos actividades que faltan, siguiendo los pasos explicados anteriormente. Recordar que las clases deben de extender a MapActivity y a ListActivity. Crear la interfaz para ListActivity e implementar el mtodo onCreate de las actividades. Algunas pistas que seguir en este desarrollo: Acordarse de asignarle la id android:list al ListView que aadamos en la interfaz de ListActivity. Al escribir el mtodo onCreate de ambas clases, debemos de comenzar por llamar a super.onCreate, pasando el parmetro de entrada de onCreate y seguidamente llamar a stContentView( layout ) para darle un layout a la actividad. Aadir las clases al manifiesto de la aplicacin. Y como vamos a usar mapas, aadir una referencia al uso de las librerias de mapas, dentro del XML, dentro del elemento application. La refrencia es:
<uses-library android:name="com.google.android.maps"></uses-library>

Desarrollo en Android por Luis Miguel Soria

3 3

-MensydilogosenAndroid.

- Creacin y uso de mens.


Un men es una parte importante de nuestra actividad, provee al usuario de funcionalidades y configuraciones para la aplicacin dentro de una actividad. En Android podemos encontrar 3 tipos de mens, men de opciones, men contextual y submens. En nuestro caso slo usaremos el men de opciones, que es el que ms se usa en Android. Este men es accesible pulsando sobre el botn menu del mvil o del emulador. Para poder implementar un men dentro de una actividad necesitamos aadir dos mtodos de tipo evento, en nuestra clase de la actividad. Los mtodos son: onCreateOptionsMenu(Menu menu): Este evento se ejecuta cuando el usuario pulsa sobre el botn menu del mvil. Dentro de l deberemos llenar el parmetro menu de entrada con las opciones que queramos meter en nuestro men. Usaremos el mtodo add() que tiene varias declaraciones, de ellas nosotros usaremos la siguiente: menu.add(idGrupo, idElemento, orden, idRecursoCadena) De estos parmetros de entrada, slo usaremos idElemento e idRecursoCadena, en los otro dos siempre introduciremos el valor 0. En la misma lnea donde escribamos el mtodo add() aadiremos a la instruccin, el mtodo setIcon(IdRecursoIcono). En resumen, una lnea que crea un elemento en un men con icono sera: menu.add(idGrupo, idElemento, orden, idRecursoCadena).setIcon(IdRecursoCadena); onOptionsItemSelected(MenuItem item): Este mtodo se ejecuta cuando el usuario pulsa sobre alguna de las opciones que contiene el men. El parmetro de entrada item contiene la opcin pulsada. Por lo que dentro del mtodo deberemos tener un switch que compruebe cual elem ento es el pulsado. Ejemplo:
@Override public boolean onOptionsItemSelected(MenuItem item) { switch (item.getItemId()) { case 0: //Si se ha pulsado el botn de buscar return true;

amigos.

Desarrollo en Android por Luis Miguel Soria

3 4

case 1: //Si se ha pulsado el botn return true; case 2: //Si se ha pulsado el botn return true; case 3: //Si se ha pulsado el botn return true; }

de aadir

amigo.

de cambiar bsqueda.

de opciones.

return super.onOptionsItemSelected(item); }

Como vemos en el ejemplo tenemos que comprobar qu item se ha pulsado, usando el mtodo getItemId(). Importante recordar, que si no se cumple ninguna opcin del switch hay que retornar el resultado de la ejecucin del mtodo por parte del padre de la clase, en nuestro caso, Activity.

- Creacin y uso de dilogos.


Un dialogo, es una pequea ventana que aparece dentro de nuestra actividad cuando queremos ejecutar algn tipo de operacin simple que implica algn tipo de accin necesaria por parte del usuario, o algn tipo de mensaje informativo al usuario. Existen varios tipos de dilogos, AlertDialog, ProgressDialog, DatePickerDialog, TimePickerDialog y la clase padre de todas ellas, Dialog. Vamos a dar una breve explicacin de los dos ms importantes y que usaremos en nuestra aplicacin, AlertDialog y Dialog. AlertDialog es un dilogo que puede aceptar hasta tres botones y una lista de elementos seleccionables (radioButtons, checkBoxes, etc.), es el dilogo que se aconseja usar en la mayora de casos, ya que puede implementar casi todas las operaciones que necesitemos que realice el usuario. Dialog es un dilogo en blanco, es decir, un dilogo que no contiene Views, para poder mostrar un dilogo necesitamos asociarle una interfaz e implementar el comportamiento de todos sus Views (casi como con las actividades). La interfaz de un dilogo construido con Dialog puede ser tan complicada como queramos, al contrario que AlertDialog que est pensado para interfaces ms simples. Como hemos dicho, un dilogo pertenece a una actividad y por lo tanto son creados y lanzados dentro de sta. Para poder lanzar un dilogo se debe de llamar al mtodo showDialog( IdDialogo ), que a su vez llama a onCreateDialog( IdDialogo ) para crear el dilogo a mostrar (devuelve el dilogo a mostrar). Ambos mtodos disponen un parmetro id, y es que, todos los dilogos son llamados y creados por esos dos mtodos, de ah que necesitemos una forma de identificar cul
Desarrollo en Android por Luis Miguel Soria

3 5

queremos mostrar en un momento dado. Vamos a mostrar qu pasos hay que seguir para crear un dilogo de cada tipo en Android.

- Secuencia para crear un AlertDialog. 1. Primero declaramos el constructor de AlertDialog, AlertDialog.Builder. Al constructor de la clase le deberemos de pasar como parmetro de entgrada el contexto de la actividad, para que el dilogo sepa desde qu actividad se ejecuta. Esto se hace pasando el .this de la clase Ejemplo: AlertDialog.Builder constructor = new AlertDialog.Builder(NombreClase.this); 2. Configuramos las propiedades del constructor, como el ttulo del dilogo, con el mtodo setTitle( String ), si se puede cerrar el dilogo pulsando fuera de l, con el mtodo setCancelable( bool ), etc. 3. Configuramos los Views que van a formar parte. Podemos introducir cualquier View con setView(View) o podemos introducir uno de los que vienen por defecto con mtodos como setSingleChoiceItems( ArrayString, selectedItem, clickListener ). 4. Configuramos los botones que va a tener el dilogo (mximo 3). Con los mtodos setPositiveButton( nombreBoton, clickListener ), setNegativeButton( nombreBoton, clickListener ), etc. 5. Cuando el constructor est configurado por completo slo nos quedara llamar al mtodo create() del constructor y asignarlo a un AlertDialog donde llamaremos al mtodo show(). O tambin podemos hacerlo en una linea: constructor.create().show();

- Secuencia para crear un Dialog. 1. Declaramos el objeto Dialog, pasando en el constructor el contexto de la actividad. Ejemplo: Dialog d = new Dialog(NombreClase.this); 2. Configuramos las propiedades del dilogo, dem que para AlertDialog. 3. Condifuramos el layout que va a mostrar el dilogo. El layout se lo asignaremos con el mtodo .setContentView( idRecursoLayout ). 4. Ser necesario implementar el funcionamiento de todos los Views del layout
Desarrollo en Android por Luis Miguel Soria

3 6

agregado, esto se har como si el dilogo fuera una actividad ( configurar propiedades, configurar eventos de interfaz, etc. ) 5. Cuando el dlogo est configurado slo deberemos de mostrarlo por pantalla con el mtodo show().

- Ejercicio. Creacin de dilogos y mens en la actividad. Comunicacin entre actividades.

- Ejercicio 5: Crear un dilogo para la actividad inicial de la aplicacin donde nos pida un usuario y una contrasea, al pulsar el botn entrar. Usar la clase Dialog para ello. Algunas pistas para el ejercicio: Primero hemos de crear una interfaz (un XML de layout) que contenga dos cuadros de texto para usuario y contrasea y dos botones (aceptar y cancelar). Ejemplo:

Desarrollo en Android por Luis Miguel Soria

3 7

Ahora debemos de implementar el evento de pulsar sobre el botn entrar, donde llamaremos al mtodo showDialog(idDialogo) para crear el dilogo. Crear el evento onCreateDialog en la clase de la actividad. Slo tendremos un dilogo as que se crea el objeto Dialog directamente. Configurar el ttulo del dilogo con setTitle y darle la interfaz con setContentView. Crear los objetos que van a implementar el funcionamiento de los Views de la interfaz con findViewById. Implementar los eventos onClick de los botones y tambin los eventos onKey de las lneas de texto. Ejemplo de mtodo onKey:
usuario.setOnKeyListener(new OnKeyListener(){ /** Se llama a este mtodo cuando se produce la presin de una tecla * y estamos dentro de este View. * * @param v Ser el View donde estamos escribiendo, en nuestro caso, * un EditText. * @param keyCode Ser el cdigo de la tecla pulsada. * @param key Objeto que contiene informacin del evento producido. */ @Override public boolean onKey(View v, int keyCode, KeyEvent key ){ //Si la tecla pulsada es el enter, entonces vamos a //entrar en el mapa. if(KeyEvent.KEYCODE_ENTER==keyCode){ password.requestFocus(); return true; } //El evento no ha sido consumido. return false; } });

Creamos un mtodo que se llame lanzaActividad y que tenga como parmetros de entrada dos String (usuario y password) y tres int (vistaMapa, radio y tiempoActualizacion). ste mtodo se encargar de crear el Intent e introducirle los parmetros de entrada junto a sus claves. Recordar como se haca: Intent i = new Intent(this, ActividadMapa.this); i.putExtra(clave1, param1);

Creado el lanzador, slo faltar llamar a startActivity(Intent) y finish() para lanzar la nueva actividad y finalizar la actual. En la actividad mapa, hay que crear 5 variables globales a la clase, para guardar los datos pasados desde la actividad de presentacin. Debemos de darle permisos a la aplicacin de acceso a internet, gps y gps a travs de antenas. Esto se modifica en el manifiesto, aadiendo dentro del elemento manifest el siguiente cdigo:

Desarrollo en Android por Luis Miguel Soria

3 8

<uses-permission android:name="android.permission.INTERNET" /> <uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" /> <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" /> <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />

- Ejercicio 6: Crear el men de la actividad mapa y el lanzador para la actividad lista. Pistas para realizar el ejercicio: Para crear el men debemos de usar los mtodos onCreateOptionsMenu onOptionsItemSelected ya explicados anteriormente. En onCreateOptionsMenu no se puede olvidar llamar al mtodo .add del objeto men, para aadir los elementos al men, y llamar a showIcon para mostrar los iconos. Crearemos botones para: buscar amigos, aadir amigos, cambiar bsqueda y opciones de aplicacin. En onOptionsItemSelected crear un switch-case para ver qu botn del men fue pulsado, segn el cdigo que viene como parmetro de entrada. Los casos los dejaremos vacos, excepto el de opciones de aplicacin, que ejecutaremos el lanzador de actividades (Intent). El lanzador, en vez de ejecutarse con el mtodo startActivity se ejecutar con el mtodo startActivityForResult para esperar el resultado. Hay que crear el mtodo onActivityResult para cuando la actividad lanzada devuelva un resultado. Al lanzador habr que aadir todos los elementos que se aadieron para el lanzador de la actividad presentacin, dos String (usuario y password) y tres int (vistaMapa, radio y tiempoActualizacion) que pasaremos a la actividad lista.

- Ejercicio 7: Crear el adaptador de la lista y los eventos de pulsacin para cada uno de los elementos de ella. Pistas para realizar el ejercicio: Para declarar el adaptador lo primero que necesitaremos ser un array de cadenas, que representen los textos de cada elemento que va a tener la lista de opciones. La lista tendr estos elementos: Distancia de amigos, Cambiar usuario, Resetear mapa amigos, Resetear mapa lugares, Tiempo actualizacin amigos. Tras crear el array, crearemos el adaptador. Creamos el evento de pulsacin sobre un elemento de la lista. Como usamos la actividad ListActivity, podremos crear el evento, directamente, en la clase, con: onListItemClick( ListView l, View v, int position, long id);
Desarrollo en Android por Luis Miguel Soria

3 9

Dentro del evento de pulsacin deberemos de comprobar qu elemento ha sido pulsado, comprobando el id de entrada. Tendremos 5 casos. Ejecutar para cada caso una operacin distinta: Para Distancia de amigos: Crear un dilogo de tipo AlertDialog, usando su propiedad setSingleChoiceItems(arrayItems, selectedItem, clickListener) para configurar una lista de radioButtons donde aparezcan las distancias que queramos, siendo el elemento seleccionado de inicio el de valor de la variable de la clase radioActualizacion. Para Cambiar usuario: Lo dejamos vaco por el momento Para Resetear mapa amigos: Slo tendremos que cambiar de estado a verdadero una variable pblica, para despus enviarla como resultado a la actividad mapa. Para Resetear mapa lugares: Idem. Para Tiempo actualizacin amigos: Crear un dilogo de tipo AlertDialog, usando su propiedad setSingleChoiceItems(arrayItems, selectedItem, clickListener) para configurar una lista de radioButtons donde aparezcan los tiempos que queramos, siendo el elemento seleccionado de inicio, el de valor de la variable de la clase tiempoActualizacion.

- Ejercicio 8: Modificar la interfaz del dilogo de la actividad presentacin (aadiendo nuevos Views), para poder ser usado como interfaz del dilogo que debe aparecer al pulsar sobre el elemento Cambiar usuario de la actividad lista, en la actividad presentacin cambiar la visibilidad de los nuevos Views aadidos, para que no se vean en la actividad presentacin. Pistas para hacer el ejercicio: Hay que aadir editores de texto y etiquetas nuevas para un campo nueva contrasea y otro campo email. Aadir la llamada showDialog dentro del caso de pulsar Cambiar usuario en la lista y aadir el mtodo onCreateDialog a la clase. Dentro de onCreateDialog crear el dilogo usando la interfaz modificada. Se deben ocultar los Views que no usemos (los referentes a usuario), usar el mtodo setVisibility(View.GONE), que hace que la aplicacin no tome en cuenta el View al pintar la interfaz. Modificar la actividad presentacin para que ahora oculte los Views extras aadidos a la interfaz del dilogo, los referentes a nueva contrasea y email.

- Ejercicio 9:
Crear un men para salvar los cambios hechos en las opciones, y que al salvar devuelva los nuevos valores como resultado a la actividad mapa (que es quien lanz a la actividad
Desarrollo en Android por Luis Miguel Soria

4 0

lista). Cargar esos valores en las variables de la clase de la actividad mapa. Pistas: - Primero implementar el men y despus el lanzador de la actividad, escribiendo antes del finish de la actividad, setResult(codigoResultado, intent). - Segundo, ir a la actividad mapa, e implementar el mtodo vaco de onActivityResult recogiendo los datos del parmetro de entrada, llamando a: intent.getTipoExtra(codigoParam);

Desarrollo en Android por Luis Miguel Soria

4 1

- MapasenAndroid.

- La clase MapView.
MapView es un View que muestra un mapa usando el servicio de Google maps. sta clase es capaz de captar todo tipo de eventos de pulsacin y movimientos de arrastre que realice el usuario automticamente. Por lo tanto slo tendremos que implementar los eventos en los que queramos que se ejecute algn proceso especial. Hay que recordar que esta clase slo se puede usar dentro de un MapActivity, sto es debido a que sta clase accede a la red y a procesos en background que deben de ser correctamente controlados, lo cul hace MapActivity. Los mtodos y propiedades de un MapView son algo especiales, y distintos, al resto de Views que vamos a ver en el curso. A continuacin mencionaremos los usados en la aplicacin: setSatellite( boolean ): Activa o desactiva la vista satlite ( desactivado muestra la vista de mapa hbrido. ) setBuiltInZoomControls( boolean ): Activa o desactiva los controles de zoom. getController(): Devuelve el controlador del mapa, un MapController, que nos ayuda a controlar y a configurar aspectos visuales y de animacin del mapa. Usaremos mtodos como animateTo( lugar ) para ir a un lugar con una animacin de desplazamiento, setCenter( lugar ) para posicionar el centro del mapa en un lugar, setZoom( zoom ) para configurar el zoom del mapa. getOverlays(): Devuelve una lista de overlays (figuras insertadas en el mapa), que mostrar el mapa. postInvalidate(): Este mtodo ejecuta un refresco en el mapa. Nos ser til para actualizar el mapa tras aadirle figuras a su lista de elementos.

- Elementos de un MapView.
Un mapa puede contener distintos tipos de elementos, incluso puede contener Views. En las siguientes lneas se explicarn los elementos, especficamente diseados para ser aadidos a un mapa. Estos son Overlay, ItemizedOverlay (OverlayItem) y MyLocationOverlay.

- Overlay.

Desarrollo en Android por Luis Miguel Soria

4 2

Clase que representa un elemento que se mostrar encima de un mapa. sta clase necesita ser extendida para poder usarla. As deberemos de crearnos una clase que extienda de Overlay y que implemente su mtodo draw. A esta clase podremos aadir todos los parmetros asociados al Overlay que consideremos necesario para poder operar con l posteriormente. No se nos debe de olvidar implementar el mtodo onTap del Overlay si queremos ejecutar algn tipo de operacin, cuando el usuario pulse sobre ese Overlay. Las declaraciones de estgos dos mtodos imprescindibles para usar overlays son: public boolean onTap(GeoPoint, MapView) public void draw(Canvas, MapView, boolean) Los distintos parmetros de entrada que vemos son: Canvas: Marco para dibujar la imgen del overlay. MapView: La clase que implementa el mapa donde est el overlay. Boolean: Si se tiene que dibujar sobra del dibujo o no. GeoPoint: Geopunto, en el mapa, que ha sido pulsado.

- ItemizedOverlay.
Esta clase representa una lista de overlays que se encuentran en un mapa. stos overlays sern todos del mismo tipo, es decir. Se dibujarn de la misma forma y actuarn antes las interacciones del usuario, de la misma manera. Su funcionamiento es casi idntico al de la clase Overlay, aunque sta clase no contiene mtodo de dibujado (lo hace ella) y el mtodo de pulsado tiene distintos parmetros de entrada: protected boolean onTap(int i) El mtodo onTap ahora slo tiene como parmetro de entrada el elemento que ha sido pulsado. La clase ItemizedOverlay necesita tener implementados los mtodos de creaItem( int ) y size() para poder devolver tanto un elemento de la lista, como el tamao de la lista. Los elementos que se aaden a una lista de ste tipo son objetos OverlayItem. Un objeto de ste tipo contiene su localizacin, una etiqueta y su ttulo. El constructor de un OverlayItem es:
Desarrollo en Android por Luis Miguel Soria

4 3

new OverlayItem(GeoPoint lugar, String etiqueta,String titulo);

- MyLocationOverlay. Es un overlay especial que viene en nuestra SDK y que se usa para representar nuestra posicin dentro del mapa. Tambin se puede usar para representar rotaciones del comps del mvil, pero es una caracterstica que no usaremos. Para crear un objeto de sta clase necesitamos ejecutar la siguiente instruccin. new MyLocationOverlay(Conexto, MapView) Los mtodos que usaremos para operar con sta clase son: enableMyLocation(): Para activar la localizacin del usuario en el mapa. disableMyLocation(): Para desactivar la localizacin del usuario en el mapa. runOnFirstFix(new Runnable()): Para realizar una operacin nada ms llegar los primeros datos desde el GPS. Runnable es la clase que implementa a un proceso. getMyLocation(): Devuelve la localizacin actual del usuario. Si se deseara implementar el evento de pulsacin sobre un objeto de la clase MyLocationOverlay tendramos que crear una nueva clase que extendiera de sta, e implementar nosotros el evento de pulsacin.

- Ejercicio. Mapa de la aplicacin del curso.

- Ejercicio 10: Crear los objetos que recojan los Views de la interfaz. Crear desde el View MapView el MapController. Configurar los controles de zoom del mapa, el tipo de vista y el zoom del mapa. Crear los eventos onClick y onKey de los botones y campos de texto.

Desarrollo en Android por Luis Miguel Soria

4 4

- Ejercicio 11: Crear el overlay tipo MyLocationOverlay, habilitar en el overlay la localizacin del usuario, marcar como primera ejecucin del overlay que el mapa se mueva hasta la posicin de ese overlay. Crear la variable de control de overlays (una lista de overlays), aadir el overlay de posicin a la lista. Crear una nueva clase que implemente a la interfaz itemizedOverlay (LugaresOverlay), con los siguientes mtodos y objetos: Un ArrayList de OverlayItem y un Context. Constructor que reciba un Drawable y un Context. createItem, donde se comprueba si el ndice de entrada es correcto y en ese caso se devuelve el Overlay de la lista. size, que devuelve el tamao de la lista. aadeOverlay, que aade un overlay a la lista y actualiza dicha lista. borraTodo, que borra toda la lista. onTap, evento que se ejecuta cuando el usuario pulsa sobre un overlay de esta clase. Crear un objeto de la clase LugaresOverlay pasndole un Drawable y el contexto de la clase del mapa. Pistas: El objeto Drawable es un objeto que representa un dibujo, para cargar una imgen sobre este tipo de objetos, hemos de llamar al mtodo: this.getResources().getDrawable(R.drawable.idImagen); Para crear la primera ejecucin del overlay de MyLocationOVerlay tenemos que llamar a runOnFirstFix y pasar un objeto del tipo Runnable.

- Ejercicio 12: Llamar a showDialog en el evento de pulsar del botn del mapa para la vista, e implementar el dilogo que se va a mostrar para cambiar la vista del mapa. Pistas: Vamos a usar un View nuevo para crear una lista desplegable con las dos opciones de vista de mapa, el View Spinner. Hay que crear un fichero de layout que contenga un View de este tipo.
Desarrollo en Android por Luis Miguel Soria

4 5

Para implementar el Spinner tenemos que crear un ArrayAdapter e introducirle las cadenas que debe de mostrar. Para nuestro caso vamos a usar un recurso ya creado, accediendo a l mediante: ArrayAdapter.createFromResource(Context, resourceId, spinnerClassId); Para el parmetro spinnerClassId debemos introducir un id de android.R.layout.Ids (que sea para Spinner). Al adaptador del Spinner habr que cconfigurarle tambin el layout del objeto cuando sus elementos estn desplegados. Habr que llamar al mtodo setDropDownViewResource y pasarle el valor R.layout.IdSpinnerDropdown. Para aadir el adaptador al Spinner se llama a setAdapter y para configurar el elemento seleccionado de inicio se llama a setSelection.

Desarrollo en Android por Luis Miguel Soria

4 6

- GPSenAndroid.

- Descripcin de las clases para la geolocalizacin.


Para poder crear operaciones sobre un mapa del estilo de bsquedas, sealizaciones, navegacin, necesitamos de una serie de clases que nos den los datos de localizacin del usuario y de los elementos que usaremos en esas operaciones. Las clases que vamos a usar para nuestra aplicacin sern GeoPoint, GeoCoder, Address, Location, LocationListener, LocationManager. Veremos a continuacin una breve explicacin de cada clase.

- GeoPoint. sta clase representa un punto en el mapa, con su latitud y longitud. stos datos se guardan en formato de microgrados (tipo int). El constructor de la clase es: new GeoPoint(latitud,longitud) Los dos mtodos que se suelen usar para recoger la latitud y la longitud son getLatitudeE6() y getLongitudeE6().

- GeoCoder. Con GeoCoder podemos encontrar el lugar (direccin) asociado a un punto del mapa, o viceversa. El constructor de GeoCoder es: new Geocoder( Contexto ) Nosotros operaremos con GeoCoder en el sentido nombre de lugar geoposicin. Para ello usaremos el mtodo getFromLocationName(nombreLugar, maxResultados). ste mtodo devuelve una lista de direcciones asociadas al nombre que hemos dado.

Desarrollo en Android por Luis Miguel Soria

4 7

- Address. Es la clase que contiene una direccin que devuelve GeoCoder (devuelve una lista de Address). Slo usaremos de sta clase los mtodos getLatitude() y getLongitude(), que devuelve la latitud y longitud de una direccin. Aunque el objeto que contiene un Address tiene muchos ms datos pertenecientes a una direccin (pas, provincia, ciudad, cdigo postal, bloque, piso). Y todos ellos pueden ser accedidos mediante mtodos get.

- Location. Esta clase representa una localizacin en el mapa que ha sido recogida por el GPS en un tiempo determinado. Para acceder a la latitud y longitud que guarda (tipo double en grados) usaremos los mtodos getLatitude() y getLongitude(). Desde Location tambin podemos saber la altitud, la orientacin, el proveedor de la localizacin y ms datos respecto de una localizacin exacta.

- LocationListener. Es la interfaz que deberemos de implementar para poder crear y tratar eventos que provengan del GPS con actualizaciones de la posicin del usuario. Al crear la clase que implementa la interfaz, deberemos declarar los siguientes mtodos: public void onStatusChanged(String provider, int status, Bundle extras): Para ejecutar algn proceso cuando cambia el estado del GPRS. public void onProviderEnabled(String provider) : Para ejecutar algn proceso cuando se habilita el GPS. public void onProviderDisabled(String provider): Para ejecutar algn proceso cuando se deshabilita el GPS. public void onLocationChanged(Location location): Para ejecutar algn proceso cuando el GPS informa de una nueva localizacin. Nosotros slo usaremos en nuestra aplicacin el evento de cambio de localizacin. El constructor de la clase ser el constructor vaco (por defecto).

- LocationManager Es la clase que se encarga de crear una conexin con uno de los proveedores GPS de que dispongo el mvil. Para poder crear esta conexin deberemos de escribir el siguiente
Desarrollo en Android por Luis Miguel Soria

4 8

cdigo: LocationControl = (LocationManager)getSystemService(Context.LOCATION_SERVICE); LocationControl.requestLocationUpdates("gps", minTimeInMiliseconds, minMeters, LocationListener); Como vemos no creamos un objeto del tipo LocationManager con un constructor, sino que llamamos al mtodo getSystemService para que la aplicacin nos devuelve el servicio LOCATION_SERVICE. Tras esto slo debemos de crear las actualizaciones sobre el GPS y asociarlas con nuestro LocationListener. Para poder parar las actualizaciones deberemos de llamar a: LocationControl.removeUpdates(LocationListener);

- Ejercicio. GPS en la aplicacin del curso.

- Ejercicio 13: Crear el proceso de bsqueda de un lugar que ha sido escrito por el usuario en el cuadro de texto de la actividad mapa, ver el lugar en el mapa y mostrar un dilogo, para preguntar al usuario si desea aadirlo, escribiendo un nombre para el lugar. Pistas: Hay que crear un objeto del tipo Geocoder que sea pblico a la clase y un objeto lista de Address tambin pblico a la clase. Implementar el mtodo de onClick del botn de buscar y el mtodo de onKey del cuadro de texto. Debern recoger el texto escrito y pasrselo a un mtodo que buscar por el lugar. Dentro del mtodo de bsqueda, guardar los datos buscados por el objeto GeoCoder en el objeto lista Address y recoger el primer objeto Address de ella. Animar el mapa hasta la posicin del objeto Address. Configurando tambin el zoom que deseamos. Llamar a un mtodo, pasando el texto buscado, que cree el dilogo. Para que el dilogo contenga una lnea de texto, se puede aadir al dilogo un objeto EditText con el mtodo setView. Si el usuario aade el lugar, se crea un nuevo OverlayItem y se aade a la lista de lugares (refrescar el mapa tras esto).

Desarrollo en Android por Luis Miguel Soria

4 9

- Ejercicio 14: Crear la clase que implementa un Overlay de tipo amigo. Esta clase ha de extender de la clase Overlay. Pistas: La clase debe de tener los mtodos: AmigoOverlay(MapView, GeoPoint, String) getGeoPunto() getNombreAmigo() getNombreAmigo() draw(Canvas, MapView, boolean) drawAmigo(Canvas, MapView, boolean) drawNombre(Canvas, MapView, boolean) getPinturaDentro() getPinturaBorde() getPinturaTexto() onTap(GeoPint, MapView) La clase ha de contener 3 variables pblicas, una por cada parmetro de entrada del constructor. Para los mtodos de dibujado usar el siguiente cdigo (se explicarn al terminar el ejercicio).
/**Mtodo que dibuja al icono que representa al amigo * * @param canvas El lienzo donde vamos a dibujar. * @param mapa El mapa donde se va a dibujar. * @param shadow Define si queremos dibujar una sombra o no. */ private void drawAmigo(Canvas canvas, MapView mapa, boolean shadow){ //Declaramos un punto y pasamos de coordenadas a pxeles de pantalla Point puntoOverlay = new Point(); mapa.getProjection().toPixels(mGeoPunto,puntoOverlay); //Si no se dibuja la sombra if (!shadow) { //Dibujamos en el punto

amigo.

calculado el Bitmap

de la imagen

del

canvas.drawBitmap(mAmigo, puntoOverlay.x mAmigo.getWidth()/2, puntoOverlay.y - mAmigo.getHeight(),null); } } /** Mtodo que dibuja la etiqueta con el nombre del amigo. * * @param canvas El lienzo donde vamos a dibujar. * @param mapa El mapa donde se va a dibujar. * @param shadow Define si queremos dibujar una sombra o no. */ private void drawNombre(Canvas canvas, MapView mapa, boolean shadow){ //Si no se dibuja la sombra.

Desarrollo en Android por Luis Miguel Soria

5 0

if (!shadow) { //Primero determinamos la relacion pixel-pantalla con las coordenadas. Point puntoOverlay = new Point(); mapa.getProjection().toPixels(mGeoPunto,puntoOverlay); //Configuramos la ventana que mostrara el texto. int windowW = 25; int windowH = 25; //A ms largo el texto, ms longitud de etiqueta necesitaremos for(int i=0;i<mEtiqueta.length();i++) windowW+=5; //Vamos a crear el rectngulo donde ir el nombre del amigo RectF infoWindowRect = new RectF(0,0,windowW,windowH); int winOffsetX = puntoOverlay.x-windowW/2; int winOffsetY = puntoOverlay.y-windowH-mAmigo.getHeight(); infoWindowRect.offset(winOffsetX, winOffsetY); //Dibujamos el interior de la ventana. canvas.drawRoundRect(infoWindowRect, 5, 5, getPinturaDentro()); //Dibujamos el borde de la ventana. canvas.drawRoundRect(infoWindowRect, 5, 5, getPinturaBorde()); //Dibujamos el nombre del amigo. int txtOffX = 10; int txtOffY = 15; //Bibujamos el nombre de amigo dentro del rectngulo canvas.drawText(mEtiqueta, winOffsetX+txtOffX, winOffsetY+txtOffY, getPinturaTexto()); } } /**Mtodo que devuelve el interior de un rectngulo * * @return El relleno del rectngulo */ public Paint getPinturaDentro() { Paint pinturaDentro = new Paint(); pinturaDentro.setARGB(225, 75, 75, 75); pinturaDentro.setAntiAlias(true); return pinturaDentro; } /** Mtodo que devuelve el borde del rectngulo * * @return El borde del rectngulo */ public Paint getPinturaBorde() { Paint pinturaBorde = new Paint(); pinturaBorde.setARGB(255, 255, 255, 255); pinturaBorde.setAntiAlias(true); pinturaBorde.setStyle(Style.STROKE); pinturaBorde.setStrokeWidth(2); return pinturaBorde; } //gray

Desarrollo en Android por Luis Miguel Soria

5 1

/** Mtodo que devuelve el estilo * * @return El estilo del texto */ public Paint getPinturaTexto() {

de la letra

para el texto

Paint pinturaTexto = new Paint(); pinturaTexto.setARGB(255, 255, 255, pinturaTexto.setAntiAlias(true); return pinturaTexto; }

255);

En el mtodo draw habr que llamar a los mtodos drawAmigo, drawNombre. En el mtodo onTap copiar el siguiente cdigo y rellenarlo creando un dilogo de tipo AlertDialog que nes de dos opciones, para enviar un correo o para borrar el amigo.
/**Mtodo obligatorio de implementar en la clase. Implementa el evento pulsacin sobre el Overlay del mapa. * * @param point Punto pulsado. * @param mapa El mapa al que pertenece el Overlay. */ @Override public boolean onTap(GeoPoint point, final MapView mapa) { de

al punto

final List<Overlay> overlays = mapa.getOverlays(); boolean encontrado = false; int index = 0; //Creamos el punto pulsado y la zona a pulsar. Adems le asignamos pulsado //la proyeccion del Geopunto que se pulso en la pantalla. RectF zonaParaPulsar; Point puntoPulsado = new Point(); mapa.getProjection().toPixels(point, puntoPulsado); Point puntoDeOverlay = new Point();

//mientras no encontremos el punto y haya puntos que comrpobar while(!encontrado && index<overlays.size()){ //Definimos el tamao del rectangulo de la chincheta. zonaParaPulsar = new RectF(); zonaParaPulsar.set(-mAmigo.getWidth()/2,mAmigo.getHeight(),mAmigo.getWidth()/2,0); try { //RELLENAR AQU CON EL ALERTDIALOG. } catch(Exception exc) { //NADA } index++; } return false; }

Desarrollo en Android por Luis Miguel Soria

5 2

- Ejercicio 15: Crear los objetos necesarios para usar el gps del mvil (objetos de tipo location). Pistas: Primero, hay que crear una clase que implemente la interfaz LocationListener. Esta clase contendr los mtodos onStatusChanged(String, int, Bundle), onProviderEnabled(String), onProviderDisabled(String) y onLocationChanged(Location). Slo hay que implementar el funcionamiento de onLocationChanged(Location). Para ello debemos crear una variable pblica que guarde localizaciones (de tipo Location). En el mtodo hay que comprobar si la localizacin ha sobrepasado una distancia que elijamos y entonces asignar la nueva localizacin a nuestra variable pblica. Segundo, crear variables pblicas para los objetos del tipo LocationListener y LocationManager. Crear los eventos de actualizacin de GPS con el mtodo requestLocationUpdates del objeto LocationManager.

Desarrollo en Android por Luis Miguel Soria

5 3

- BasesdedatosenAndroid.

- Creacin de una base de datos.


Las bases de datos en Android se basan en el sistema SQLite3, y para poder crear una base de datos en Android tenemos que crear una clase para ello. Esta clase tendr que implementar el funcionamiento de las clases SQLiteOpenHelper y SQLiteDatabase. La primera clase se usa para administrar la base de datos, y podramos decir que la segunda clase es la base de datos en s. Por lo tanto lo primero que tiene que tener una clase para funcionar como base de datos, es la implementacion de SQLiteOpenHelper. Para ello hemos de declarar la siguiente clase privada.
private static class DataBaseHelper extends SQLiteOpenHelper{ DataBaseHelper(Context context) { super(Contexto, NOMBRE_BASEDATOS, null, VERSION_BASEDATOS); } @Override public void onCreate(SQLiteDatabase db) { CREACION DE TABLAS } @Override public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) { BORRADO DE LAS TABLAS onCreate(db); } } VACAS

Los mtodos de la clase creada tienen las siguientes funcionalidades: DataBaseHelper: Constructor de la clase al que se le pasa el contexto donde se va a usar la base de datos. Se llama al constructor de la clase padre pasando el contexto, el nombre de la base de datos y la versin de la base de datos. OnCreate: ste mtodo es llamado cuando se ejecuta el constructor de la clase. Aqu debemos de crear las tablas de la base de datos. El parmetro de entrada es la base de datos, tendremos que usar el mtodo execSQL( sentenciaSQL ) propio del objeto tipo SQLiteDataBase para aadirle las tablas. OnUpgrade: ste mtodo es llamado si, al ejecutar el constructor de la clase, la versin de la base de datos guardada en disco, es anterior a la versin de la base de datos que contiene la aplicacin.- Se llama al borrado de tablas usando de nuevo execSQL ( sentenciaSQL ) y se llama a onCreate para crear las nuevas tablas vacas.
Desarrollo en Android por Luis Miguel Soria

5 4

Segundo, el constructor de nuestra clase slo necesitar como parmetro de entrada el contexto de la actividad que vamos a usar. La clase tendr una variable pblica para SQLiteOpenHelper(DataBaseHelper) y otra para SQLiteDatabase. Tercero, hay que implementar un mtodo que abrir la base de datos para ser accedida, dentro de ste mtodo tendremos que inicializar el objeto SQLiteOpenHelper y tras esto llamar al mtodo getWritableDatabase de ese objeto para crear el objeto tipo SQLiteDatabase. Tambin hay que implementar un mtodo de cierre, que llame al mtodo close del objeto tipo SQLiteOpenHelper. Cuarto, crear todos los mtodos necesarios para la administracin de la base de datos. Para ello, la clase SQLiteDataBase nos da una series de mtodos que listamos a continuacin: insert( String table, null, ContentValues valores). update(String table, ContentValues values, String whereClause, String[] whereArgs ) query( String table, String[] columns, String selectionArgs, String groupBy, String having, String orderBy )

Para los mtodos insert y update los valores devueltos sern booleanos con el resultado de la operacin (xito o fallo). El mtodo query devolver un objeto del tipo Cursor que contendr los datos sacados de la consulta, esta clase funciona como un iterador que recorre la lista de elementos que cumplan con la consulta. La case ContentValues, es una clase contenedora, para poder introducir los pares cdigoColumna y valorColumna, para aadir un par usaremos el mtodo put( cdigo, valor). Lo normal, es crear mtodos, dentro de nuestra clase para la base de datos, que tengan como entrada los parmetros sobre los que trabajaremos en la base de datos y que retornen el resultado de cada uno de los mtodos listados anteriormente, como ejemplo, vemos el caso de un mtodo que usa el insert: public boolean nuevoLugar(String usuario, String nombreLugar, int latitud, int longitud){ ContentValues valoresIniciales = new ContentValues(); valoresIniciales.put(CLAVE_NOMBRE_LUGAR, nombreLugar); valoresIniciales.put(CLAVE_LATITUD, latitud); valoresIniciales.put(CLAVE_LONGITUD, longitud); valoresIniciales.put(CLAVE_USUARIO, usuario); return mBd.insert(TABLA_LUGARES, null, valoresIniciales)>0; } Como podemos ver, hemos usado la clase ContentValues para agregar las parejas columna-valor, y tras ello realizamos el insert en la base de datos, retornando si el resultado si el resultado ha sido > 0 (el insert se ha realizado correctamente).

Desarrollo en Android por Luis Miguel Soria

5 5

- Uso de bases de datos.


Para poder usar nuestra base de datos en cualquier clase debemos de seguir un proceso fijo que se explica a continuacin: 1. Creamos el objeto de nuestra base de datos. 2. Llamamos a su mtodo abre. 3. Con la base de datos abierta, trabajamos sobre ella (operaciones insert, update, query, etc.). Si vamos a realizar una operacin query debemos de crear un objeto Cursor que guarde el resultado de dicho query. Un objeto Cursor guarda los datos de una query y tiene los siguientes mtodos para trabajar con l: 1. getCount(): Con ste mtodo podemos saber cuntas filas de la base de datos nos han sido devueltas. 2. moveToFirst(): Mtodo que hay que llamar siempre, antes de empezar a recorrer el cursor por filas 3. getTiPo(int columna): Mtodo que te devuelve la columna i con el tipo Tipo. 4. close(): Mtodo que hay que llamar cuando se acaba de trabajar sobre un cursor. 4. El ltimo paso es cerrar la base de datos, llamando al mtodo que hayamos creado para tal caso.

- Ejercicio. Base de datos de la aplicacin del curso. Finalizando la aplicacin.

- Ejercicio 16: Crear la clase que implemente nuestra base de datos local. Pistas: Vamos a usar las siguientes constantes que contienen las declaraciones de creacin de tabla y de claves de columnas.
/** * Constantes que nos ayudarn en el uso de la BD. */ private static final String NOMBRE_BASEDATOS = "baseDatosCurso"; private static final int VERSION_BASEDATOS = 4; private static final String CREAR_TABLA_USUARIOS = "create table tablaUsuarios (usuario text primary key not null, password text not null);";

Desarrollo en Android por Luis Miguel Soria

5 6

private static final String CREAR_TABLA_OPCIONES = "create table tablaOpciones (usuario text primary key not null, vistaSatelite integer not null, " + "radioAmigos integer not null, tiempoActualizacion integer not null);"; private static final String CREAR_TABLA_LUGARES = "create table tablaLugares (nombre text primary key not null, latitud integer not null, longitud integer not null," + "usuario text not null);"; private static final String TABLA_USUARIOS = "tablaUsuarios"; private static final String TABLA_OPCIONES = "tablaOpciones"; private static final String TABLA_LUGARES = "tablaLugares"; public static final String CLAVE_USUARIO = "usuario"; public static final String CLAVE_PASSWORD = "password"; public static final String CLAVE_VISTA = "vistaSatelite"; public static final String CLAVE_RADIO = "radioAmigos"; public static final String CLAVE_TIEMPO_ACTUALIZACION = "tiempoActualizacion"; public static final String CLAVE_NOMBRE_LUGAR = "nombre"; public static final String CLAVE_LATITUD = "latitud"; public static final String CLAVE_LONGITUD = "longitud";

Necesitaremos 3 variables pblicas, una para la clase que extienda a SQLiteOpenHelper, otra para la clase SQLiteDatabase y una ltima para el contexto de la actividad que usar la base de datos. Hay que crear una clase privada dentro de nuestra clase de la base de datos. sta clase extender a SQLiteOpenHelper y contendr los mtodos: DataBaseHelper(Context): constructor de la clase. onCreate(SQLiteDatabase): mtodo que crea la base de datos. Hay que crear cada una de las tablas. onUpgrade(SQLiteDataBase,int, int): mtodo que se ejecuta si el programa tiene una nueva versin de la base de datos con respecto a la guardada en el mvil. Hay que borrar todas las tablas y llamar a onCreate. El constructor de la clase slo se encargar de guardar el contexto de la actividad que use la base de datos. Crear los mtodos para abrir y cerrar la base de datos. Crear mtodos para poder acceder a las tablas, insertar datos nuevos y editar datos ya existentes.

- Ejercicio 17; Completar la actividad de presentacin de la aplicacin, cambiando la lgica del dilogo que se muestra al pulsar sobre el botn entrar. Hay que comprobar que el usuario introducido es el correcto, para ello debemos acceder al servidor SOAP y a la base de datos local. Pistas: Si, desde el ejercicio 5, al pulsar el botn de aceptar en el dilogo de la actividad de presentacin, entrbamos directamente en la actividad del mapa. Ahora

Desarrollo en Android por Luis Miguel Soria

5 7

tenemos que comprobar el usuario con el servidor y con nuestra base de datos. Para ello nos basaremos en el siguiente cdigo (Copiar al proyecto):
/** 17 * Mtodo que comprueba si existe el usuario en el servidor y si no lo aade. Tras saber que el usuario * est en el servidor, arranca la actividad del mapa pasndole el usuario y password del usuario de la aplicacin. * * @param usuario * @param password */ private void compruebaUsuario(String usuario, String password){ datos. //Vamos a cargar las opciones para este usuario, desde la base de

//Si el usario no existiera en el servidor, lo crearamos. int resultado = mConSOAP.checkUser(usuario, password); switch(resultado){ //Si el usuario existe en el servidor. case 1: Toast.makeText(AplicacionCurso.this, "Acceso correcto! Abriendo el mapa...", Toast.LENGTH_SHORT).show(); //Abrimos la actividad del mapa. conectaActividadMapa(usuario, password); break; //Si el usuario no existe en el servidor. case -2: Toast.makeText(AplicacionCurso.this, "El usuario no existe, se aadir al servidor y se cargarn valores por defecto en la aplicacin", Toast.LENGTH_SHORT).show(); //Aadimos el usuario en el servidor resultado = mConSOAP.addUser(usuario, password); if(resultado<1){ //Error al intentar aadir el usuario. Toast.makeText(AplicacionCurso.this, "Error en el acceso al servidor, intntelo de nuevo.", Toast.LENGTH_SHORT).show(); } else{ //Se ha aadido el usuario al servidor, abrimos la actividad del mapa. conectaActividadMapa(usuario, password); } break; //Si la contrasea de usuario es incorrecta case -3: Toast.makeText(AplicacionCurso.this, "Contrasea incorrecta! Introduzcala de nuevo.", Toast.LENGTH_SHORT).show(); break; //Error al acceder al servidor case -1: Toast.makeText(AplicacionCurso.this, "Error servidor, intntelo de nuevo.",

en el acceso

al

Desarrollo en Android por Luis Miguel Soria

5 8

break; } }

Toast.LENGTH_SHORT).show();

/** 17 * Mtodo que comprueba que el usuario tiene una cuenta en local. Si no la tiene le carga los valores de opciones * por defecto. * * @param usuario Usuario de la aplicacin. * @param password Contrasea del usuario. */ private void conectaActividadMapa(String usuario, String password){ }

Crear una variable pblica del tipo ConectaSoap para poder conectarnos al servidor y que se usar en los mtodos antes mencionados. Rellenar el cdigo del mtodo conectaActividadMapa con el acceso a la base de datos para comprobar el usuario y si la comprobacin es correcta, lanzar la actividad llamando al mtodo lanzaActividad que ya tenamos creado.

- Ejercicio 18: Crear en la clase de la actividad mapa una variable pblica del tipo ConectaSoap. En el evento onOptionsItemSelected llamar, en el caso de haber pulsado el botn de aadir amigo, al mtodo muestraDialogoAmigoNuevo. Crear el mtodo muestraDialogoAmigoNuevo que muestra un dilogo del tipo AlertDialog con un EditText en l, el dilogo dar la opcin de aadir el amigo. Aadir el amigo al nombre de usuario en el servidor. Pistas: Para el caso del botn de aceptar del dilogo, copiar el siguiente cdigo:
//Creamos el evento de pulsacin del botn aceptar. constructor.setPositiveButton(R.string.aceptar, new DialogInterface.OnClickListener() { public void onClick(DialogInterface dialog, int which) {

if(editAmigo.getText().length()>0){ int resultado = mConSOAP.addFriend(mUsuario, mPassword, editAmigo.getText().toString()); //Devuelve 1 si la operacin se ha realizado correctamente, -4 si el nombre de amigo es igual al nuestro, // -5 si el amigo ya existe, en otro caso se ha producido un error en la operacion. switch(resultado){ case 1: Toast.makeText(ActividadMapa.this, R.string.amigoExito, Toast.LENGTH_SHORT).show(); break; case -4:

Desarrollo en Android por Luis Miguel Soria

5 9

Toast.makeText(ActividadMapa.this, R.string.nomAmigoIgual, Toast.LENGTH_SHORT).show(); break; case -5: Toast.makeText(ActividadMapa.this, R.string.amigoYaExiste, Toast.LENGTH_SHORT).show(); break; default: Toast.makeText(ActividadMapa.this, R.string.falloOperacion, Toast.LENGTH_SHORT).show(); break; } dialog.dismiss(); } else{ Toast.makeText(ActividadMapa.this, "Escribe un nombre de usuario", Toast.LENGTH_SHORT).show(); } } });

- Ejercicio 19: Rellenar el mtodo onActivityResult. Comprobar los datos que nos devuelve la actividad lista y, si ha habido cambios,guardarlos en la base de datos. Pista: Recordar que si se ha borrado la lista de lugares no hay que aadir la lista a los overlays del mapa.

- Ejercicio 20: Crear el cdigo necesario para que cuando se pulse el botn de cambio de bsqueda se cambie el tipo de bsqueda entre amigo y lugar. Pista: Crear variable pblica booleana que marque si estamos buscando un lugar o un amigo. Comprobar la variable cada vez que se busque un texto en la barra de bsqueda. Falta por implementar el mtodo que busca en los overlays de amigo. Usar un ListIterator para recorrer los overlays del mapa y el mtodo getClass para reconocer el tipo del overlay.

- Ejercicio 21: Crear el cdigo para poder borrar y agregar lugares usando la base de datos de la

Desarrollo en Android por Luis Miguel Soria

6 0

aplicacin. Pista: Al abrir la actividad mapa hay que comprobar los lugares guardados en la base de datos y aadirlos al mapa. En el mtodo onActivityResult si se resetea la lista de lugares, hacerlo tambin en la base de datos. Al aadir un lugar al mapa lo aadimos tambin a la base de datos. Crear un mtodo en la clase base de datos para recoger los lugares que tenga guardados.

- Ejercicio 22:

Crear una clase privada a la clase de la actividad mapa que extienda de Thread y que implemente la bsuqeda de amigos en el servidor, aadindolos al mapa. Pista: Crear un objeto manejador Handler pblico a la clase mapa, para ejecutar cdigo en el hilo principal desde el hilo que lo llame. Crear ste hilo cuando se pulse sobre buscar amigos en el men. Copiar el siguiente cdigo para el mtodo run de la clase tipo hilo y rellenar la parte que falta de los accesos al mapa.
/** * Mtodo */ que se ejecuta al llamar a start() en el objeto hilo.

public void run(){ //Aadimos los otros overlays que haba en el mapa. mediante un manejador, para poder //acceder desde este hilo al principal. mManejador.post(new Runnable() { public void run() //RELLENAR } }); //Vamos a recoger los amigos del servidor SOAP final ArrayList<String> amigos; if(mRadioAmigos>0) amigos = mConSOAP.getFriendsByDistance(mUsuario, mPassword, mRadioAmigos); else amigos = mConSOAP.getFriends(mUsuario, mPassword); String amigo; GeoPoint g; //Recorremos los amigos si tenemos la visibilidad activada. { Lo hacemos

recogidos del servidor y los aadimos

Desarrollo en Android por Luis Miguel Soria

6 1

for(int i=0;i<amigos.size();i=i+2){ //RELLENAR } }

- Ejercicio 23: Agregar un timer que ejecute un proceso de bsqueda de usuario cada cierto tiempo. Pista: Usar la clase Runnable para crear el proceso a ejecutar (nueva variable pblica de tipo Runnable). El proceso ser el mismo que el del ejercicio 22. Para ejecutar el objeto Runnable como si fuera un timer, necesitares llamarlo con el manejador que creamos en el ejercicio 22, usar el mtodo postDelayed marcando el tiempo que queremos que espere. Hay que devolver en la actividad lista, cuando se salvan las opciones en ella, el intervalo en el que se ejecutar dicho timer. Al lanzar la actividad lista, habr que eliminar el timer con el mtodo removeCallBack en el Handler. Hacemos lo mismo cada vez que se llame al hilo de buscar amigos, al final del proceso del hilo se volver a crear. Para completar el cdigo de la aplicacin copiar el siguiente cdigo en la clase que recibe los eventos del LocationListener:
//23 Guardamos la posicin en el servidor SOAP. mLocalAnterior50m = location; Double latitud = location.getLatitude()*1000000; Double longitud = location.getLongitude()*1000000; if(mConSOAP.addUserLocation(mUsuario, mPassword, latitud.intValue(), longitud.intValue())<0) Toast.makeText(ActividadMapa.this, "Problema al subir la posicin actual al servidor.", Toast.LENGTH_SHORT);

Agregar tambin, estos dos mtodos a la clase de la actividad mapa.


/**23 Mtodo que devuelve el usuario de la aplicacin. * * @return El usuario que est usando la actividad en el momento. */ public static String getUsuario(){ return mUsuario; }

Desarrollo en Android por Luis Miguel Soria

6 2

/**23 Mtodo que devuelve la contrasea del usuario de la aplicacin. * * @return El password del usuario que est usando la actividad en el momento. */ public static String getPassword(){ return mPassword; }

- Ejercicio 24: Acabar la clase de la actividad lista con la conexin al servidor para cambiar el usuario, cuando el usuario pulse sobre dicha opcin en la lista. Pista: Rellenar el mtodo onClick del evento del botn aceptar del dilogo para cambiar el usuario.

- Ejercicio 25: Copiar el siguiente mtodo en la actividad mapa.


/**25 Mtodo que se ejecuta cuando cerramos la aplicacin. * */ protected void onDestroy() { mMapa.destroyDrawingCache(); mMapOverlays.clear(); mMiPosicion.disableMyLocation(); mLocationControl.removeUpdates(mLocationListener); mManejador.removeCallbacks(mUpdateTimeTask); super.onDestroy(); }

Desarrollo en Android por Luis Miguel Soria

6 3

- Extra1:ElsimuladordeGPSycmocrearrutasparal.
El simulador de GPS es una de las funcionalidades ms importantes del SDK de Android, nos permite comunicar localizaciones al mvil, como de un GPS se tratara. Para usar el simulador de GPS, debemos de ir, en Eclipse, a la vista del DDSM, y en l buscar la pestaa de Emulator control y en ella buscar la pestaa kml. En esta pestaa aadiremos el archivo que deseemos y podremos dirigirnos a las localizaciones que se nos carguen clickeando sobre ellas o pulsando sobre el botn play. Aqu se explicar cmo usar archivos kml. Para crear rutas en archivos kml usaremos Google Earth. En l usando la funcionalidad de Directions podemos crear una ruta desde un punto a otro. Cuando el programa cree la ruta, pulsamos sobre Route y la salvamos con extensin kml. ste archivo kml no es compatible con el emulador de Android. Hay que transformarlo en uno compatible, para ello, abrimos la web http://ge2adt.appspot.com/ en el navegador y tras introducir nuestro usuario de Google, le pasamos el archivo kml de Google Earth. El archivo resultante ser un archivo compatible con el emulador de Android.

- Extra2:Configurarregionesparaelfuncionamientodel simuladorGPS.
Para que el simulador GPS funcione correctamente deberemos de configurar Eclipse para la localizacin americana. Aadiremos en el fichero Eclipse.ini de la carpeta de Eclipse el comando Duser.language=en. Arrancando Eclipse con esta configuracin no deberamos de tener ms problemas, pero si los tuviramos nos aseguraremos de que el emulador est configurado en la regin americana y como tambin lo est en el tiempo americano.

Desarrollo en Android por Luis Miguel Soria

6 4

Anda mungkin juga menyukai