Está en la página 1de 16

Conectividad y Google Maps Prof.

Antonio Garca Cabot

Conectividad y Google Maps

Acceso a recursos de red y mapas con Google Maps

1 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

Tabla de contenidos
ACCESO A LOS RECURSOS DE RED.............................................................. 3 GOOGLE MAPS API V2 ..................................................................................... 8 OBTENER LA CLAVE .............................................................................................. 8 AGREGAR LA CLAVE Y PERMISOS AL PROYECTO ................................................... 10 AADIR UN MAPA ................................................................................................ 11 EJERCICIO FINAL PROPUESTO .................................................................... 16

2 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

Acceso a los recursos de red


En este primer ejemplo vamos a ver cmo acceder a recursos de red mediante peticiones HTTP y posterior tratamiento de la respuesta en formato JSON. Creamos un nuevo proyecto: ConectividadGMaps. A la hora de seleccionar la versin de Android para crear el proyecto debemos seleccionar Google APIs, por ejemplo API 17.

Reutilizamos el archivo layout que nos haya creado por defecto el proyecto, estar dentro de la carpeta res/layout, llamado, por ejemplo activity_main.xml. Una vez abierto este archivo vamos a dejar el TextView que viene por defecto y creamos un EditText y un Button. El texto del botn lo cambiamos a Aceptar. Cambiamos tambin la etiqueta del TextView. Ambas cadenas de texto deben ir en el fichero res/values/strings.xml. Por lo tanto el fichero tendr la siguiente forma:

<?xml version="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" >


3 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

<TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/texto" /> <EditText android:id="@!id/edit"ext1" android:layout_width="fill_parent" android:layout_height="wrap_content" /> < utton android:id="@!id/#utton1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/aceptar" /> </LinearLayout>
A continuacin creamos una variable de tipo EditText, dentro del activity creado por defecto al crear el proyecto, esto nos permitir recoger lo que introduce el usuario:

EditText cam!o"
Despus, en ese mismo activity, dentro del mtodo onCreate, localizamos el editText con el mtodo de findViewById.

cam!o = #EditText$%indView y&d#'(id(edit"ext1$"


Ahora asignamos un OnClickListener al botn para asignarle una funcionalidad.

utton )oton = # utton$%indView y&d#'(id(#utton1$" )oton(set*n+lic,Listener#new *n+lic,Listener#$ .*verride public void on+lic,#View arg/$ 0 0$"
Vamos a crear un mtodo llamado buscar() que nos devolver unas coordenadas. A este mtodo le vamos a pasar por parmetro el contenido del editText.

double12 coordenadas=)uscar#cam!o(getText#$(to3tring#$$"

4 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot Lo que va a hacer nuestra aplicacin buscar en un servicio de Internet (un servicio de Google Maps) lo que el usuario haya introducido en el cuadro de texto. Este servicio devolver los resultados encontrados con diferentes datos, entre ellos las coordenadas. Posteriormente utilizaremos estas coordenadas para ubicarlas sobre un MapView (un componente de Google Maps para Android). A continuacin implementamos el contenido del mtodo buscar(), fuera del evento onCreate().

public double12 )uscar#3tring )us4ueda$ double12 coordenadas = new double152" 3tring !eticion6TT78 = 9htt!://ma!s(googlea!is(com/ma!s/a!i/geocode/:son?address=9" 3tring !eticion6TT75 = ;sensor=%alse9" 3tring !eticion6TT7 = !eticion6TT78 < )us4ueda < !eticion6TT75" 0
En este primer paso del mtodo buscar, lo que hacemos es crear un array de tamao dos, de tipo double para almacenar las coordenadas. En segundo lugar creamos mediante unos String la cadena de conexin (URL) al servicio de Internet. En el ejemplo estamos realizando una consulta a un servicio de Google Maps, de forma que en la URL vaya lo que el usuario ha introducido en el EditText. Lo siguiente que debemos hacer es filtrar la URL para evitar que el usuario haya introducido espacios ( ) que no tienen un buen comportamiento en con las URLs. Para ello vamos a pasar la cadena peticionHTTP por un mtodo que nos sustituir estos caracteres en caso de haberlos.

