Seguridad y posicionamiento
En este captulo abordaremos dos de los aspectos ms novedosos de Android la seguridad y elAPl de posicionamiento.
El captulo comienza estudiando los fundamentos del sistema de seguridad que incorpora Android. sin embargo, a pesar de lo que cabra esperar, el sistema de segurdad no va a impedir que las aplicaciones puedan realizar cualquier tipo de accin con eldispositivo.
En la segunda parte del captulo, se describe el Apl que incorpora Android para permitir conocer la posicin geogrfica del dispositivo. Estos servicios se basan principalmente en el GPS, pero tambin disponemos de novedosos servicios de localizacin basados en telefona mvil y redes wi-Fi. A lo largo de este captulo mostraremos una serie de ejemplos que permitirn aprender a utilizar
estas funciones.
Terminamos el captulo describiendo como podemos incorporar a nuestra aplicacin servicios realizados por terceros. En concreto instalaremos una vista que permite representar un mapa de Google Maps.
desprotegidos ante este tipo de aplicaciones. Por lo tanto, los usuarios han de ser muy cautos antes de instalar una aplicacin.
prcticamente
153
En otras plataformas, como en iOS del iPhone, toda aplicacin ha de ser validada por Apple antes de poder ser instala en un telfono. Esto limita a los pequeos programadores y da un poder excesivo a Apple. Se trata de un planteamiento totalmente contrario al sofiware libre.
Android propone un esquema de seguridad que protege a los usuarios, sin la necesidad de imponer un sistema centralizado y controlado por una nica empresa. La seguridad en Android se fundamenta en los siguientes tres pilares:
Como se coment en el primer captulo Android est basado en Linux, por lo tanto, vamos a poder aprovechar la seguridad que incorpora este SO. De esta forma Android puede impedir que las aplicaciones tengan acceso directo al hardware o interfieran con recursos de otras aplicaciones.
la
aplicacin no ha sido modificado. Si se desea modificar la aplicacin est tendr que ser firmada de nuevo, y esto solo podr hacerlo el propietario de la clave privada. No es preciso (ni frecuente) que el certificado digital sea firmado por una autoridad de certificacin.
Si queremos que una aplicacin tenga acceso a partes del sistema que
pueden comprometer la seguridad del sistema hemos de utilizar un modelo de permisos, de forma que el usuario conozca los riesgos antes de instalar
la aplicacin.
En los siguientes apartados se describe con ms detalle el primer y tercer punto. El proceso de firmar una aplicacin ser descrito en el ltimo captulo.
por lo que normalmente no tendrn acceso otras aplicaciones. No obstante, cuando crees un fichero puedes usar los modos FtoDr._.tcRlD_...nnetaaln y/o
P1'ilE_woll,t_wirrE{BLu para permitir que otras aplicaciones puedan leer o escribir en el fichero. Aunque otras aplicaciones puedan escribir el fichero, el propietario siempre ser el usuario asignado a la aplicacin que lo cre.
Dado que las restricciones de seguridad se garantizan a nivel de proceso, el cdigo de dos paquetes no puede, normalmente, ejecutarse en el mismo proceso. Para ello sera necesario usar el mismo usuario. Puedes utilizar el atributo sharectuserrc fl Andrcidl4anitest..-\rn1 para asignar un mismo usuario Linux a dos aplicaciones. con esto conseguimos que a efectos de seguridad ambas
1U
aplicaciones sean tratadas como una sola. por razones de seguridad, ambas aplicaciones han de estar firmadas con el mismo certificado digital.
- Para proteger ciertos recursos y caractersticas especiales del hardware, Android define un esquema de permisos. Toda aplicacin que acceda a estos recursos est obligada a declarar su intencin de usarlos. En caso de que una aplicacin intente acceder a un recurso del que no ha solicitado permiso, se generar una excepcin de permiso y la aplicacin ser interrumpida
inmediatamente.
permisos que solicita la aplicacin y decidir si considera oportuno instalar dicha aplicacin. Veamos la descripcin de algunos permisos. Abajo se describe el
esquema utilizado:
utilizados en Android:
CALL-PH0N $rzi*i*, .v s*r l*::+ r4s+ t*tzr;tg, t].,....i,..1 {s#vfil}r litr:l*r iirii:iirr]:r{}itL,ii} ill t:tjr}i;f {:}ii iJl,l ir:,:i1,;::'l{: (muy alta) Permite realiza llamadas
&
&si*;r, i*ir* x s*r l*x tltt*'tir:rnttri {-lt,t* {3i:rt:4!:.tt (muy alta) Permite a la aplicacin mandar SMS.
sEND-sMs
t:ti\.rit:;':::.,?::i:iji:.11:.li:)
READ-OI/NE*-OO1Offi Tt *rtf+r*r:*+iEBl'l
(alta) Permiten leer informacin sobre el propietario deltelfono (nombre, correo electrnico, nmero de telfono). Muy peligroso, algunas aplicaciones podran utilizar esta informacin de forma nolcita.
ff*l*qr*f
f*+r rJiliii:r
i:< {:{:rrii:{)l::i
READ-cALENnnn&T* i+:f+rr't**f-ln p+rser*al -- i**r ij*ii:r,i {J'* {l{}l#ri,lii}t:,.j (moderada) Solo da este permiso siconsideras que la aplicacin
realmente lo necesita.
wRtrE--cALENnAR
r;;li,,rrrije:'it)
&
Tu istfrr'r:,r*!*n #*r**r:r*l
rrr*rli:ir 'Jii.** J*
155
aplicaciones piden este permiso para ponerse en pausa mientras hablas por telfono. Sin embargo, tambin permite el acceso al lMEl, lMSly al identificador nico de 64 bits que Google asigna a cada terminal. En las primeras versiones de SDK este permiso no era necesario.
AccES$-FtNE-LocATtoN
#g*
ubicn**flr
:r$cx*lr
lr
*b!*;tr;ir:r:
i*p$i
AccESS-coARsE-LocATto* &Xu ubi*acin *- ui:i*ci** conTin ib*s*C;r ** rstJi (moderada) Localizacin basada en telefona mvil (Cel-lD) y WiFi.
#:'ar.x**r*i** d* r*ct cr*ar **nexion lll,,-etc*tl (baja) Conexin con otro dispositivo Bluetooth.
BLUETooTH
TNTERNET
*,#.*rvz**t****n d< rer* - il*{:esi} r}t$Sro * lniorn*i (muy alta) Permite establecer conexiones a travs de Internet. Este es posiblemente el permiso ms importante, en elque ms hay que fijarse a quin se le otorga. Muchas aplicaciones lo piden, pero no todas lo necesitan. Cualquier malware necesita una conexin para poder enviar datos de nuestro dispositivo.
A #**tr"tcas!n de red - vor e*iiri* de con*xion, ve;'*.rl*ii* ** \t'i-ti (baja) lnformacin sobre redes WiFidisponibles. *il*rraft'lieltt;$ rJ*{ sint*n'* * lmp*#ir r:r:e el le lf**c o*li.r +n *rr:rJ* rje c*sen*i** (baja) Algunas aplicaciones pueden necesitar de este permiso,
AccEss-wrFr-srAfE y realmente a lo nico que puede afectar es a nuestra batera.
*[ h{*rr****ntftr *l*{ sist*ma - lvt*<li{ir:nr ll gl*f:;ll dlf sist*ira (moderada) Permite cambiar la configuracin (como locale). Pese a que es importante en s, es muy comn, asi por ejemplo los wdgefs lo necesitan.
cHANGE-coNFrcuRATroN
i-:q:rrfiSrril*:*r
READ-syNc-sETftNGs & {errar?en{as del sisteffin - l*er r;rjustes de sl:rrx'cnzac* (baja) tan solo permite saber si tienes sincronizacin en segundo plano con alguna aplicacin (como con un cliente de Twier o Gmail).
wRrrE...ApN. sETTtNGs
P*nf"* rJ* A**eso (moderada) Permite la configuracin del punto de acceso a la red. Por ejemplo, encender y a apagar tu conexin de red o Wi-Fi.
*+nfiqr"rreri*r'r
i*i
**4*rrarni**t**
*J*l
sist*ma * #*cribir
A F{ *rra an *ntas de I s *te *r;* -- r*cu p{}t"i.!r +ri *jrlclr*ifiit (moderada) Permite saber qu aplicaciones estn coniendo en segundo plano y cambiar el orden.
MANAcE-App-ToKEN s
}
:.1:f
i*l*i**es
SET-PREFERRED.-APPL|CATtOt*S
*t-{*rr*rl,lientns
ds? ss?*ry*a
* *stcbiscer
+i:li*;r*i+*l+s ir"++r:*;:* (moderada) Permite la asignacin a una aplicacin para que haga determinada tarea. Por ejemplo, la reproduccn de vdeos.
156
. . .
&# ntr++. c** h.3rri\p"r,rr*T * i-:l.lllrri ,:J* :+ ,;:l>ii;:*ir;ii (baja) Permite hacer vibrar al telfono. Los juegos lo suelen utilizar bastante. cAtJERA &{.1**trr-oJ:'li <i* hnr*'*",;i"r - ilr;:1:ri.l f:1r.:i:r*fi*::l (baja) Permite acceso alcontrol de la cmara y a la toma de imgenes. RECORD.-AUDIC) &tqrttr*:ii qf* i"+rt*rq;*r# - iiri,;*,:1 t. t:t:t"1it;(mOderada) Permite grabar sonido desde el micrfono del telfono.
V'BRATE
Para solicitar un determinado permiso en tu aplicacin, no tienes ms que incluir una etiqueta -r\ii:,eir-[)e]:iii::.fs.:tii:in> en el fichero A.nq1]:o:l.dtiinit:e$tt.xr;il de tu aplicacin. En el siguiente ejemplo se solicitan dos permisos: <:reniest paci<ace= "org. ezam1]ie. ni....apiicac j,n"
>
//>
'inai:ri-fest.:,.
Abordaremos el estudio de la creacin de nuevos permisos utilizando el siguiente ejemplo. Somos la empresa PayPerView especializada en ofrecer servicios de reproduccin de vdeos bajo demanda. Queremos crear un software que permita a cualquier desarrollador reproducir nuestros vdeos desde sus aplicaciones. No obstante, este servicio no es gratuito, por lo que nos interesa que el usuario sea advertido cuando se instale la aplicacin del tercero, indicndole que esta aplicacin va hacer uso de un servicio no gratuito.
Para definir el nuevo permiso utilizaremos el tag .::+:r.r:ii:is:i.<>ri:.. en el fichero Arcroi.<iy;,ni.fe:;t.xinl. de nuestro software. A continuacin se muestra un
ejemplo:
<
nan i i
es
t pacicaqe=',
..:::ermisgcn ai:Croiii:
arr-dr: c i-.il :
1.
pai.perviev. eervicios
VEi \iIIEO;S'
all+.1. = ri:rli
i.rrg,/
+-t-'i...$la-i::.j-."
lrrrlr:oj.rl:rJi::,s':::r'i-;ii.cft=rr(tr$irj.nq/d.rlsr-:r.;:a:i.r:r.',
anrlrc.ld::err'1es!crrC:rctip="andrcid.perr,rrsrsicn-cJrcLiF.:LaST
a:tl:r't::.i.11
l"jolEYs
:i:r'ct*<:i:..ic::n)..evel.-"-ln..Jerol,tr.i",/:-'
-.',"1i*;li.
esl:.
157
dentro
ancroic:permissionGr,f,up es opcional y permite incluir nuestro permiso en un grupo. En el ejemplo se ha incluido en el grupo de permisos que pueden suponer un coste econmico al usuario. El atributo andrc<j::rcrecticnr,evet. informa al sistema cmo el usuario ha de ser informado y qu aplicaciones tienen acceso al
permiso. Los valores posibles se indican a continuacin:
aplicacin.
El
atributo
fiOn;al
danqercus
el
siqnatr:re
signei.ureorsysuem lgual que signar.irre pero adems puede ser usado por el sistema. Caso poco frecuente donde varios
fabricantes necesitan compartir caractersticas a travs de la imagen delsistema.
Los atributos androict:lal,el an<tro!.<i:descripeion son opconales y han de ser introducidos a travs de un recurso de cadena. En estas cadenas hay que describir el permiso de forma abreviada y extensa, respectivamente. Veamos cmo podra ser en el ejemplo:
<
stri.ng
rt
dema
tri
n-q >
<siring name='ldescripcion,'>permite a la aplicacin reproclucir videos de la enpresa paypervier\r sin tu int.ervencin. Se trat.a de un ser.r,'icio no gratuito, por 1o que puede afectar a1 salclo de t.u cuenta con esta empresa. Si no t.ienes una cuenta abiert.a 1os videos no podrn ser reproducidos. <,/strine>
Vamos a comprobar cmo usar este permiso con el siguiente ejemplo:
Crea un nuevo proyecto con los siguientes datos:
Project nFe: Nue'roPermiso Bu.ilrl Target.: Arr,lroid 1 .5 Applicaricn name: Nuevo Fermiso Package nanle : com. payper"*ie.*. servicics ilrea i::e .A.i::ir v j. t:y : l{uevo penn i. so l4i-n SDK \ersion: 3
:i.
crea una nueva actividad en este proyecto con nombre ver.vi.cteo y copia el mismo cdigo de la actividad N'.:evoi?errni.so. En el ejemplo real esta actividad
158
:erp (
Ii
_C
c.:;a L
c.i
n... >
|.
i!-i i''r/
android : name= " VerVideo', analr.J j"d:permission= 'i:ron. p.;.yj:)er-tr.i.t:w..r{::r1,ic.io.s. VEii. V.iDj1.:C5,,> .., i r i:. +n i:: - f i t. +:r.> ":act, ion androi.d : name=,'a.ndroid. ir re-r t . a,:ti on . IIAIII,' i > .: ilat.e<}c-lr_v android : name= "art''ojd. jl- et . <:at.eqoLy. Li\i,lN:tjlI:,i." i :"
.i.
.r ,i
:!.
<7in;:ri..:.fesl>
Ejecuta el proyecto. Es imprescindible para registrar en el telfono el nuevo permiso y la nueva actividad que queremos lanzar desde otras aplicaciones. Para usar este servicio crea un nuevo proyecto con los siguientes datos:
: i.I$;.tr'?r-.:r:mi:sc : Anclrcidl .5 A;rp I :i c::a l- it:rn rialrle : i.f sa r perrrii sc pii (:k lr]e n;lyle : o ]..q, e--z ;rni> e, lis:;;l r.>e r.ni.i. r:,:> Create A.ct.ivit,y : UsarEermisc I"lir: llK Versiol:: Puilcl
1.
-1
Abre
el
el
<LirreraLa.,'oui
.: liii t:
andro i d : 1 ayp **i. Ot.h=,, rvr-al:,.... c cnt e n r- " a nd.r'Q d : 1. ai' _a girt- = " nir a>.....7; r y7 sl1 " androiC: Lezt = " i.;e;: i,'deo ,'
r:i
>
Abre el fichero lrsarpermisos. j;.rva y aade el siguente cdigo al final de la funcin onrete i:
liu i:-i-crr l: - ($ri i:t: (::n i f i ndvie"ell:ly : cl (Iii. b . s::e l:Oifil.i. r::kli t. ener i new CnC-'.1. tr::k-i
r,,:
id
s: i_
. Bu t t on] 7j ener. i ) {
159
Sverrid.e
publtc vold onClick(View view) { Inten i = n6r Inte*t(i; i, setCl assName { com, palperview. servicios'r,
r
It
startAct ivit:y i ) ;
l);
NOTA: En este cdigo no se han incluido los import, pulsa Ctrl-Shifi-O pna
aadirl o s de forma aut om
t ic a.
Eiecuta la aplicacin. Cuando pulses elbotn la aplicacin provocar un eror. Visuafiza la ventana LogCat para verificar que se trata de un error de permiso. Para solucionar el problema tendrs que ncluir el siguiente cdigo al final del
fiCherO Androi<iMani f
esr . xnrl l
<marifesh.,.>
<uses -permr-sst_on
android
</manifest>
Comprueba cmo ahora se accede aI servicio sin problemas.
160
Seguridad y posicionamiento
6.2. Localizacin
La plataforma Android dispone de un interesante sistema de posicionamiento
que combina varias tecnologas:
Sistema de localizacin global basado en GPS. Este sistema solo funciona si disponemos de visibilidad directa de los satlites.
Sistema de localizacin basado en la informacin recibida de las torres de telefona celular y de puntos de acceso Wi-Fi. Funciona en el interior de los
edificios.
Estos servicios se encuentran totalmente integrados en el sistema y son usados por gran variedad de aplicaciones. Por ejemplo, la aplicacin Locale3 de Android puede adaptar la configuracin del telfono segn donde se encuentre. Podra por ejemplo poner el modo de llamada en vibracin cuando estemos en el
trabajo.
El sistema de posicionamiento global, GPS, fue diseado inicialmente con fines militares pero hoy en da es ampliamente utilizado para uso civil. Gracias al
desfase temporal de las seales recibidas por varios de los 31 satlites desplegados, este sistema es capaz de posicionarnos en cualquier parte del
planeta con una precisin de 15 metros.
El GPS presenta un inconveniente; solo funciona cuando tenemos visin directa de los satlites. Para solventar este problema, Android combina esta informacin con la recibida de las torres de telefona celular y de puntos de acceso wi-Fi.
En el siguiente ejemplo usaremos una aplicacin que es capaz de leer esta informacin y actualizarla cada vez que se produce un cambio. Vamos a crear un nuevo proyecto con los siguientes datos:
Facka
.1.
c_,r)
F1:!.n
f:iK V+::r'ri.i.cn:
161
prohibido para las aplicaciones. Si estas desean hacer uso de este servicio han de solicitar permisos especiales. Estos permisos hay que indicarlos en el fichero
A::cii:ir:ir,rr:r:ie*:r-.2.m1. En concreto esta aplicacin necesita localizacin precisa y localizacin imprecisa:
Ai]CASS FTI.JF: I,fJL-AT:OI
ATjCESS a-l-r.\Rs3 LCATiON
a la
los permisos
de
P+misdors
E S E 0 *r
f:-,add;l
*ses Finnission
N'-"
"nJi"iJ.p"'*iuiio".tciii-caniE-Lo
,"l,iilir.'tlppr'*iii
I*:.f,i::nfjffi;*"#;r""itqp F1*,iil
como la que nos proporciona el GPS, como una menos precisa, como la
proporcionada por las torres de telefona celular.
En este ejemplo nos limitaremos a mostrar en modo de texto la informacin obtenida desde el API de localizacin, tal y como se muestra en la siguiente
pantalla:
162
Seguridad y posicionamiento
ffiBA
ffiffiffiffi
nlz{r
,l'*xr-v.i.err.
con scro//.
xrrrl pofi
ns : andro id= " |i!. i- l) : ,/ ,1 ic:heni:i, aliz oi ndro i <i : o r i en l- a tr i o rl= " v e t' .i c e 1. "
!.:.
<i
. i:cxni'a.tk
i're.,1:ldrti
<i '.
":>
" G + id,t sei ida " androcl : laycut_width= " fi i __pci-err t', ;a:ldroiri: layc:rrl- heigl:t:= "rli,.'p_l-'oril tini- " f :,
and.roi.o t tC=
':
'
,1.
i.
i. ,?
,L,r
:..
163
tl a =
sCvt
r:
::.-
i.
cle
publlc voLd
onCreate (Bundle savedlnstanceState) t supr. oncreate ( savedlnstancestate) t seEContentview (R. layout . main)
(LOCATION_SERVICE,
);
Criteria crteria = new CriteriaO; proveedor = manejador.getBestProvider(criteria, true) log("Mejor proveedor: t' + proveedor + 't\ntt) i
1og('rComenzamos con 1a ltirna localizacin conocida: ") ; Location location = mrnejador. getLastl(nownlrocation (proveedor) muestralocaliz (location) ;
)
de
tipO
La siguiente lnea hace una llamada al mtodo log O Que ser definido ms
Dependendo del proveedor puede tardar un cierto tiempo en darnos una primera posicin. No obstante, Android recuerda la ltima poscin que fue
1U
Seguridad y posicionamiento
devuelta por este proveedor. Es lo que se hace en las ltimas lneas del programa. El mtodo rnestralocal.j-zi) ser definido ms tarde y muestra en pantaila una
determinada localizacin. Copia a continuacin el resto delcdigo:
ii
<iiti. c:i.cl.o <ii:: r'i.i:li :,Ci,'er::.'ce
144i.::.:<t.:.:*;
<j*
.i.i :iril:i.ci.i<::!_iirr
protected void onResume i ) i auper . clnF:e$Lirie i ),. ,/ ' Acr. i-voii;s nci. i. i. : ca c j,ces ile r;r,,_.e.1- .-i z :lr-r i -i. mane jador. reqrjsrlcai j-crrijf--da:.es {proveedor, i0Lt00, :. this)
.1
{:,Overricte
Fala ahorr.r:
ba,t.,e.ria
l
.r
l':r::<>iloi:l il<,t
l:'r.ri:r.1.
:i.lli::<lt:.:
:;z
].,:ic'i.ti: :i.()nI.,::.f.!i:.erle:: {
i.c
vc'r
1c(l i "l.Trieva localizacirr : " ) lili e r:i I i ::ioi::i.l. .i ::: ( l. <>i::i i::.i r:r l ;
)::
public vold c:iPrcivir:erli salrleci i,it rin.:f prc_'rreeior ) { loq("Proveedor deshabiltado: " *. -.r'er,-.:rrjclor + "\n,')
)
publ lc void r>:l:\.r'ov i <ier li:;ai:l eri { $ t: r i *g ;: r<-',i'ee<ir:r. ) i 1og(rrFrorieedor habj,l j_a,l+:', + prcveedcr- + ) ;
1
J
public voic o::.Stat'rrsi:ai:ce:i$tri:rg prcveed_or, ir:L est,aac, Ilundl* exi:ras j { 1cl]iCambj.a estado pr:oveedor: t' .r pr-..ov.e.*q1<:ir..r ", estado=" + EiMal-i:.m.rx-:.c:tc-Ldt)) ] + ", extras=" + {.lxtr1 * r'\,r).
l ,/7 lii:
r:;<lt:;:,r
private void
j
i:'i:::: :!.rilo:::i:;<:,:i.iill iSLr:':j.ii. i:;.rlieri;,ri i sal ida " app*nr:1 ( r::,:,dena .r ,' \ r' ) f)i,i:t'i;
i:1oriit: 1.r:re
,.
165
privae void mue,gt.rctl,oci1 i. ? iLoca-r icn locat ion ) if ilocati,:r == nulli l.oq "Localizacin desconocida\n', i ;
el.se
1og {lccaL io:r . LoSt:r'iilg
i (
+. " \n" ) ;
private void muresiraFrceedores i) { i.,:i.-:L.::it.xi.rrg> p:r'oveeclore$ = manejador.geLAi.i.Lr:rov:i.<1*:'s; () ; for (:jt.r'.i.rrg lxo.ree<lol' : provee<1cr'*si i
muest.raProveedor (proveedor )
;
prlvate voLd n'.r-iesiraProveedor(Slring proveedor) { Lccat ionPror,'ider :-nf o = manejador. get.pl'of i.:er- (proveedir") ; .l-cg ( "LocationProvider ['t+t'getNm=rt + inro.getNanre ( i + ", isProviderEnabled=rt +
getPowerRequiremenE=
P
"
r.
[MaLh
. ii?i::x (
0,
r'emerrl { } i
requiresCell=u + info. requiresCell O + reguiresNetwork= " . :i::f o. l'equi.r'esltet.work () + reguiresSatellite='r + nf o.requireesatel.l.ite i) + supportsAlt.itude=t' + info.sippcrtsAltitude {) + supportsBearing=r + info. supporLs-{l:ielaril1g ( ) + supportsspd=r' + i.nft:.supnorLssllrjctl (, *tt \n')
,'
Para conseguir que se notifiquen cambios de posicin hay que llamar al mtodo requesrlocarionupdaies() y para indicar que se dejen de hacer las notificaciones hay que llamar ? removeupd.ares(). Dado que queremos ahorar batera nos interesa que se reporten notifcaciones solo cuando la aplicacin est activa. Por lo tanto tenemos que reescrbr los mtodos on.Reriuiie {) } c:rpar.rse O .
El mtodo requesr:,ocar.or:'irpd.ar.es {) dispone de 4 parmetros: el nombre del proveedor, el tiempo entre actualizaciones en ms (se recomienda valores
mayores de 60.000 ms), la distancia mnima (de manera que si es menor, no se
notifca) y un objeto Lr:earicnr,isLener.
A continuacin implementamos los mtodos de un Loi:ai:.iorLierene::: o::Lccalio:tCha::ged Se activar Cada vez que cambie la posicin. Los otros tres
166
uno mejor o deje de funcionar el actual. Sera buena idea llamar de nuevo aqu al
mtOdO
get.tsestPi'cvirier ( i .
6.2.1. Emulacin del GPS con Eclipse Muy probablemente el ordenador donde ests trabajando no disponga de
GPS, por lo que sera muy difcil que este programa funcionara en el emulador. No hay problema, el plug-in de Android para Eclipse proporciona un sistema de emulacin del GPS. Para activarlo sigue los siguientes pasos. Accede al men Window > Shor View >Others... > Android > Emulator Control.
ffi
I
Stro'arView
-'--*"*-"i
I I
i};'
General
;i
......t
Android $ 0euicer
ErnulatorControl
fl:
i
i.*crilt Threads
i
[Jre Fl
sef*ted rie*
;ed;;1
Aparecer una ventana como la siguiente:
Lcction Contrelj
t'tr"*t
,t.
f,e
,,l.xul-"'.
Dsimal
:'''l Serageimal
LongituCe -l?.0840*5
Latitude i.ils
- ":l : :Kdi
167
Elgran libro de Android Nota: Es posible que el GPS no reciba ninguna seal. El problema est relacionado con el .formato de las coordenadas enviadas al emulador. Por algn motivo (probablemente relacionado con el carcter usado para separar los decimales, la coma en espaol y punto en ingls) el emulador solo recibe correctomenle las aclualizociones si la configuracin regional est establecidq ol idioma ingls. Para solucionar este problema basta cambiar e/ locale del nntime de .java. Si utilizas el plug-in para Eclipse, aqde '-Duser.language:en' al archivo
eclipse.ini. Ms informacin en
a.
Google Maps. .
o
En primer lugar, para hacer uso de este servico necesitas una clave de
htto:/lcode.qooqle.com/intl/es/apis/maps/siqnup.html. Siempre es una buena idea revisar los trminos y condiciones. He aqu algunos ejemplos:
Hay un limite en el nmero de solicitudes de codificacin geogrfica por da, 15.000. Publicidad (AdSense / AdWords) no est incluido en la API de Google Maps
en
Ests obligado a ofrecer mapas de Google como un servicio gratuito para tus usuarios.
Tras registrar la aplicacin se nos entregar una clave que tendremos que indicar en la aplicacin.
Realmente vamos a necesitar dos claves diferentes, una durante el proceso de desarrollo y otra para la aplicacin final. La razn es que se genera una clave
diferente en funcin del certificado digital con la que se firma la aplicacin. En la fase de desanollo las aplicaciones tambin han de ser firmadas digitalmente, peio en este caso el SDK utiliza un certificado especial utilizado solo en la fase de
depuracin.
Veamos cmo obtener la clave Google Maps para el certificado de depuracin. En caso de querer distribuir tu aplicacin, una vez terminada tendrs que firmarla
4
htto://code.qooole.com/p/android/issues/detail?id=91
168
Seguridad y posicionamiento
con un certificado digital propio. Este proceso se explica en el ltimo capitulo. Recuerda que ser necesario reemplazar la clave Googte Maps, por otra, esta
ltima asociada a tu certificado digital.
descubrir donde est almacenado el el entorno Eclipse accede al men windows > Preferences > Android > Buitd. Aparecer el siguiente cuadro de
i.rr1lrte.r 1_9t
::
General
Android
Buitd Settings:
i-?i Autornaticafly refreh F.erources andi sr.ets folder on buil.d
irii,
D0t{s
Lunch
LogCat
Llsage Stats
Build output
i,-l sitent
F.i Norml
r, Ant
,1 Data ManBqement
keyrt** Ci{""rrXi"*-Jr.r'iJrriJlJ,$";.h"f*;;;
:,
:
Help
CustDrn dbu g kryst@cl
Java
:, Installr'Update
Java
EE
En el cuadro informativo Default debug keystore: aparece la ruta del fichero donde se almacena el certificado digital de depuracin. copia en el portapapeles esta ruta.
Ahora necesitamos extraer la huella digital MDS de este fichero. Para extraer la huella digital puedes utilizar el programa t;iir;.r,;;-. En Windows este programa se encuentra en la carpeta c: \iF,:.-o<;r:am Frles\,,fara\ jr.e\,h,in\ o en una similar. Abre un intrprete de comandos y sitate en la carpeta anterior. Ejecuta el siguiente comando reemplazando el nombre del fichero por el que acabas de copiar en el portapapeles.
K,:.:ri-.fi';l
- j.
LSt - {.gyi-i.-r}:r:l
169
El programa te solicitar una contrasea para proteger el almacn de claves. anclrc.ricl. A continuacin, te indicar la huella digital del certificado DMS. Como puedes ver en la captura anterior est formado por los
La contrasea es
siguientes
16
bytes
expresados
en
hexadecimal:
FD:AF:?A:5F:52:AFl :51 :611 :84:.1 8:6C:1F:Dl :CC:FE:?gCOpiaenel pOftapapeleS esta secuencia de dgitos.
Para obtener la clave Google Maps entra en la siguiente pgina Web:
http ://code.qooole.com/android/ma os-aoi-sionuo. html
Tendrs que introducir tu huella digital. Y el usuario de Google Mail que realiza la solicitud. Si no dispones de un usuaro en Google puedes crear uno nuevo en un par de minutos. El resultado final se muestra a continuacin.
Grtdra pd uscrblC
Tu clave es.
i
l{b5a f HcRIIdAO
ASR
I I 6 rUqs t
2Pl,l5 AT}f
j UkKg
Esta claw es vida para todss las a$icaciones rmadas con el certificado cuya huella dactilar sea:
j
00-FE-?g
170
Seguridad y posicionamiento
P::o j e* t. ne ii3 : E.i einpri. or;o.i(ii. ci.iali s Br-ri:d Tar-gec: Gooql e APis i.6 "frppi j.c-'-i- j-on nale: ii je:l:ir:: :;o{lq:e
}ia}r..1
jern>i.ogoi:;c'i.eil;ipr,r
Ci..:a : e p.c r. i 1.' :_ r.."' : I -"i enp i o,_lccq : ei,ifi F i4in SitlYr tu'+!'s:i{:n: .i
Necesitas aadir la librera de Google Maps a tu aplicacin. Entra en And:oldrvraniieE:t:.xrri ! selecciona la lengeta Application. Utilizando el botn "Add,.." aade un "Uses libran/' con la librera: ccirn . 5.'i:i<>,i i: . i;nr,l:r'r:; i il " irui;r,.
-a$ruriididhfi h*iJ}nih*t
,:!::.
iifltiii+r.
AFFit{tr:ioe A{{rbrtls
N.me
Br**-
ls**]
lei."'*r.-j
n.r.oo.
Penietent
l[.",;
rr"ur.a
oebussable Mangespcactieify
A.fiow cea
t33
-
,ffi;
Prs(er:
Task
G-,Jt--l L.:-:; l:
urerdeta
affinr\
lE4;'-j
E El E
@ lE,O
Apliratim$odm
: . - * u-n*El!is-
6 *"
&ttribt*lbrn,4auEle.md:cid.rap*{LleslibRr!l
ji
(Qcon.ercoete.android.map:(usetiu'".y1
- - - -
[niJ
lY::-'::::t-e'-t:T:y::tj-j'
r'1;1..
IE
17'l
,/,i
schemas
anroid.
com,i
apk,/res,/androic"
package="c:rg.ex;lrnp).e.ejernpJ.cgc-ogJ.emaps,android:versoncode="1."
android: versionName='r
.:
f. . 0'r >
app1 i cat
j.
icn
<ii:t. j.v
android : label= "Oslring/app_name r, > : name= I . E j empl.cGocCleMaps " android : label= "r.&string./app nane' > .: i.ni:ent - f i.1 i:eL:" <..r'it i. ol android : name= ti anC:'cid.. ntent . ac*u 1on . MA N ",.' t <caLe<or:]i android:name=t'and::oid.intent..calegor"J*.LAUNCHER",T'> .<./ :i.ni:ent: - f :i 1 i:er :,
iy android
< i t: c L;' vi. i'y'-" <uses - I l^brary android I nare= " com. googl e . androLd, nraps . / >
.,:
7'lapp1
i ciet i <in:,
ion android
nare=
"
android. permi
ss
<uaeg -permisel"on
<uae
androl d nare - t' andro i d . permi s s ion . ACCES S -prrnisaion androLd : nae- tr androld. peraii s a ion. ACCESS
>
...
COARSE _.ITOCATIO!
/>
.</malif est
*'
i vrlaycrit
t' ./
android: orentat i-on= " ve:t ical.,, android : layoub_width= " fi J i_parent,
con. google . android. mapa . apView
>
androld: ld- ne+ ld/mapa t android : Layout_width-,, f i 7 L3arenF,, androLd : layout_helght =,, f t I lJ)arent,, android: clichabl.e. 'rue r
obtenida en
SUStitUye'.">.' Tu
el
clvo tie Gccgle i4aps <<<" por la Clave de GOOgle MapS apartado anterior. Reemplaza el cdigo de
172
privette Mapcontroller
MapActivity
;
true) ; i ii;.r:t.i.vtt. vi3ta sat.j. i.te mapview. set.St.reetview(false) i i r,jjesacliva ;jt.rr::et_Vier mapView.setTraf f ic (j:i:.1.se) i i.ite-:;;<::Li.y;.. j.if i;,r.lr;.ci_:.r <j+: t_r..f:.j.<::,:: mapcontroller = mapView.getController O ; mapcontroller.setZoom(14) ; 1i Zoc:,:, 1 ver tccc el mu::<io locationManager = (LocationManager) getsystemservice ( conLext, LOC AT I oN-$ ERV I C E) ;
( 1
oncreate (bundle ) ; setContentview (R. layout . main) ; mapview = (MapView) findViewByrd(R.id.mapa) ; mapView. setBui 1 t Inzoomcontrol s ( t r.lre ) ; Ii
mapView.
setsatellite
i,.:.:1.
.i.':t.
.:<.,r.;lr
);
i_rr.'ri f
;.'I.
e ;
Locationlistener
{ {
tr,Cr,.erriae pi_ri:lic
void onlocationChanged(Location 1ocation) iri:: lat = (jnr) (location.getLatitude O * j.E6) ; i.nt 1ng = (i.nt ) (location.getlongitude O * l-E6) ; GeoPoint point = rle.$ ceopoint (Iat, lng) ; mapcontroller. setCenter (point ) ;
onproviderDisabled(String provider) {}
{}
'.'j1\erri.e p'.rbl
ri).,'rr,.^.i.
ic
de
t7,
Si ests utilizando el emulador, en lugar de un telfono real, utiliza la vista "Emulator Control" para indicar las coordenadas geogrficas a visualizar. Por ejemplo, la Universidad Politcnica de Valencia se encuentra en Latitud: 39.47987 y Longitud: -0.33874. El resultado se muestra a continuacin:
{*fl
ffiItrEf
174
Seguridad y posicionamiento
Eiptsbie
1. En el ejemplo
anterior, modifica algunos parmetros de configuracin, como visualizar recorrido streetView o nivel inicialde zoom. verifica los
resultados. Siests utilizando un telfono real reemplaza en el cdigo anterior Locat ionManager . GP S _ PROV IDER pof
2.
LocationManager .NETWORK_?ROVTDER. EjeCUta de nUevO el prOgrama y compara las dos posiciones geogrficas obtenidas.
private
n::'ei^rsi)j.e
. r:;_t
t)r.,rab f e
P. . d
lar+a}: j- e .,r...; l: i
<jei
drawableAstero ide
| :i
.l -
<'jiln
t:e.rt:
. (T*i:11-e.(::o1.1!'.::es: (
drawableAsteroide [2 ] =
ge i:D rar.iab i e ( lll . i:t:r; w l) i e .,i t:: i.: r::.t: r:: I r.ii:.:.7 ) ; i:)()il.t.*xi::.rjcl:Rt3,:11y<:t]$ ( ) . clirri.[j:i:'aw:.]L)::.e {R. <1::';,iv;,i}:l.ii.: " ,;si.,;r',:,.;.,.:i:l j ;
Aade
cdigo:
al
el
siguiente
int tam; if (Asteroides.get (i) -getnrrawableO l=drawableAsteroide [2] ) { if (Asteroides . get ( i ) . getDrrawable ( ) ==drawableasteroide [ 1J ) {
tam=2;
] else
tam=1;
175
for (in! n=0,.n<numFragmentos rn++) { Graf ico asteroide = nff Graf ico(thia,drar,vableAsteroide[tam] ); Asteroid. setPosx (Asteroides.get. (i) .getposX O ) ; asteroide-setPosY (Asteroides.get (i) .getposyO ) ; asteroide. setlncx (Math. randomO *7-2-tam) ; asteroide. setlncY (Math. randoml *7-2-tam) ; asteroide.setAngr.rlo( (int) (Math. random) *360) ) ; asteroide.setRotacion( (int) (Math.randomO *8-4) ) , Asteroides. add (asteroide) ;
) )
anteriormente y verifica gue cuando se destruye un asleroide no siempre aparecn el mismo nmero de
2.
fragmentos. A qu puede deberse este problema? Prueba a poner la palabra reservada $)::!'::hrorii.zer: delante del mtodo rlei.;{::r'r:y*Aster'o:i<ie ( ) verfica sise ha corregido el problema.
176