You are on page 1of 24

CAPITULO 6.

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.

6.1. Segurdad en Android


La seguridad es un aspecto clave de todo sistema. Si nos descargramos una
aplicacin maliciosa de lnternet o del Markef, esta podra leer nuestra lista de
contactos, averiguar nuestra posicin GPS, mandar toda esta informacin por
lnternet y terminar enviando 50 mensajes SMS.

En algunas plataformas, como windows Mobile, estamos

prcticamente

desprotegidos ante este tipo de aplicaciones. Por lo tanto, los usuarios han de ser
muy cautos antes de instalar una aplicacin.

153

Elgran libro de Android

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.

Toda aplicacin ha de ser firmada con un certificado digital que identifique a

su autor. La firma digital tambin nos garantza que el fichero de

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.

6.1.1. Usuario Linux y acceso a ficheros


Para proteger el acceso a recursos utilizados por otras aplicaciones, Android
crea una cuenta de usuario Linux (user lD) nueva por cada paquete (.apk)
instalado en el sistema. Este usuario es creado cuando se instala la aplicacin y
permanece constante durante toda su vida en eldispositivo.
Cualquier dato almacenado por !a aplicacin ser asignado a su usuario Linux,

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.

6.1.2. El esquema de permisos en Android

- 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.

Cuando el usuario instala una aplicacin este podr examinar la lista de

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:

continuacin se muestra una lista con algunos de los permsos ms

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

sin la intervencin del usuario.

&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:)

wRrrE-EXTERNAL.-sroRAGg &,{luu**rr.*irui*r:tr,j -.rl.li:l;:fir;:r:,1.rli.r.r*


i}1'r.rii:',:'i-iii r,Ii irii.lr (alta) Permites la lectura de archivos y su modificacin,
tpico en aplicaciones de backup.

READ-OI/NE*-OO1Offi Tt *rtf+r*r:*+iEBl'l

ff*l*qr*f

f*+r rJiliii:r

