Documente Academic
Documente Profesional
Documente Cultură
1 de 16
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
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:
<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.
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
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
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.
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
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
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
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.
<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
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:
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
&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:
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:
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:
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"
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
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
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
Realizar los cambios pertinentes en la aplicacin para aadir estas nuevas opciones.
16 de 16