Sei sulla pagina 1di 18

Look!

: Framework para Aplicaciones de Realidad Aumentada en Android

Dise o de aplicaciones con Look! n

Sergio Belln Alcarazo o Jorge Creixell Rojo Angel Serrano Laguna

En este tutorial se proponen los pasos fundamentales para la creacin de o aplicaciones utilizando el framework de realidad aumentada Look!. Primero se plantearn los pasos necesarios para denir la aplicacin a desarrollar, y despus a o e los pasos en la codicacin de una aplicacin sencilla. o o

1.

Planteando la aplicacin o

Antes de lanzarnos a programar nuestra aplicacin en Look!, debemos plano tearnos qu necesitamos hacer exactamente, y qu mdulos vamos a utilizar e e o para ello. No es lo mismo crear una galer de imgenes en tres dimensiones, a a que una aplicacin que nos site con un c o u rculo a otros usuarios en el espacio. Antes de empezar a programar, y con la funcionalidad de la aplicacin de o realidad aumentada detallada, el programador deber hacerse las siguientes a preguntas: 1. Qu tipos de entidades van a ser representadas en la realidad aumene tada. 2. Qu caracter e sticas denen estas entidades. 3. De dnde se obtienen esas entidades y sus caracter o sticas. Podr a accederse a un servidor remoto, si los datos cambian de manera dinmia ca; o albergarse de manera local, si no son susceptibles de cambios, o los datos no son compartidos. 4. Cmo se representarn grcamente. Pudiendo ser dos y/o tres dio a a mensiones. 5. Qu interacciones sern permitidas para cada entidad: e a Efectos al pulsar Efectos al arrastrar Efectos al soltar Efectos al enfocar con la cmara a 6. Si queremos que aparezca de fondo la imagen obtenida por cmara. a 7. Si es necesario localizar al usuario para obtener la funcionalidad buscada. 8. Y de ser as qu tipo de localizacin ser la adecuada: Relativa, con , e o a el sistema inercial; O absoluta, con el sistema de localizacin WiFi. o 9. Qu sistema de referencia se utiliza para situar a los elementos y al e usuario. 10. Dnde est el origen de coordenadas del mundo. o a 11. Si se necesitan a adir elementos extras de interfaz (botones, mens, n u cajas de texto, Activitys secundarias, etc.) para completar la funcionalidad requerida. Una vez tomadas las decisiones, puede comenzar el desarrollo. En las siguientes secciones se resuelve el cmo abordar estos puntos con Look!. o 2

2.

Codicando una aplicacin bsica o a

En esta seccin se explican los pasos a seguir en la codicacin de una o o aplicacin sencilla con Look!. o Se da por supuesto que el lector tiene instalado el SDK de Android en su entorno de programacin, que sabe aadir bibliotecas externas (en este caso, o n Look! ) a nuevos proyectos Android, y que sabe instalar y ejecutar estos proyectos en dispositivos f sicos o en el emulador Android.

2.1.

Creando la Activity principal

Look! ofrece en la Activity LookAR el mdulo completo de realidad aumeno tada. El procedimiento habitual ser extender esta clase y realizar las inicialia zaciones pertinentes en el mtodo onCreate (el de creacin de la actividad). El e o constructor de LookAR tiene el siguiente aspecto: public LookAR ( boolean usesCamera , boolean uses3D , boolean uses2D , boolean usesHud , f l o a t maxDist , boolean f u l l s c r e e n ) Como puede observarse, sus parmetros de conguracin son mayoritariaa o mente booleanos que denen si la capa correspondiente de realidad aumentada debe ser aadida. n Tiene dos parmetros ms: maxDist, que dene la mxima distancia (medida a a a en el sistema de coordenadas jado por el programador) a la que una entidad ser visible; y fullscreen, que dene si la Activity es a pantalla completa, elimia nando la barra de tareas de Android. Normalmente, el cdigo de iniciacin de las Activity herederas seguirn el o o a siguiente esquema: public c l a s s MyARActivty extends LookAR { public MyArActivity ( ) { super ( true , true , true , true , 1 0 0 . 0 f , true ) ; } @Override protected void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( s v a e d I n s t a n c e S t a t e ) ; // I n i t e v e r y t h i n g }

} En esta caso, hemos denido una actividad que muestra todas las capas de realidad aumentada, incluida la camera, a pantalla completa y que muestra elementos a una distancia mxima de 100 unidades. a Recuerda que para que pueda mostrarse la cmara, ha de aadirse el siguiena n te permiso al maniesto de la aplicacin: o