i:< {:{:rrii:{)l::i

(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.

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*

(moderada) Este permiso no permite leer el calendario. por las

mismas razones que elanterior permiso, hay que plantearse si una

aplicacin nos pide este permiso con sentido o no.

155

El gran libro de Android


READ-pHoNE-srATE

*L*rt'lndaw d* t*l*f*nn * lesi e:riad* del t+ll**c c

:ci*rrt<1itrl (alta) Muchas

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

(moderada) Localizacin basada en GPS.

: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

*,#.*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.
TNTERNET

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

i*i

**4*rrarni**t**

*J*l

sist*ma * #*cribir

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

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"

>

<:uses-perilj-ssi:r ancrrct::tanla:i= "andro:d. re::inission. -C5fVE...Si"lSu


<11,sls-L1e:'mission a:rCoiC-:naine-!ta;lC::oid..perrir:.ssi,Jn.SIt{D Si4gr,,/'>
<

//>

'inai:ri-fest.:,.

6.1.2.1. Creando tus propios permsos


Adems de los permisos definidos por el sistema, los desarrolladores vamos a
poder crear nuevos permisos para restringir el acceso a elementos de nuestro
software.

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=',

coin . pa:./pe::vi ew . se i:r,' j_c j-os " -',

..:::ermisgcn ai:Croiii:
arr-dr: c i-.il :

1.

all+.1. = ri:rli

tiame= !tconl
i::.'r..:

i.rrg,/

pai.perviev. eervicios

VEi \iIIEO;S'

+-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

-.',"1i*;li.

l"jolEYs

:i:r'ct*<:i:..ic::n)..evel.-"-ln..Jerol,tr.i",/:-'

esl:.

157

Elgran libro de Android


El atributo androicl:name indica el nombre del permiso. Como ves ha de estar

dentro

del mismo dominio que nuestra

aplicacin.

El

atributo

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:

El usuario no es advertido de que se va utilizar

fiOn;al

el

permiso.

danqercus

El usuario es advertido.

siqnatr:re

Solo aplicaciones firmadas con la misma firma digital


que la aplicacn que declara el permiso

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

narie= "rt i.qu.eta

dema

rrd.cr <-,/ s

tri

rt

>reprrchcc i.n de vi.rleos baj o

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

Anrt-oid.ir4anles:.::ri: segn el cdigo mostrado a continuacin:


<iirani f eE:...:>
<

:erp
(

Ii

c.:;a L

_C

|.

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

:!.

rt i::e:rlt. - : :i.1. i: e i: >

I actvt^>
.. /"appl icat ion)
<

<7in;:ri..:.fesl>

Copia detrs de .: ,/appticarion> la etiqueta .:penniesioi-t ...i>, del ejemplo


! cieec::ipcic:r.

anterior. Recuerda definir los recursos de cadena eiic.uer,a

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:
?rc j er-.1- nan're
Tar,:fet

: 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

fichero *s i.r.:;ni,j e inserta

<LirreraLa.,'oui

el

siguiente botn dentro del

>:

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 ,'

.: liii t:

1.

r:i

.rntlrOid: j-d= "r!+jcf'Butt:anA j,'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

El gran libro de Android

Sverrid.e

publtc vold onClick(View view) {


Inten i = n6r Inte*t(i;
i, setCl assName { com, palperview. servicios'r,
r

It

com . pa)G)erview . servic

ios . VerVideo tt ),.

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

rame= t' com.

payperview. eervi c ios

</manifest>
Comprueba cmo ahora se accede aI servicio sin problemas.

160

VItrR VIDSOS " / >

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:

Frojecl narne: Lcalizaclart


Buj-ld Tarqet : i'^ndrcid i .6
c* t <):ri. rlirie : .i,oc:i.1..i. si::.i.c;n
ge rirnir:r : Cre . fjxa ti:p1 e . oci.1. i. iic.i.
Crea.i'e Acli.iiv: lccalizacicn

ApFl

:i.

:i.

Facka

F1:!.n

f:iK V+::r'ri.i.cn:

.1.

c_,r)

http://www. and roidlocale.com

161

El gran libro de Android

Por razones de seguridad acceder

a la

informacin de localizacin est

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:

los permisos

de

Ai]CASS FTI.JF: I,fJL-AT:OI


ATjCESS a-l-r.\Rs3 LCATiON

Puedes hacerlo a travs de los cuadros de dilogos, como se muestra a


continuacin:
r ct,

Android llanifest Permissions

E S E 0 *r

P+misdors

*ses Finnission

f:-,add;l

fui;;;1
iiur*iJ
t sr"t,l
l fl

,"l,iilir.'tlppr'*iii

'Attr*tr{esfsrtcetPrmisr
@ Thc useq-permission tag rcqueste

'permbdon' that thc <ontaining packagr rnust


be granted in ordcr for it to operate correctly,

N'-"

"nJi"iJ.p"'*iuiio".tciii-caniE-Lo

I*:.f,i::nfjffi;*"#;r""itqp F1*,iil

O aadiendo las siguientes lneas en elfichero XML.


.:lisiir$ -piij] ,l}i.gsi or.]nd]:c j d : nr.m,.i)= ar:rfi:ci.r:l.. pil:r*:i.s;: i on , ACa.jFSS_COARS*_i,,C,All':Ct{',,/.
"
'. L13tE! - peiiii ss icr:ncc)ic: jr.'rn= " ar:.dr:cil . perni ss icr:
";\ca:uss....F'rI3,-Lo,i:;\t,ijl.I,,/ >

En este primer ejemplo de posicionamiento soporta tanto una localizacin fina,

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

como puede observarse nos limitaremos a mostrar uo


Sustituye el fichero rrli:;,/1.a.;;r)iiL'rrui:.ii

nlz{r

,l'*xr-v.i.err.

con scro//.

xrrrl pofi

<r'ir:o.i. .L.vi.ci+

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. "

zmla

<i

. i:cxni'a.tk

i're.,1:ldrti

<i '.

!.:.

idt h= " fj j J.._,-, e;1


an+roici: Ia1'o'._1.*tgiit= "ij r j*f,)arer7t..
andro i c : 1 a1,ou

t...w

":>

.,'l'ezt-V i el.r
" 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

Elgran libro de Android


Ve ahora al fichero Lccarionresr

jar-a y sustituye el siguiente cdigo:

public claaa fJocalizacion :rtenda Activity Lnp].oate tocationlistener

ttn/dtt, rprecisort, "impreciso', );