!eticion6TT7 = eliminarEs!acios#!eticion6TT7$"
Implementamos el mtodo eliminarEspacios:

public 3tring eliminarEs!acios#3tring reem!la=ar$ //'eem!la=a los es!acios !ara con%ormar la >'L return reem!la=ar(re!lace#9 9? 9@5/9$" 0
Este mtodo sustituir los caracteres en blanco por %20 que simboliza lo mismo pero permite construir correctamente la URL. Siguiendo en el mtodo buscar, implementamos la peticin HTTP, todo ello con try-catch, para capturar posibles excepciones de red. Con ello conseguimos enviar la peticin y leer la respuesta del servidor, en JSON:

try
5 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

6tt!+lient client = new Ae%ault6tt!+lient#$" 6tt!Bet re4uest = new 6tt!Bet#$" re4uest(set>'&#new >'&#!eticion6TT7$$" 6tt!'es!onse res!onse = client(execute#re4uest$" u%%ered'eader in = new u%%ered'eader#new &n!ut3tream'eader#res!onse(getEntity#$(get+ontent#$$$" 3tring u%%er s) = new 3tring u%%er#99$" 3tring lineaLeida = 99" while ##lineaLeida = in(readLine#$$ C= null$ s)(a!!end#lineaLeida$" 0 in(close#$" 3ystem(out(!rintln#s)(to3tring#$$" 0 catch #Exce!tion e$ e(!rint3tac,Trace#$" 0
La setencia System.out.println nos permitir ver por la consola de Eclipse la respuesta del servidor, que en este caso ser la cadena JSON sin tratar. A continuacin tratamos mediante JSON la respuesta recibida, para obtener las coordenadas (latitud y longitud). Tambin se pueden obtener otros datos como nombre, descripcin, etc. esto depende del servicio y/o servidor que estemos invocando.

D3*E*):ect :son*):ect = new D3*E*):ect#s)(to3tring#$$" 3tring res! = :son*):ect(get3tring#9status9$" if #res!(e4uals#9*F9$$ D3*EGrray array = :son*):ect(getD3*EGrray#9results9$" D3*E*):ect item = array(getD3*E*):ect#/$" D3*E*):ect !oint = item(getD3*E*):ect#9geometry9$(getD3*E*):ect#9location9$" coordenadas1/2 = !oint(getAou)le#9lat9$" coordenadas182 = !oint(getAou)le#9lng9$" 3ystem(out(!rintln#9Longitud: 9<coordenadas1/2<9 H Latitud: 9<coordenadas182$"

6 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

0
Una vez hecho esto, solo nos queda devolver el resultado en el mtodo buscar().

return coordenadas"
Por ltimo, debemos aadir los permisos necesarios de acceso a Internet. Para ello utilizamos el archivo AndroidManifest.xml. Aadimos la siguiente sentencia, antes del nodo Application.

<usesH!ermission android:name="android.permission.$%"&'%&"" />


Una vez hecho esto podemos probar la aplicacin y ver el resultado de la ejecucin. A modo de resumen, podemos ver cmo ha debido de quedar el mtodo buscar().

