Download Integración de guia1 y guia2 utilizando la aplicación Mixare
Document related concepts
no text concepts found
Transcript
Guía N° 3 Universidad de El Salvador Universidad de El Salvador Facultad de Ingeniería y Arquitectura Escuela de Ingeniería en Sistemas Programación en Dispositivos Móviles Integración de guia1 y guia2 utilizando la aplicación Mixare Responsable Ing. César Augusto González Rodríguez Colaboradores Bryan Josué Rodríguez Parada Alexandra María Cañas Tovar José Antonio Sánchez Delgado Luis Alejandro González Taller Sistema de geo localización de espacios físicos de la FIA Requisitos de los participantes Conocimientos básicos de JAVA y XML. Preferiblemente un móvil (smartphone) con gps, Sistema operativo Android 2.2 o superior. Duración del taller 1 horas 2012 Página 1 Guía N° 3 Universidad de El Salvador ¿Qué es Mixare? Mixare (Mix Augmented Reality Engine) es un navegador de realidad aumentada para Android e iOS desarrollado por Peer Internet Solutions y licenciado como GNU GPL v3. Mixare puede funcionar en los siguientes modos: Independiente. Como aplicación que muestra puntos de interés obtenidos de Wikipedia. Invocado desde un enlace HTML. Utiliza los puntos que se le indiquen desde el enlace. Invocado desde otra aplicación. Versión modificada. Como única aplicación basada en mixare Su estructura de clases se puede dividir en varios grupos. Obteniendo como resultado: Para poder recuperar los datos de nuestro servidor es necesario construir un JSON así como el que se muestra de ejemplo a continuación, con las mismas características. Dependerá de los datos que se necesiten para que dicho JSON se le agreguen más o menos datos. 2012 Página 2 Guía N° 3 Universidad de El Salvador { "status": "OK", "num_results": 3, //número de resultados obtenidos "results": [ //nombre del Grupo de Datos recibidos en el JSON { "id": "2827", // id del POI "lat": "46.43893", // latitud "lng": "11.21706", //longitud "elevation": "1737", //altitud "title": "Penegal", //titulo "distance": "9.756", // distancia de radio “type”: “1”, // tipo de POI "webpage": "http%3A%2F%2Fwww.suedtirolerland.it%2Fapi%2Fmap%2FgetMarkerTplM%2F%3Fmar ker_id%3D2827%26project_id%3D15%26lang_id%3D9" }, { "id": "2821", "lat": "46.49396", "lng": "11.2088", "elevation": "1865", "title": "Gantkofel", "distance": "9.771", “type”: “4”, "webpage": "" }, { "id": "2829", "lat": "46.3591", "lng": "11.1921", "elevation": "2116", "title": "Roen", "distance": "17.545", “type”: “13”, "webpage": "http%3A%2F%2Fwww.suedtirolerland.it%2Fapi%2Fmap%2FgetMarkerTplM%2F%3Fmar ker_id%3D2829%26project_id%3D15%26lang_id%3D9" } ] } Observaciones: Los comentarios que se pusieron anteriormente son para hacer referencia al tipo de datos que se obtendrían del servidor para describir un POI que se coloque a través de Mixare en realidad aumentanda utilizando la cámara del celular Android. Es importante que si se desea realizar su propia aplicación utilizando Mixare respete el orden de realización del JSON mientras se esta haciendo a través del servicio web; ya que este es el formato que Mixare ocupa para leer los datos de una BD propia. Mixare es un proyecto de software libre muy extenso de modificar, por lo cual elegimos que para el presente taller se modificara la parte en la cual se dibujan los iconos que permiten renocer los POI´s creados en el taller pasado, haciendo uso de realidad aumentada. Para 2012 Página 3 Guía N° 3 Universidad de El Salvador desarrollar lo mencionado anteriormente es necesario modificar las siguientes clases que se encuentran dentro del paquete org.mixare a) Modificando la clase de java Marker.Java Agrega las siguientes sentencias dentro de abstract public class Marker implements Comparable<Marker> en la parte de la declaración de variables globales. CODIGO 1: //-----AGREGADOS-------private int idPoi; protected int tipoPoi; //--------------------- Luego debemos de modificar el constructor de la clase, para que reciba las coordenadas georeferenciales, el DataSource es decir la conexión hacia la BD, el tipo de poi que queremos ver y el Id_Poi para poder identificarlo y extraer la información del mismo por medio del DataSource. Con esto definimos cualquier objeto tipo marcador Por favor modifica el constructor de la siguiente manera: CODIGO 2: public Marker(String title, double latitude, double longitude, double altitude, String link, DataSource datasource, int tipoPoi, int idPoi) { super(); this.active = false; this.title = title; this.mGeoLoc = new PhysicalPlace(latitude,longitude,altitude); if (link != null ){ this.URL="webpage:" + link; this.underline = true; } this.datasource = datasource; this.ID=datasource.getTypeId()+"##"+title; //Controlar idPoi y tipoPoi por cada Marker this.idPoi=idPoi; this.tipoPoi=tipoPoi; } Además modifica los setters y getter de los nuevos atributo agregados idPoi y tipoPoi, de la siguiente manera: 2012 Página 4 Guía N° 3 Universidad de El Salvador CODIGO 3: //-----------AGREGADOS-----------------public int getIdPoi() { return idPoi; } public void setIdPoi(int idPoi) { this.idPoi = idPoi; } public int getTipoPoi() { return tipoPoi; } public void setTipoPoi(int tipoPoi) { this.tipoPoi = tipoPoi; } //----------------------------------------- Por favor busca el siguiente método dentro de Marker.Java public boolean fClick(float x, float y, MixContext ctx, MixState state) y modifica la siguiente sentencia: evtHandled = state.handleEvent(ctx, URL,0) como se muestra a continuación CODIGO 4: evtHandled = state.handleEvent(ctx, URL, idPoi); Observación: Si usted visualiza dentro de Marker.Java se encuentran los métodos que permiten establecer lo que es un objeto tipo marcador, como se debe de dibujar, cuales serán sus vistas, cuales son sus componentes de información, etc. Por lo cual si desea profundizar más le recomendamos ver los siguientes métodos: 2012 public void drawCircle(PaintScreen dw, Context ctx) private void cCMarker(MixVector originalPoint, Camera addX, float addY) public void draw(PaintScreen dw, Context ctx) public void drawTextBlock(PaintScreen dw) viewCam, float Página 5 Guía N° 3 Universidad de El Salvador b) Modificando la clase de java POIMarker.Java Agrega las siguientes sentencias dentro de public class POIMarker extends Marker en la parte de la declaración de variables globales. CODIGO 5: //-------------------------AGREGADO GTWORLD-------------------------public enum TYPE { WIKIPEDIA, BUZZ, TWITTER, OSM, MIXARE, GTWORLD }; public static final int E_ADMINISTRATIVO = 1; public static final int E_E_SUPERIOR = 2; public static final int BIBLIOTECA = 3; public static final int OTROS = 4; public static final int BAR = 5; public static final int CAFE = 6; public static final int RESTAURANTE = 7; public static final int ZOOLOGICO = 8; public static final int MUSEO = 9; public static final int HOSPITAL = 10; public static final int UNIVERSIDAD = 11; public static final int SUPERMERCADO = 12; public static final int JOYERIA = 13; public static final int PIZZA = 14; public static final int CASINO = 15; public static final int RESIDENCIA = 16; public static final int ESCUELA = 17; Modifiquemos el constructor en donde colocamos todos los atributos en un objeto tipo marcador, esto nos permitirá dibujar el POI en la cámara; es decir lo que realizara POIMarker.Java es hacer el respectivo constructor de toda la información relevante que nos permite visualizar en realidad aumentada los POI que hemos creado anteriormente. Codigo 6: public POIMarker(String title, double latitude, double longitude, double altitude, String URL, DataSource datasource,int tipoPoi, int idPoi) { super(title, latitude, longitude, altitude, URL, datasource,tipoPoi,idPoi); } Luego debemos de conocer cual icono de POI debemos colocar por lo cual coloca el siguiente método: 2012 Página 6 Guía N° 3 Universidad de El Salvador Codigo 7: @Override public void drawCircle(PaintScreen dw, Context ctx) { if (isVisible) { float maxHeight = dw.getHeight(); dw.setStrokeWidth(maxHeight / 100f); dw.setFill(false); dw.setColor(getColour()); double angle = 2.0 * Math.atan2(10, distance); double radius = Math.max( Math.min(angle / 0.44 * maxHeight, maxHeight), maxHeight / 25f); /* AQUI se coloca el tipo de POI que es y que ira representado por el icono */ if (distance < 100.0) otherShape(dw); else{ dw.paintCircle(cMarker.x, cMarker.y, (float) radius); Bitmap bit=null; switch(tipoPoi){ case E_ADMINISTRATIVO: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.administration); break; case E_E_SUPERIOR: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.highschool); break; case BIBLIOTECA: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.library); break; case OTROS: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.notvisited); break; case BAR: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.bar); break; case CAFE: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.coffee); break; case RESTAURANTE: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.restaurant); break; 2012 Página 7 Guía N° 3 Universidad de El Salvador case ZOOLOGICO: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.zoo); break; case MUSEO: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.artmuseum); break; case HOSPITAL: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.hospitalbuilding); break; case UNIVERSIDAD: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.university); break; case SUPERMERCADO: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.supermarket); break; case JOYERIA: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.jewelry); break; case PIZZA: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.pizzaria); break; case CASINO: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.casino); break; case RESIDENCIA: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.condominium); break; case ESCUELA: bit=BitmapFactory.decodeResource(ctx.getResources(), R.drawable.school); break; } if(bit!=null) dw.paintBitmap(bit, cMarker.x-24,cMarker.y-26); } } } 2012 Página 8 Guía N° 3 Universidad de El Salvador Observación: Como se observa el icono del POI es asignado y por ultimo se comprueba que la variable tipo BIT la cual contiene el bitmap sea distinta de null; llamando asi al método paintBitmap, el cual nos permite dibujar en la cámara los POI. Por ultimo en el paquete org.mixare busque la clase llamada MixMap.Java. Dicha clase contiene un switch que permite colocar el icono del POI dentro del mapa. Esta clase es la que nos permite colocar los POI utilizando la API de GOOGLE MAP Por lo cual busca el método public void createOverlay() y quita el modo comentario del switch hasta esta sentencia. mapView.getOverlays().add(new MarkerOverlay(point,bmp)); */ c) Agrega tu clave MD5 para ver los mapas Abre el archivo BATCH.txt y sigue las instrucciones que aparecen en dicho archivo. Ahora coloca tu clave dentro de tu aplicación en la clase MixMap.Java y busca el método public void onCreate y modifica la siguiente línea código: Codigo 8: mapView= new MapView(this, "0UYhFd0yFVh0bVQvZ0QE22EOocMxWsQv7NMdlNw"); Lo que se encuentra subrayado es la clave que tienes que sustituir por la que acabas de generar. d) Modificando el AndroidManifest.xml Para utilizar Mixare desde nuestra aplicación debemos de modificar nuestro archivo manifest agregando las siguientes sentencias, dentro de <application></application> CODIGO 9: <activity android:name="org.mixare.MixView" android:label="@string/app_name" android:launchMode="singleTop" android:screenOrientation="landscape" > <intent-filter> <action android:name="android.intent.action.VIEW" /> <category android:name="android.intent.category.DEFAULT" /> <category android:name="android.intent.category.BROWSABLE" /> <data android:mimeType="application/mixare-json" android:scheme="http" /> <data android:mimeType="application/mixare-json" android:scheme="content" /> <data android:mimeType="application/mixare-json" android:scheme="file" /> 2012 Página 9 Guía N° 3 Universidad de El Salvador </intent-filter> <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> <meta-data android:name="android.app.default_searchable" android:value="org.mixare.MixView" /> </activity> <activity android:name="org.mixare.MixListView" android:launchMode="singleTop" android:screenOrientation="user" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <activity android:name="org.mixare.MixMap" android:launchMode="singleTop" android:screenOrientation="user" > <intent-filter> <action android:name="android.intent.action.SEARCH" /> </intent-filter> <meta-data android:name="android.app.searchable" android:resource="@xml/searchable" /> </activity> <activity android:name="org.mixare.data.DataSource" /> <activity android:name="org.mixare.data.DataSourceList" /> Además debes de agregar el siguiente permiso, para utilizar los mapas desde la aplicación creada dentro de <application> </application> CODIGO 10: <uses-library android:name="com.google.android.maps" /> 2012 Página 10 Guía N° 3 Universidad de El Salvador Ahora necesitamos cambiar una sentencia de la clase MenuOpcionesActivity.Java en el método protected void onListItemClick(ListView l, View v, int position, long id) Como verás ahi se encuentra un switch el cual en el CASE 1 debemos de quitar en comentario una instrucción la cual es la siguiente: CODIGO 11: //startActivity(i); Debes quitarle la doble pleca. Esta instrucción lo que permite es levantar mixare en nuestra aplicación. Por lo cual es importantísimo que realice el cambio anterior. e) Prueba de la aplicación completa Se observa un POI creado anteriormente junto con su respectivo nombre y localización respecto al punto en donde me encuentro. 2012 Página 11 Guía N° 3 Universidad de El Salvador El punto azul es nuestra localización y el punto de abajo es el POI mostrado en la cámara anteriormente. 2012 Página 12