,,n/dn ,
"bajon, ,'medo',, "a1tor' l ;
t'fuera de servicio't,
I'temporalmente no disponible t',
"disponible,' );
prl.vate LocationManager mane j ador ;
private TextView salida;
private String proveedor;
prl.vate atat:lc f:lna1 String

tl a =

private static final stringtl P =


private atatlc flnal" String tl E =

sCvt

r:

::.-

i.

cle

publlc voLd

onCreate (Bundle savedlnstanceState) t


supr. oncreate ( savedlnstancestate) t
seEContentview (R. layout . main)

salida = (TextView) findViewByld(R.id. sal.idal

manejador = (LocationManager) geesystemservice


log('rProveedore de localizacj.n: \n ',);
muestraProveedores

(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) ;

La prmera linea que nos interesa es la llamada

qet.syst.enserviceiLCCATlcrq SERVICE) que Crea


Locat ionlvlanager.

el

ObjetO rnanejaCor

de

tipO

La siguiente lnea hace una llamada al mtodo log O Que ser definido ms

adelante. Simplemente saca por el ,iexrview el texto indicado.

La siguiente llamada muest:'aprcvee<!;:'est) tambin es un mtodo definidO


por nosotros, que listar todos los proveedores de localizacin disponibles.
En las tres siguientes lneas vamos a seleccionar uno de estos proveedores de
localizacin. Para ello usaremos el mtodo gertsesrprrvider.( ) . En este mtodo
hay que indicar un criterio de seleccin. Aqu se podra indicar restricciones de
coste, potencia, precisin,... En este ejemplo no indicamos ninguna restriccin.

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

protected voLd onFa'rrse i)

super.r::ni?*use{);
j1,/ DeFacti.v-tiitli.j rioitf:j-car-c1a)ltes
manej

ador. rer,.-)vepdt.es i thle ) ;

Fala ahorr.r:

ba,t.,e.ria

l
.r

l':r::<>iloi:l il<,t
l:'r.ri:r.1.

i.c

vc'r

i.i.:

:i.lli::<lt:.:

:;z

].,:ic'i.ti: :i.()nI.,::.f.!i:.erle::

j.<i c'r;;Lccrt j.c'rnCi;::i.,;ed iLoc.:rtic-rl:. J.oc;..rti.,r::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:

i:'i:::: :!.rilo:::i:;<:,:i.iill
iSLr:':j.ii. i:;.rlieri;,ri i
sal ida " app*nr:1 ( r::,:,dena .r ,' \ r' )

r:;<lt:;:,r

f)i,i:t'i;

private void

i:1oriit:
1.r:re

,.

165

Elgran libro de Android

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

+. " \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 +

mane j ador . isProviderEnabled (proveedor) +


getAccuracY=" + AlMaLh.ra(0, info.qetAccuracy-i) ) I +

getPowerRequiremenE=
P