<u s e s p e r m i s s i o n android:name= a n d r o i d . p e r m i s s i o n .CAMERA /> Con este paso ya podr amos lanzar la Activity y entrar en la realidad aumentada. Pero an no ver u amos nada, aparte de la cmara de fondo, puesto que a no hemos denido ningn elemento para que sea mostrado. u

2.2.

Deniendo los elementos de la aplicacin: EntityData o

Para mostrar entidades en la realidad aumentada, debemos aadir elementos n EntityData que puedan ser procesados y convertidos en WorldEntity. Modiquemos el mtodo onCreate de MyARActivity, para aadir un elee n mento: @Override public void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { super . onCreate ( s a v e d I n s t a n c e S t a t e ) ; // C r e a t e t h e e l e m e n t d a t a EntityData data = new EntityData ( ) ; data . s e t L o c a t i o n ( 1 0 , 0 , 0 ) ; // Add t h e d a t a t o t h e d a t a h a n d l e r LookData . g e t I n s t a n c e ( ) . getDataHandler ( ) . addEntity ( data ) ; // Updates t h e r e c e n t added d a t a LookData . g e t I n s t a n c e ( ) . updateData ( ) ; } Primero creamos un elemento vac y lo situamos en la posicin (10, 0, 0). o, o Despus, lo aadimos al mdulo de datos, y nalmente actualizamos para que se e n o muestren los cambios realizados. Si ahora ejecutamos, veremos que, tras orientar la cmara en la direccin adecuada, aparecer un cubo con un cuadro de texto, a o a que indica el identicador de la entidad y su tipo, en este caso null, puesto que no se deni la propiedad (Figura 1). o Esta apariencia es creada de manera automtica por la factor WorldEna a tityFactory, que es la que Look! instancia por defecto. Sin embargo, en nuestras aplicaciones querremos denir nuestras propias apariencias. Para ello deberemos implementar nuestras propias factor Worlas dEntityFactory.

2.3.

Deniendo factor de elementos as

Una factor de elementos, heredera de WorldEntityFactory, debe sobreesa cribir un unico mtodo: createWorldEntity(EntityData data). e Supongamos que nuestros elementos tienen una propiedad llamada name, que indica el nombre del elemento. Y una propiedad color, que indica su color. Queremos que, en su representacin, aparezca, en dos dimensiones, un texto con o

Figura 1: Captura de la aplicacin tras aadir un elemento o n el nombre del elemento, y en tres dimensiones, un cubo del color indicado por la propiedad. El cdigo para la factor ser el siguiente: o a a public c l a s s MyWorldEntityFactory extends WorldEntityFactory { public s t a t i c f i n a l S t r i n g NAME = name ; public s t a t i c f i n a l S t r i n g COLOR = c o l o r ; @Override public WorldEntity c r e a t e W o r l d E n t i t y ( EntityData data ) { WorldEntity we = new WorldEntity ( data ) ; we . setDrawable2D ( new Text2D ( data . g e t P r o p e r t y V a l u e (NAME) ) ) ; Entity3D drawable3d = new Entity3D ( new Cube ( ) ) ; S t r i n g c o l o r = data . g e t P r o p e r t y V a l u e (COLOR) ; i f ( c o l o r . equals ( red )){

drawable3d . s e t M a t e r i a l (new Color4 ( 1 . 0 f , 0.0 f , 0.0 f ) ) ; } else i f ( c o l o r . equals ( green )) drawable3d . s e t M a t e r i a l (new Color4 ( 0 . 0 f , 1.0 f , 0.0 f ) ) ; // . . . we . setDrawable3D ( drawable3d ) ; return we ; } } Como vemos, primer creamos un WorldEntity que recibe como atributo el elemento con los datos. Despus denimos para su representacin en dos dimene o siones un texto, y para su representacin en tres dimensiones, un Entity3D que o contiene un cubo, y al que se la asigna un color, atendiendo al valor de la propiedad. Ahora debemos comunicarle a LookData qu factor debe utilizar para la e a creacin de entidades. As que aadimos el siguiente cdigo en el onCreate de o n o la aplicacin: o LookData . g e t I n s t a n c e ( ) . setWorldEntityFactory ( new MyWorldEntityFactory ( ) ) ; // Cr e a t e t h e e l e m e n t d a t a EntityData data = new EntityData ( ) ; data . s e t L o c a t i o n ( 1 0 , 0 , 0 ) ; data . s e t P r o p e r t y V a l u e ( MyWorldEntityFactory .NAME, Element 1 ) ; data . s e t P r o p e r t y V a l u e ( MyWorldEntityFactory .COLOR, green ) ; EntityData data1 = new EntityData ( ) ; data1 . s e t L o c a t i o n ( 1 0 , 0 , 5 ) ; data1 . s e t P r o p e r t y V a l u e ( MyWorldEntityFactory .NAME, Element 2 ) ; data1 . s e t P r o p e r t y V a l u e ( MyWorldEntityFactory .COLOR, red ) ; // Add t h e d a t a t o t h e d a t a h a n d l e r LookData . g e t I n s t a n c e ( ) . getDataHandler ( ) . addEntity ( data ) ; LookData . g e t I n s t a n c e ( ) . getDataHandler ( ) . addEntity ( data1 ) ; // Updates t h e r e c e n t added d a t a LookData . g e t I n s t a n c e ( ) . updateData ( ) ;

Asignamos la factor y aadimos dos entidades, una roja y otra verde. a n El resultado de la ejecucin de esta aplicacin es el mostrado por la gura o o 2.

Figura 2: Captura de la aplicacin con la nueva factor o a

2.4.

A adiendo interacciones n

Cada una de las entidades permiten que le sean aadidos una serie de listen ners que respondan a los distintos eventos que puedan surgir durante la ejecucin de la aplicacin. o o 2.4.1. A adiendo procesado de eventos tctiles: TouchListener n a

Cuando una entidad reciba un evento tctil, pasar ese evento a todos los a a listeners de su lista de TouchListener. Cmo puede verse en la gura 3, la o interfaz dene mtodos para los tres tipos de eventos tctiles principales. Cada e a uno de los mtodos recibe como parmetro la entidad que recibi el evento y e a o las coordenadas de pantalla dnde sucedi. o o

Figura 3: La interfaz TouchListener Supongamos que, siguiendo el ejemplo desarrollado hasta ahora, queremos que cada vez que se toque uno de los elementos, ste se desplaza una unidad en e 7

el eje coordenado y. Para lograrlo, implementar amos el siguiente TouchListener : public c l a s s MyTouchListener implements T o u c h L i s t e n e r { @Override public boolean onTouchDown ( WorldEntity e , float x , float y) { P oi nt 3 p = e . g e t L o c a t i o n ( ) ; LookData . g e t I n s t a n c e ( ) . getDataHandler ( ) . u p d a t e P o s i t i o n ( e . getData ( ) , p.x, p.y 1, p. z ); return true ; } @Override public boolean onTouchUp ( WorldEntity e , float x , float y) { return f a l s e ; } @Override public boolean onTouchMove ( WorldEntity e , float x , float y) { return f a l s e ; } Slo nos quedar aadir este listener a la lista de TouchListener de cada o a n una de las entidades. Para ello, aadimos la siguiente l n nea al cdigo de creacin o o de entidades de MyWorldEntityFactory: we . add To uch Lis ten er (new MyTouchListener ( ) ) ; La gura 4 muestra una captura de la aplicacin, tras tocar uno de los eleo mentos. Puede apreciarse como el TouchListener ejecut su lgica y traslad la o o o entidad. 2.4.2. A adiendo eventos de cmara CameraListener n a

Look! considera un evento de cmara cundo el usuario enfoca (o deja de a a enfocar) directamente una entidad con el centro de su dispositivo. Cmo muestra o la gura 5, CameraListener cuenta con dos eventos: uno para cundo el usuario a enfoca la entidad, y otro para cundo deja de enfocarla. a Es decir, si colocamos el dispostivo tal que una entidad ocupe el centro de la pantalla, se ejecutar el mtodo onCameraEntered. Cundo, tras mover el a e a dispositivo, la entidad abandone la zona central, se lanzar el mtodo onCamea e raExited. Ambos reciben como parmetro el objeto que recibi del evento. a o Supongamos que, en el ejemplo seguido hasta ahora, queremos que al enfocar directamente una entidad, cambie su malla de un cubo a un plano cuadrado, y que recupere su estado original cundo el usuario deja de de enfocar. El cdigo a o necesario ser el siguiente: a

Figura 4: Captura de la aplicacin tras pulsar uno de los elementos o

Figura 5: La interfaz CameraListener

public c l a s s MyCameraListener implements Camer aListener { private s t a t i c S q u a r e P r i m i t i v e s q u a r e = new S q u a r e P r i m i t i v e ( ) ; private Drawable3D oldDrawable ; @Override public void onCameraEntered ( WorldEntity e n t i t y ) { oldDrawable = e n t i t y . getDrawable3D ( ) ; e n t i t y . setDrawable3D ( s q u a r e ) ; } @Override public void onCameraExited ( WorldEntity e n t i t y ) { e n t i t y . setDrawable3D ( oldDrawable ) ; } } Ahora deber amos aadir el listener a la lista de CameraListener. Para ello, n aadimos el siguiente cdigo a la factor de elementos: n o a we . addCameraListener (new MyCameraListener ( ) ) ; La gura 6 muestra una captura de la aplicacin, mientras el usuario enfoca o directamente a una de las entidades. Puede apreciarse como el CameraListener ejecut su lgica y cambi la malla 3D del elemento. o o o

2.5.

A adiendo un HUD a la aplicacin n o

Look! permite aadir vistas Android a modo de HUD. Estas vistas podr n an facilitar la interaccin con el usuario. Por ejemplo, si quisiramos aadir un o e n texto para dar cierta informacin al usuario, podr o amos utilizar una TextView, con el texto requerido, alojada en la capa de HUD. Supongamos que ahora queremos aadir a nuestra aplicacin de ejemplo, n o un botn en la parte superior. De momento solo queremos que aparezca, ya le o aadiremos funcionalidad despus. n e Lo primero que deber amos hacer ser asegurarnos de que la capa HUD a est congurada a true, en la llamada al constructor de LookAR desde MyAa RActivity. Despus, denimos una vista con un layout XML de Android, que e contenga lo que buscamos para nuestro HUD (en este caso, un unico botn): o <?xml version= 1 . 0 e n c o d i n g= u t f 8 ?> <L i n e a r L a y o u t x m l n s : a n d r o i d= h t t p : // schemas . a n d r o i d . com/ apk / r e s / a n d r o i d a n d r o i d : o r i e n t a t i o n= v e r t i c a l a n d r o i d : l a y o u t w i d t h= f i l l p a r e n t a n d r o i d : l a y o u t h e i g h t= f i l l p a r e n t 10

Figura 6: Captura de la aplicacin mientras se enfoca directamente a uno de o los elementos. Puede apreciarse como su representacion 3D ha cambiado de un cubo a un plano. > <Button a n d r o i d : t e x t= Button a n d r o i d : i d=@+i d / button1 a n d r o i d : l a y o u t w i d t h= w r a p c o n t e n t a n d r o i d : l a y o u t h e i g h t= w r a p c o n t e n t > </ Button> </ L i n e a r L a y o u t> Supongamos que este archivo es nombrado como main.xml, y est guardaa do en la carpeta de recursos layout de Android. Deber amos aadir el siguiente n cdigo en MyARActivity para que esta vista apareciera como HUD: o @Override public void onCreate ( Bundle s a v e d I n s t a n c e S t a t e ) { // . . . ViewGroup v = t h i s . getHudContainer ( ) ; v . addView ( LookARUtil . getView (R. l a y o u t . main , null ) ) ; } Con getHudContainer obtenemos el contenedor del HUD, al que podemos aadirle vistas. En este caso, utilizamos la funcin de LookARUtil para crear n o una vista a partir de un archivo de recurso, y la aadimos. n El resultado de la ejecucin es el mostrado por la gura 7. o

11

Figura 7: Captura de la aplicacin con HUD. Podemos comprobar arriba a la o izquierda como se aadi el botn. n o o

2.6.

Congurando una base de datos

Cuando queremos que los elementos que han sido aadidos durante una n ejecucin, sean recordados en subsecuentes ejecuciones, debemos utilizar una o base de datos. Look! ofrece la creacin de una base de datos, a travs de unos pocos pasos. o e 2.6.1. Extendiendo el ContenProvider

La clase LookSQLContentProvider representa una base de datos genrica, e que el usuario debe extender para utilizarla. La extensin es sencilla, slo neceo o sitamos denir el nombre de la base de datos, y la autoridad. public c l a s s MyContentProvider extends LookSQLContentProvider { public MyContentProvider ( ) { super ( mydatabase . db , e s . ucm . m y a r a c t i v i t y . c o n t e n t p r o v i d e r ) ; } } En este caso, el nombre para la base de datos ser mydatabase, y la autoridad, a el nombre del paquete dnde se encuentra alojada la clase. o Ahora, para que la base de datos sea accesible desde la aplicacin, debemos o denir el content provider. Deber amos aadir la siguiente l n nea a AndroidManifest.xml: 12

<p r o v i d e r android:name= e s . ucm . m y a r a c t i v i t y . c o n t e n t p r o v i d e r . MyContentProvider a n d r o i d : a u t h o r i t i e s= e s . ucm . m y a r a c t i v i t y . c o n t e n t p r o v i d e r > </ p r o v i d e r> En name, ponemos la ruta hasta la clase, y en authorities, la autoridad denida en el constructor. 2.6.2. Incorporando al DBDataHandler

Por defecto, el mdulo de datos LookData, instancia como DataHandler un o BasicDataHandler, que est basado en una lista Java, que contiene todos los a datos. Sin embargo, para manejar la base de datos, necesitamos utilizar un DBDataHandler, y as debemos congurarlo en el onCreate de la aplicacin, con el o siguiente cdigo: o LookData . g e t I n s t a n c e ( ) . s e t D a t a H a n d l e r ( new DBDataHandler ( t h i s ) ) ; El DBDataHandler se encarga de cargar el content provider denido en el maniesto de la aplicacin, y de dar acceso a la base de datos con sus mtodos, o e de manera transparente. Los elementos que se aadan a travs del mtodo addEntity del DBDan e e taHandler sern guardados en la base de datos, y sern accesibles en siguientes a a ejecuciones.

3.

Preparando el Sistema de Localizacin o

La localizacin por Wi conlleva una serie de pasos previos de preparacin o o para que esta funcione correctamente. Para ello, junto al framework Look! se provee la aplicacin CNWi que implementa de manera sencilla todos los pasos o necesarios para preparar el entorno de localizacin. o Asimismo, el sistema de navegacin inercial requiere el ajuste de una serie o de parmetros para un funcionamiento adecuado. a En esta seccin se describe cmo utilizar el programa CNWi para llevar a o o cabo la conguracin necesaria y empezar a utilizar el sistema de localizacin o o por Wi en las aplicaciones desarrolladas con el framework, y cmo ajustar los o parmetros de navegacin inercial. a o

3.1.
3.1.1.

Denicin de Nodos y Puntos de Acceso o


Denicin de Nodos o

En primer lugar es necesario denir una serie de nodos en el mapa del edicio sobre el que se quiere utilizar la localizacin. Se recomienda una distancia o optima entre nodos de entre 5 y 10 metros en funcin del nmero de puntos o u de acceso a utilizar. 1 Estos nodos se etiquetan con un identicador unico y
1 Se pueden denir varios nodos para una misma localizacin, de forma que la captura de o datos se realice en diferentes puntos de, por ejemplo, una misma habitacin. Todos los nodos o

13

escriben en un chero de nombre Lugares.txt con el siguiente formato: [Id, Planta, Coordenada X, Coordenada Y, Nombre]
2

En la gura 8 se muestra un ejemplo de seleccin y etiquetado de nodos. El o chero resultante se muestra a continuacin: o 1 2 3 4 5 5 5 5 14 5 H a b i t a c i o n 8 4 banno 4 4 Cocina 2 1 Salon

El chero resultante debe incluirse en la raiz de la tarjeta SD del dispositivo.

Figura 8: Ejemplo de Denicin de Nodos o

3.1.2.

Denicin de Puntos de Acceso o

El siguiente paso consiste en la denicin de los puntos de acceso a utilizar en o el sistema de localizacin. Es importante tener en cuenta que aunque un mayor o nmero de puntos de acceso aumentar la precisin, los puntos de acceso deben u a o de ser estables ya que si uno de ellos deja de funcionar afectar al sistema de a localizacin. o Esto paso puede llevarse a cabo de dos formas: Denicin Manual o Si se desea restringir los puntos de acceso a utilizar, debern denirse las direca ciones MAC de los puntos de acceso elegidos en el chero APs.txt. A continuacin se muestra un ejemplo del contenido de este chero: o 0 0 : 1 1 : f 5 : a1 : 4 7 : ac 00:1 a :2 b :5 b : f f :28 7 0 : 7 1 : bc : 8 a : 6 b : c f
tendr las mismas coordenadas aunque diferente id. Esto permite aumentar la precisin al an o utilizarse un mayor nmero de muestras en la inferencia de la posicin. u o 2 Si se desea integrar el sistema de localizacin mediante Wi con el sistema de Navegacin o o Inercial, las coordenadas debern estar expresadas en metros. a

14

El chero resultante debe incluirse en la raiz de la tarjeta SD del dispositivo. Deteccin automtica o a Tal y como se muestra en la gura 9, CNWi proporciona un mtodo de detece cin automtica de puntos de acceso y creacin del chero correspondiente. o a o

Figura 9: CCNWi: Deteccin automtica de Puntos de Acceso o a

3.2.

Captura de Datos

El siguiente paso es la captura de datos en cada uno de los nodos denidos para la elaboracin del mapa de radio. Para ello, CNWi proporciona un sistema o automtico de captura de datos, como se aprecia en la gura 10. a Para llevar a cabo la captura de datos, el usuario deber colocarse en cada a uno de los nodos denidos en el paso 3.1.1, indicar su id y pulsar en el botn o Entrenar. Cuando haya terminado la captura de todos los nodos, el usuario deber pulsar el botn Guardar para que los datos sean procesados y se genere a o el archivo de mapa de radio. En este punto el sistema est listo para empezar a localizar el dispositivo a desde cualquier aplicacin. o

3.3.

Probando la Localizacin por Wi o

CNWi proporciona un mdulo para probar la localizacin, mostrando la o o informacin de la ubicacin actual en tiempo real. Este mdulo puede verse en o o o la gura 11 y permite asegurarnos de que la seleccin de nodos es la adecuada o y que el sistema de localizacin funciona correctamente. o

15

Figura 10: CCNWi: Captura de Datos

Figura 11: CCNWi: Probando la localizacin o

16

3.4.
3.4.1.

Ajuste de Parmetros del Sistema de Navegacin Inera o cial


Factor de Orientacin o

El sistema de navegacin inercial tiene en cuenta la orientacin del dispoo o sitivo para calcular el desplazamiento en las coordenadas (X,Y). Si estamos trabajando sobre un mapa cuyo eje Y no est alineado con el Norte, es necea sario especicar el factor de correccin mediante el parmetro NORTH de la o a clase Mapa contenida en el paquete es.ucm.look.locationProvider.map. Esta informacin se utiliza para mapear las coordenadas reales a coordeo nadas del mapa de manera automtica y transparente para el programador de a aplicaciones. 3.4.2. Escala

Si se desea hacer un dibujado de la posicin del usuario sobre una imagen, o es posible ajustar este parmetro y utilizar las funciones proporcionadas en a la clase Mapa del paquete es.ucm.look.locationProvider.map para convertir las coordenadas reales a coordenadas de la imagen. Para ello es necesario ajustar el parmetro SCALE contenido en dicha clase a para indicar la correspondencia entre p xeles y metros.

4.

Integrando localizacin o

A la hora de integrar localizacin en nuestra aplicacin, en primer lugar se o o debe indicar si se utilizar el subsistema de Localizacin por Wi, el subsistema a o de Navegacin Inercial o ambos de manera combinada. Para ello se debe inio cializar la clase LocationManager 3 con los parmetros correspondientes a cada a uno de ellos: public LocationManager ( Context c o n t e x t , boolean w i f i , boolean i n s ) ; Una vez hecho esto, se puede iniciar y detener la localizacin mediante los o mtodos start() y stop(). Esta clase se encarga de inicializar y parar los servicios e de localizacin necesarios, actualizar los datos de la posicin, combinarlos si es o o necesario y proporcionar acceso a los mismos desde la aplicacin. o En el siguiente ejemplo se muestra como se utilizar el sistema de navegacin a o por Wi desde una aplicacin desarrollada mediante el framework: o LocationManager l o c a t i o n = new LocationManager ( this , true , f a l s e ) ; location . start (); ... P oi nt 3 p o s i c i o n = l o c a t i o n . g e t P o s i t i o n ( ) ; // Para a c t u a l i z a r e l mundo con l a nueva p o s i c i o n : LookData . g e t I n s t a n c e ( ) . getWorld ( ) . s e t L o c a t i o n ( p o s i c i o n ) ; ...
3 LocationManager

es la interfaz con el sistema de localizacin. o

17

l o c a t i o n . stop ( ) ; NOTA: Para que todo funcione correctamente, se deben aadir los siguientes n permisos al maniesto de la aplicacin: o <u s e s p e r m i s s i o n android:name= a n d r o i d . p e r m i s s i o n . CHANGE WIFI STATE /> <u s e s p e r m i s s i o n android:name= a n d r o i d . p e r m i s s i o n . ACCESS WIFI STATE /> <u s e s p e r m i s s i o n android:name= a n d r o i d . p e r m i s s i o n .WRITE EXTERNAL STORAGE />

18

Potrebbero piacerti anche