public double12 )uscar#3tring )us4ueda$ double12 coordenadas = new double152" 3tring !eticion6TT78 = 9htt!://ma!s(googlea!is(com/ma!s/a!i/geocode/:son?address=9" 3tring !eticion6TT75 = 9;sensor=%alse9" 3tring !eticion6TT7 = !eticion6TT78 < )us4ueda < !eticion6TT75" !eticion6TT7 = eliminarEs!acios#!eticion6TT7$" try 6tt!+lient client = new Ae%ault6tt!+lient#$" 6tt!Bet re4uest = new 6tt!Bet#$" re4uest(set>'&#new >'&#!eticion6TT7$$" 6tt!'es!onse res!onse = client(execute#re4uest$" u%%ered'eader in = new u%%ered'eader#new &n!ut3tream'eader#res!onse(getEntity#$(get+ontent#$$$" 3tring u%%er s) = new 3tring u%%er#99$" 3tring lineaLeida = 99" while ##lineaLeida = in(readLine#$$ C= null$ s)(a!!end#lineaLeida$" 0 in(close#$" 3ystem(out(!rintln#s)(to3tring#$$"

7 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

D3*E*):ect :son*):ect = new D3*E*):ect#s)(to3tring#$$" 3tring res! = :son*):ect(get3tring#9status9$" if #res!(e4uals#9*F9$$ D3*EGrray array = :son*):ect(getD3*EGrray#9results9$" D3*E*):ect item = array(getD3*E*):ect#/$" D3*E*):ect !oint = item(getD3*E*):ect#9geometry9$(getD3*E*):ect#9location9$" coordenadas1/2 = !oint(getAou)le#9lat9$" coordenadas182 = !oint(getAou)le#9lng9$" 3ystem(out(!rintln#9Longitud: 9<coordenadas1/2<9 H Latitud: 9<coordenadas182$" 0 0 catch #Exce!tion e$ e(!rint3tac,Trace#$" 0 return coordenadas" 0

Google Maps API v2


Con la nueva versin de Google Maps API v2 podremos integrar mapas en nuestra aplicacin Android. Es importante destacar en este punto que es recomendable realizar estos ejemplos con la ltima versin del API de Android disponible ya que hay componentes que se van a utilizar slo estn disponibles a partir de la versin 3.0.

Obtener la clave
En primer lugar necesitamos la huella de nuestro certificado de desarrollo para poder obtener una clave de Google Maps. Para esto ejecutamos el siguiente comando en la lnea de comandos: keytool -list -v -keystore "C:\Users\your_user_name\.android\debug.keystore" alias androiddebugkey -storepass android -keypass android

8 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot Ajustando el directorio con el nombre del usuario. Keytool es un comando del JDK de Java por lo que deber estar bien configurado la variable de entorno path. Tendremos que copiar la cadena que se muestra con el nombre SHA1 y ser del estilo: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75 Una vez tengamos esta cadena vamos a ir al sitio web de Google API Console a travs del siguiente enlace https://code.google.com/apis/console/ Si es la primera vez nos aparecer la opcin de Create Project en la que pincharemos, una vez hecho esto nos aparecer un listado de APIs de Google disponibles. Si no es la primera vez que accedemos a este sitio web nos aparecer directamente este listado. Si el listado no aparecera, podemos pinchar sobre la opcin Services del men de la izquierda e iremos a este listado. En el listado debemos activar la opcin (poner en ON) el servicio Google Maps Android API v2. Una vez hecho esto vamos a la opcin API Access del men de la izquierda y pinchamos sobre Create new Android key En la ventana que nos aparecer deberemos introducir la cadena SHA1 que hemos obtenido previamente seguido de un punto y coma ; y el paquete de nuestro proyecto Android. Por ejemplo: BB:0D:AC:74:D3:21:E1:43:07:71:9B:62:90:AF:A1:66:6E:44:5D:75;com.example. sesion2gmaps

Finalmente pinchamos sobre el botn Create.

9 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot Si todo el proceso ha ido correctamente nos aparecer una nueva key para Android, en este caso para Google Maps. La parte que nos interesa es la clave que aparece en el campo API Key.

Agregar la clave y permisos al proyecto


A continuacin debemos agregar esta API Key a nuestro proyecto. Para ello vamos a agregar la siguiente etiqueta en el AndroidManifest.xml, como hijo de la etiqueta application.

