Anda di halaman 1dari 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.

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

En algunas plataformas, como windows Mobile, estamos

prcticamente

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.

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.

Cualquier dato almacenado por !a aplicacin ser asignado a su usuario Linux,

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.

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:

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

utilizados en Android:

continuacin se muestra una lista con algunos de los permsos ms

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

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

&

aplicacin nos pide este permiso con sentido o no.

mismas razones que elanterior permiso, hay que plantearse si una

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

Tu istfrr'r:,r*!*n #*r**r:r*l

rrr*rli:ir 'Jii.** J*

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

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

:ci*rrt<1itrl (alta) Muchas

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

<: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 " -', tiame= !tconl


i::.'r..:

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

Elgran libro de Android

dentro

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

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:

del mismo dominio que nuestra

aplicacin.

El

atributo

fiOn;al
danqercus

El usuario no es advertido de que se va utilizar


permiso. El usuario es advertido.

el

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


rrd.cr <-,/ s

rt

>reprrchcc i.n de vi.rleos baj o

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

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


<iirani f eE:...:>
<

: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

:!.

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

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


<

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

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

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

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

?rc j er-.1- nan're Tar,:fet

Abre

el

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


>:
1.

el

<LirreraLa.,'oui

siguiente botn dentro del

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

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

VItrR VIDSOS " / >

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:

Frojecl narne: Lcalizaclart Buj-ld Tarqet : i'^ndrcid i .6


ApFl
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
:i. :i.

Facka

.1.

c_,r)

F1:!.n

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

http://www. and roidlocale.com

161

El gran libro de Android

Por razones de seguridad acceder

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

informacin de localizacin est

los permisos

de

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


continuacin:
r ct,

Android llanifest Permissions

P+misdors

E S E 0 *r
f:-,add;l

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


a

*ses Finnission

'permbdon' that thc <ontaining packagr rnust


be granted in ordcr for it to operate correctly,

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


l fl

N'-"

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

,"l,iilir.'tlppr'*iii

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

como la que nos proporciona el GPS, como una menos precisa, como la
proporcionada por las torres de telefona celular.

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

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

como puede observarse nos limitaremos a mostrar uo


Sustituye el fichero rrli:;,/1.a.;;r)iiL'rrui:.ii
<r'ir:o.i. .L.vi.ci+ zmla .

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

idt h= " fj j J.._,-, e;1 an+roici: Ia1'o'._1.*tgiit= "ij r j*f,)arer7t..


andro i c : 1 a1,ou
.,'l'ezt-V i el.r
t...w

":>

" 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

private static final stringtl P = private atatlc flnal" String tl E =

tl a =

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

qet.syst.enserviceiLCCATlcrq SERVICE) que Crea Locat ionlvlanager.

La prmera linea que nos interesa es la llamada


el
ObjetO rnanejaCor

de

tipO

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

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

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

j1,/ DeFacti.v-tiitli.j rioitf:j-car-c1a)ltes

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


i.i.:

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

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

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

mane j ador . isProviderEnabled (proveedor) + getAccuracY=" + AlMaLh.ra(0, info.qetAccuracy-i) ) I +

"

r.

[MaLh

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

Stro'arView

tr'r, lir,r lry|

-'--*"*-"i

I I

i};'

General

;i

......t

Android $ 0euicer

ErnulatorControl

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

fl:
i

i.*crilt Threads

, RElusrL Relourre Explorer s!:

i
[Jre Fl

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.

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

Puedes encontrar informacin

en

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

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.

certificado digital de depuracin. Utilizando


dilogo:

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

El primer paso va a consistir en

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

l''l:'y'erbose Defautt debug

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

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
Tu clave es.
i

i ii d.v d An c lncrco nip6 U

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

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

}ia}r..1

Lr;ii::k*g*r:i*::re: o::cJ. e:'r;i:n>i.e.

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 itij oefine n c application > tag in the Android&{anilestrml
as

well as geetal applitation ttrib'Jt?r.

AFFit{tr:ioe A{{rbrtls

Dcfiner thc .ttriblte5 spcrific to the appl(atoo.

N.me

Br**-

: Allow t.3k repacnting

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


Pemission

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

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

f. . 0'r >

app1 i cat
j.

icn

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

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

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


<uB ea - persli s a

ion android

nare=

"

android. permi

ss

lon . IlfFRt{ET. / >

<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

Ff litE LOCATION / >

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


< Ii<.:.1

*'

i vrlaycrit
t' ./

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

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,
con. google . android. mapa . apView

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


<

>

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

obtenida en

SUStitUye'.">.' Tu

el

Ei emploGoc<leMaps . j ava pOf:

clvo tie Gccgle i4aps <<<" por la Clave de GOOgle MapS apartado anterior. Reemplaza el cdigo de

172

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

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

privette Mapcontroller

MapActivity
;

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


;silper'
.

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.

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

.:<.,r.;lr

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

onproviderDisabled(String provider) {}
{}

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

ic

'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

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.

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

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

lnicializa tambin las variables en caso de querer trabajar con grficos


vectoriales.

Aade
cdigo:

al

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

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

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.

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

Anda mungkin juga menyukai