[MaLh

"

r.

. ii?i::x (

0,

:i.rf o . ge' l?overRe<ui

r'emerrl { } i

hasMonetarycost=n + info.hasMonet.arrr.Ct:st 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 .

El resto delcdigo resulta fcilde interpretar.

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

Stro'arView

tr'r, lir,r lry|

-'--*"*-"i

I
I

i};'

General

;i

Android
$ 0euicer

......t

ErnulatorControl

(l iile <:h:r*r
@ xeap

fl:
i

i
[Jre Fl

i.*crilt

, RElusrL
Relourre Explorer
s!:

Threads

to dirplay thr descriptien far

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.

6.3. Google Maps


Google Maps nos proporciona un servicio de cartografia online que podremos
utilizar en nuestras aplicaciones Android. Veamos las claves necesarias para
utilizarlo.

En primer lugar, para hacer uso de este servico necesitas una clave de

Google Maps.

Puedes encontrar informacin

en

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

Ests obligado a ofrecer mapas de Google como un servicio gratuito para


tus usuarios.

6.3.1. Obtencin de una clave Google Maps


Para poder utilizar este servicio de Google, igual como ocure cuando se utiliza
desde una pgina web, va a ser necesario registrar la aplicacin que lo utilizar.

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

168

htto://code.qooole.com/p/android/issues/detail?id=91

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.

El primer paso va a consistir en

descubrir donde est almacenado el


el entorno Eclipse accede al men
windows > Preferences > Android > Buitd. Aparecer el siguiente cuadro de

certificado digital de depuracin. Utilizando


dilogo:

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

Build output

Lunch

i,-l sitent

LogCat

F.i Norml

Llsage Stats

l''l:'y'erbose

r, Ant
,1 Data ManBqement

:,

:, Installr'Update
:

Defautt debug

keyrt** Ci{""rrXi"*-Jr.r'iJrriJlJ,$";.h"f*;;;

Help
CustDrn dbu g kryst@cl

Java

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

Elgran libro de Android

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

i ii d.v d An c lncrco nip-

Tu clave es.
i

l{b5a f HcRIIdAO

ASR

I I 6 rUqs t

6 U

2Pl,l5 AT}f

j UkKg

Esta claw es vida para todss las a$icaciones rmadas con el certificado cuya huella dactilar sea:
j

to'nt to-t" tt ot-tt.tt tn-tt *o rr,ot

00-FE-?g

Recuerda copiar en el portapapeles la clave obtenida, la necesitaremos en el


siguiente paso.

6.3.2. Un programa de ejemplo


Veamos un sencillo ejemplo que nos permite visualizar un mapa centrado en
las coordenadas geogrficas detectadas por el sistema de posicionamiento. Crea
un nuevo proyecto con los siguientes datos:

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

Lr;ii::k*g*r:i*::re: o::cJ. e:'r;i:n>i.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

Aade los siguientes permisos a tu aplicacin en Android.xml:


]}JTEFl}JE?

ACr:l!::iS_Ii' : l,l g*LOCll.T f -jl,l


A(lr:lEgfi ilAP.fiE 1.Or:lAT:tlt{

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.

I c Android Manifest \pplicatisn


-

&pplktkmTa-q{l*
al: -thc !ppug&s! tag desffibes applcation-level componnt: contrined in thc packegg

as

well as geetal applitation ttrib'Jt?r.

itij oefine n c application > tag in the Android&{anilestrml

AFFit{tr:ioe A{{rbrtls

Dcfiner thc .ttriblte5 spcrific to the appl(atoo.

N.me

rheme
Lrbcr @;#;;;#-;;
rcoo Jii*'iii.on
Dercrip{ion

Br**-

ls**]

n.r.oo.

lei."'*r.-j

Penietent

l[.",;

rr"ur.a

t33

oebussable

G-,Jt--l
L.:-:;
l:

Prs(er:

affinr\

ji

Mangespcactieify
A.fiow cea

,ffi;

urerdeta

lE4;'-j

Apliratim$odm
: . - * u-n*El!is-

Pemission

Task

: Allow t.3k repacnting

E El E

@ lE,O

- - - -

(Qcon.ercoete.android.map:(usetiu'".y1

6 *"

[niJ

&ttribt*lbrn,4auEle.md:cid.rap*{LleslibRr!l

lY::-'::::t-e'-t:T:y::tj-j'

r'1;1..

IE

17'l

Elgran libro de Android


El fichero Androidl4arrif esi' . xrnl S muestra a continuacin:

<ma::if esL. xmlns: android=,,http:

,/,i

schemas

anroid.

com,i

apk,/res,/androic"

package="c:rg.ex;lrnp).e.ejernpJ.cgc-ogJ.emaps,android:versoncode="1."

android: versionName='r
app1 i cat

.:

icn

f. . 0'r >

andro j-d : icon= "'ACrawable,/ ico::,'

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 :,

<ii:t. j.v

j.

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:,

<u;rs- ;<ik android :minSdkVerson= u? " /'>


<uB ea - persli s a

ion android

nare=

"

android. permi

ss

lon . IlfFRt{ET. / >

<uaeg -permisel"on

androl d nare - t' andro i d . permi s s ion . ACCES S


-prrnisaion
androLd : nae- tr androld. peraii s a ion. ACCESS

...

<uae

.</malif est

COARSE _.ITOCATIO!

/>

Ff litE LOCATION / >

>

Sustituye el layout r*air . xrnt. por el siguiente fichero:


< Ii<.:.1

*'

i vrlaycrit

xmlns : android= "1t.t-fs:

t' ./

sr:hemas . and:o.id. con/apk/.r.e:;./'and.t:().i.d,

android: orentat i-on= " ve:t ical.,,


android : layoub_width= " fi J i_parent,

androj-d: layout_height= ,f;-i lJreren o


<

>

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

android:apiKey-">> Tw clave de GoogLe ltape <<<"/>


.: , ,?-e 1: l- : v:Lr--*.:'iti. >

SUStitUye'.">.' Tu

obtenida en

el

clvo tie Gccgle i4aps <<<" por la Clave de GOOgle MapS


apartado anterior. Reemplaza el cdigo de

Ei emploGoc<leMaps . j ava pOf:

172

pub: j..r ci.;ist- Ej emploGoogleMaps et:i..cniil-

privette Mapcontroller

MapActivity

mapCont.rol1er,.
pri'v'aLe MapView mapView;
tr i. i,';r t- e Locat j_onManager locat ionManager

pubi:c vi::ii:t onCreate (Bundle bundle)

oncreate (bundle ) ;
setContentview (R. layout . main) ;
mapview = (MapView) findViewByrd(R.id.mapa)
;
mapView. setBui 1 t Inzoomcontrol s ( t r.lre ) ;
Ii
;silper'

setsatellite

mapView.

i,.:.:1.

.i.':t.

i:cilt t <:,1. e;:;

.:<.,r.;lr

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

ocat ionManager . requestLocat ionUpdates ( Locat ionManager .


GPS_PROVIDER, 0, O, tiew GeoUpdateHandlerO

);

,O."'(:] 1:r'i. d.i.;

pioiecrerl boofean isRouteDisptayedO


r.'e1:.

i_rr.'ri f

;.'I.

e ;

pttbl.::.c c.i.ii:i,; GeoupdateHandler :!.rr:i.*rn+*Ls

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 ) ;

.ii.)r./etride Il,i.l;:1ii: r,,<ii<i

'.'j1\erri.e p'.rbl
ri).,'rr,.^.i.

ic

onproviderDisabled(String provider) {}

'oic onproviderEnabled(string provider)

{}

de

public vci.l onStatusChanged(String provider, int, status,


Bundle extras) { }

t7,

Elgran libro de Android

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

174

ffiItrEf

Seguridad y posicionamiento

Eiptsbie

1. En el ejemplo

anterior, modifica algunos parmetros de configuracin,


como visualizar recorrido streetView o nivel inicialde zoom. verifica los

2.

resultados.
Siests utilizando un telfono real reemplaza en el cdigo anterior
Locat ionManager . GP S _ PROV IDER pof

LocationManager .NETWORK_?ROVTDER. EjeCUta de nUevO el prOgrama y


compara las dos posiciones geogrficas obtenidas.

6.4. Fragmentando los asteroides


Siguiendo con eljuego de asteroides nos interesa que cuando el misil alcance
un asteroide, este se divida en varios fragmentos. Para conseguirlo puedes seguir
las siguientes instrucciones:
Convierte la variable local <f aw*i>.l.eA$i::eI:<>:i.ci* del constructor, en una variable
global, que ser un array de tres elementos:

private

n::'ei^rsi)j.e

drawableAsteroide[]= new f,.j'weir.i..r[.-J.] ;

En el constructor cuando se quiera trabajar con bitmaps inicializaremos esta


variable de la siguiente forma:

drawableAsteroide [0] = cnl:ei:i.. qet.Resolli-,--es ()


{f 13i

drawableAstero ide

| :i

.l -

drawableAsteroide [2 ] =

<'jiln

t:e.rt:

t)r.,rab f e

P. . d

lar+a}: j- e .,r...; l: i

. (T*i:11-e.(::o1.1!'.::es: (

r:;_t

<jei

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 ;

lnicializa tambin las variables en caso de querer trabajar con grficos


vectoriales.

Aade

al

principio del mtodo <i*s!:-:ru,v*l\r,rr*:r.i::i.r:te{i.nt :i.)

el

siguiente

cdigo:

int tam;
if (Asteroides.get (i) -getnrrawableO l=drawableAsteroide [2] ) {
if (Asteroides . get ( i ) . getDrrawable ( ) ==drawableasteroide [ 1J ) {
tam=2;

] else

tam=1;

175

Elgran libro de Android


]

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) ;
)
)

Conige algn enor adicional ocasionado por este cambio.

1. Prueba los cambios propuestos

anteriormente y verifica gue cuando se


destruye un asleroide no siempre aparecn el mismo nmero de

2.

176

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.

You might also like