<metaHdata android:name="com.google.android.maps.v(.)*$_+&," android:value="-our_api_ke-"/>


Indicando la clave que hemos obtenido en el paso anterior en el atributo android:value. Lo siguiente que debemos hacer es agregar los siguientes permisos tambin al AndroidManifest.xml. Sustituyendo el paquete com.example.mapdemo por el paquete que estemos usando en el proyecto.

<!ermission android:name="com.example.mapdemo.permission..)*/_'&0&$1&" android:!rotectionLevel="signature"/> <usesH!ermission android:name="com.example.mapdemo.permission..)*/_'&0&$1&"/>


Y adems los siguientes permisos:

<usesH!ermission android:name="android.permission.$%"&'%&""/> <usesH!ermission android:name="android.permission.2'$"&_&3"&'%)4_/"5')6&"/> <usesH!ermission android:name="com.google.android.providers.gsf.permission.'& )7_6/&'1$0&/"/> <usesH!ermission android:name="android.permission.)00&//_05)'/&_450)"$5%"/> <usesH!ermission android:name="android.permission.)00&//_8$%&_450)"$5%"/>
Ms informacin sobre estos permisos en https://developers.google.com/maps/documentation/android/start#installing_the_ google_maps_android_v2_api Por ltimo, como hijo de la etiqueta manifest debemos indicar que es requisito OpenGL v2 para ejecutar la aplicacin, ya que la nueva versin de Google Maps utiliza este motor.

<usesH%eature
10 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

android:glEsVersion="0x000(0000" android:re4uired="true"/>

Aadir un mapa
En este punto debemos asegurarnos que Google Play services est instalado, para comprobarlo podemos acceder al SDK Manager y verificarlo en la pestaa de extras. En caso de no estar instalado, debemos instalarlo para seguir con los siguientes pasos. Una vez instalado debemos importar la librera de Google Play services a Eclipse para ello: Click en File -> Import..., seleccionamos Android -> Existing Android Code into Workspace. Buscamos el proyecto, que deber instalar instalado en: <android-sdk-folder>/extras/google/google_play_services/libproject/google-playservices_lib Y lo seleccionamos. Una vez aadido a Eclipse debemos aadirlo como librera al proyecto con el que estemos trabajando. Para esto vamos a Project -> Properties -> Android -> Library, Add -> google-play-services_lib Una vez hechos estos pasos vamos a crear un nuevo layout y un nuevo activity, o bien podemos utilizar los creados en un nuevo proyecto por defecto. En el layout indicamos lo siguiente:

<?xml version="1.0" encoding="utf-8"?> <%ragment xmlns:android="http://schemas.android.com/apk/res/android" android:id="@!id/map" android:layout_width="match_parent" android:layout_height="match_parent" class="com.google.android.gms.maps./upport.ap8ragment"/>


Este fragment nos permitir mostrar el mapa. Un fragment en Android (se introdujeron apartir de la versin 3.0) es como una regin de un activity, de forma que se pueden reutilizar, etc. En el activity indicamos lo siguiente:

package com(exam!le(sesion5gma!s" import android(os( undle" import android(su!!ort(vI(a!!(JragmentGctivity" public class Ka!aGctivity extends JragmentGctivity -

11 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

.*verride public void on+reate# undle saved&nstance3tate$ su!er(on+reate#saved&nstance3tate$" set+ontentView#'(layout(mapa$" 0 0


Llegamos a este punto ya podemos probar la aplicacin. Nos deber mostrar un mapa pero sin ningn tipo de contenido. Si no se muestra nada entonces debemos revisar los pasos anteriores. Siguiendo con el ejemplo comenzado para solicitar recursos de red, ahora vamos a mostrar los resultados obtenidos sobre el mapa que hemos creado, para ello vamos a aadir el siguiente fragmento de cdigo dentro del botn del primer activity creado. Justo debajo de invocar el mtodo buscar().

&ntent intent = new &ntent#$" intent(set+lass#get ase+ontext#$? Ka!aGctivity(class$" intent(!utExtra#9latitud9? coordenadas182$" intent(!utExtra#9longitud9? coordenadas1/2$" intent(!utExtra#9nom)re9? cam!o(getText#$(to3tring#$$" startGctivity#intent$"
De esta forma estaremos pasando al activity del mapa y le pasaremos por parmetro las coordenadas buscadas, latitud y longitud. Tambin estaremos pasando el nombre que introdujo el usuario en el campo EditText. Por otro lado, en el MapaActivity o actividad que tenga el mapa, recogemos los parmetros con las siguientes sentencias:

undle double double 3tring

extras = get&ntent#$(getExtras#$" latitud=extras(getAou)le#9latitud9$" longitud=extras(getAou)le#9longitud9$" nom)re=extras(get3tring#9nom)re9$"

Por ltimo, creamos un marker que nos servir para ubicar la posicin sobre el mapa:

BoogleKa! ma! = ##3u!!ortKa!Jragment$ get3u!!ortJragmentKanager#$(%indJragment y&d#'(id(map$$(getK a!#$" ma!(addKar,er#new Kar,er*!tions#$(!osition#new LatLng#latitud? longitud$$(title#nom)re$$"
La primera sentencia nos permitir accede como tal al mapa de Google Maps, de esta forma podremos agregar marcas, cambiar el tipo de mapa, etc.
12 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot La segunda sentencia aade una marca en la posicin indicada con un nombre que aparecer cuando sea pinchado. Si comprobamos el funcionamiento del ejemplo en un dispositivo de las ltimas versiones veremos que no termina de funcionar debido a una excepcin de red. Esto es debido al modo estricto de Android que no permite bloquear la aplicacin por un tiempo de espera indeterminado, como en este caso, un acceso a red. Para solucionar esto, es recomendable utilizar hilos o tareas asncronas de forma que permitan no bloquear la aplicacin y realizar el acceso a red en background. Vamos a sustituir el mtodo buscar() por una tarea asncrona de la siguiente forma:

public class Aou)le12> 0

uscar

extends

GsyncTas,<3tring?

Void?

Esta tarea asncrona recibir un string (que ser la cadena a buscar) y retornar un array de Double con las coordenadas buscadas. Dentro de esta nueva clase tendremos dos mtodos doInBackground y onPostExecute, el primero permitir hacer el acceso a red en segundo plano y el segundo mtodo permitir una vez ejecutado el acceso a red pasar a la siguiente actividad. Para invocar esta tarea asncrona realizaremos lo siguiente:

new uscar#$(execute#cam!o(getText#$(to3tring#$$" Toast(make"ext#get ase+ontext#$? '(string(#uscando? Toast(4&%6"9_45%6$(show#$"


A continuacin vemos el resultado final del activity encargado de realizar el acceso a red.

package com(exam!le(sesion5gma!s" import :ava(io( u%%ered'eader" import :ava(io(&n!ut3tream'eader" import :ava(net(>'&" import import import import import import org(a!ache(htt!(6tt!'es!onse" org(a!ache(htt!(client(6tt!+lient" org(a!ache(htt!(client(methods(6tt!Bet" org(a!ache(htt!(im!l(client(Ae%ault6tt!+lient" org(:son(D3*EGrray" org(:son(D3*E*):ect"

import android(a!!(Gctivity" import android(content(&ntent" import android(os(GsyncTas,"


13 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

import import import import import import

android(os( undle" android(view(View" android(view(View(*n+lic,Listener" android(widget( utton" android(widget(EditText" android(widget(Toast"

public class KainGctivity extends Gctivity EditText cam!o" .*verride public void on+reate# undle saved&nstance3tate$ super(on+reate#saved&nstance3tate$" set+ontentView#'(layout(activit-_main$" cam!o = #EditText$ %indView y&d#'(id(edit"ext1$" utton )oton = # utton$ %indView y&d#'(id(#utton1$" )oton(set*n+lic,Listener#new *n+lic,Listener#$ .*verride public void on+lic,#View v$ new uscar#$(execute#cam!o(getText#$(to3tring#$$" Toast(make"ext#get ase+ontext#$? '(string(#uscando? Toast(4&%6"9_45%6$(show#$" 0 0$" 0 public class Aou)le12> uscar extends GsyncTas,<3tring? Void?

.*verride protected Aou)le12 do&n ac,ground#3tring((( !arams$ Aou)le12 coordenadas = new Aou)le152" 3tring !eticion6TT78 = 9htt!://ma!s(googlea!is(com/ma!s/a!i/geocode/:son?address=9" 3tring !eticion6TT75 = 9;sensor=%alse9" 3tring !eticion6TT7 = !eticion6TT78 < !arams1/2 < !eticion6TT75" !eticion6TT7 = eliminarEs!acios#!eticion6TT7$" 3ystem(out(!rintln#!eticion6TT7$"

14 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

try 6tt!+lient client = new Ae%ault6tt!+lient#$" 6tt!Bet re4uest = new 6tt!Bet#$" re4uest(set>'&#new >'&#!eticion6TT7$$" 6tt!'es!onse res!onse = client(execute#re4uest$" u%%ered'eader in = new u%%ered'eader#new &n!ut3tream'eader#res!onse(getEntity#$(get+ontent#$$$" 3tring u%%er s) = new 3tring u%%er#99$" 3tring lineaLeida = 99" while ##lineaLeida = in(readLine#$$ C= null$ s)(a!!end#lineaLeida$" 0 in(close#$" 3ystem(out(!rintln#s)(to3tring#$$" 3tring res! = :son*):ect(get3tring#9status9$" if #res!(e4uals#9*F9$$ D3*EGrray array = :son*):ect(getD3*EGrray#9results9$" D3*E*):ect item = array(getD3*E*):ect#/$" D3*E*):ect !oint = item(getD3*E*):ect#9geometry9$(getD3*E*):ect#9location9$" coordenadas1/2 = !oint(getAou)le#9lat9$" coordenadas182 = !oint(getAou)le#9lng9$" 3ystem(out(!rintln#9Longitud: 9<coordenadas1/2<9 H Latitud: 9<coordenadas182$" 0 0
15 de 16

Conectividad y Google Maps Prof. Antonio Garca Cabot

catch #Exce!tion e$ e(!rint3tac,Trace#$" 0 return coordenadas" 0 protected void on7ostExecute#Aou)le12 coords$ &ntent intent = new &ntent#$" intent(set+lass#get ase+ontext#$? Ka!aGctivity(class$" intent(!utExtra#9latitud9? coords182$" intent(!utExtra#9longitud9? coords1/2$" intent(!utExtra#9nom)re9? cam!o(getText#$(to3tring#$$" startGctivity#intent$" 0 0 public 3tring eliminarEs!acios#3tring reem!la=ar$ return reem!la=ar(re!lace#9 9? 9@5/9$" 0 0

Ejercicio final propuesto


Se propone como ejercicio final, de esta parte, aadir una opcin a la aplicacin para visualizar en un mapa los diferentes cines donde se han ido a visualizar pelculas. As mismo se proponen nuevas funcionalidades a la hora de introducir la ubicacin de un cine. Se podr insertar un nuevo visionado de una pelcula en un cine de las tres formas siguientes: Introduciendo las coordenadas geogrficas (latitud y longitud) en dos campos de texto. Obteniendo las coordenadas directamente del dispositivo. Mediante GPS y/o localizacin por red. Seleccionando la posicin en un mapa de Google Maps.

Realizar los cambios pertinentes en la aplicacin para aadir estas nuevas opciones.

16 de 16