Una API de realidad aumentada para Android

Cada día son más las aplicaciones que hacen uso de la nueva tecnología de realidad aumentada (AR).

Esta tecnología, que consiste en combinar elementos virtuales sobre una visión real del entorno físico, parece que ha llegado para quedarse y probablemente, dentro un plazo corto de tiempo, será algo más que habitual verla integrada en multitud de aplicaciones.

Las compañías tecnológicas conocen bien sus posibilidades y ya podemos ver ejemplos como Google Googgles o Nokia Point & Find.

Su implantación en los dispositivos móviles se está viendo acelerada por la rápida evolución de estos ya que la presencia de una cámara, un GPS y una brújula en combinación con una conexión de datos permite crear aplicaciones bastantes completas.

Si nos queremos lanzar a crear nuestra propia aplicación de realidad aumentada en Android hemos de saber que no tenemos por qué empezar desde cero. La empresa austriaca Mobilizy ha creado una API que, junto con su ya conocida aplicación Wikitude, nos permite desarrollar aplicaciones de realidad aumentada para nuestro terminal.

Vamos a ver cómo dar los primeros pasos para crear nuestra aplicación de realidad aumentada en Android. Para el ejemplo se utilizará el entorno de desarrollo Eclipse.

Descargar la aplicación Wikitude

Uno de los requisitos para poder usar la vista de cámara de realidad aumentada es tener instalada y arrancada la aplicación Wikitude dentro de nuestro dispositivo. Si vais a probar sobre un terminal podéis descargarla desde el Android Market. Si en cambio queréis hacer las pruebas desde el emulador tendréis que conseguir el APK de modo extraoficial e instalarlo. Para esto último y una vez tengáis el paquete desde la consola debéis teclear:

adb install com.wikitude.apk

Además el AVD sobre el que vayáis a probar deberá tener simulado una tarjeta SD.
Una vez instalada es importante que arranquemos la aplicación para que cuando empecemos a desarrollar nuestra aplicación pueda acceder a la vista de la cámara. Para iniciar la aplicación esta ha de detectar una ubicación por lo que si vamos a probar desde el emulador tendremos que utilizar la simulación de GPS. Para ello mientras la aplicación se encuentra en la pantalla de “Loading” debéis lanzar coordenadas al emulador. Esto se puede hacer de dos formas:

  • A través del Eclipse: En la perspectiva DDMS de Eclipse, en la pestaña Emulator Control, encontraremos una sección llamada “Location Controls” donde podemos lanzar las coordenadas que deseemos.
  • A través de la consola: conéctate al emulador y lanza el comando geo fix. Por ejmplo:
    telnet localhost 5554
    geo fix -82.411629 28.054553

Es conveniente que lances repetidas veces las coordenadas hasta que la aplicación recoja alguna y arranque con ese posicionamiento.
Una vez hecho esto ya podremos probar nuestros desarrollos con la API de Wikitude. Vamos a ver ahora como hacer un ejemplo sencillo.

Descargar la API

Podemos descargarnos un Zip con los archivos necesarios en http://www.wikitude.org/en/developers. Dentro de este ZIP vamos a encontrar:

  • wikitudearintent.jar (jar que contiene el API que vamos a utilizar)
  • documentación
  • ejemplos

Lo que vamos a necesitar para utilizar el API será el .jar que habrá que incluir en el build path de nuestro proyecto.

Mi primera aplicación de AR

Para empezar creamos un nuevo proyecto Android.

Añadimos el .jar con el API de Wikitude, wikitudearintent.jar. Para ello:

Project-> Properties->Java Build Path -> Libraries -> Add external Jars.

Una vez hecho esto podemos empezar a escribir las primeras líneas. Para el ejemplo hemos creado una actividad (MiRealidadAumentada).

Los dos primeros objetos que vamos a utilizar y que nos proporciona la API son:

  • WikitudeARIntent: nos permitirá lanzar la vista de la cámara de realidad aumentada. En este objeto podemos almacenar todos los puntos de interés (POIs) que deseemos mostrar.
  • WikitudePOI: este objeto describe un POI que queramos mostrar.

Para comenzar crearemos un WikitudeARIntent que se lanzará al pulsar sobre el botón:

public class MiRealidadAumentada extends Activity {

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

Button b = (Button) findViewById(R.id.button1);

b.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

launchARView();

}

});

public void launchARView() {

WikitudeARIntent intent = new WikitudeARIntent(this.getApplication(), null, null, true);

addPois(intent);

try {

intent.startIntent(this);

} catch (ActivityNotFoundException e) {

AbstractWikitudeARIntent.handleWikitudeNotFound(this);

}

}

private void addPois(WikitudeARIntent intent) {

// Añadir puntos de interés

}

}

Los parámetros necesarios para el constructor serían:

WikitudeARIntent (Application application, String applicationKey, String developerName, boolean debugMode)

Los argumentos applicationKey y developerName se utilizan cuando has registrado vuestra aplicación a través de la página Mobilizy. Si rellenáis el formulario de registro te enviarán por correo una API Key que podréis usar en vuestra aplicación y que os permitirá eliminar la marca de agua de la vista de cámara.

Para obtener esta API key lo podéis hacer a través de la siguiente página: http://w4client.mobilizy.mobi/w4/jsp/keyGenerator.jsp

Como veis al objeto WikitudeARIntent se le han de añadir los puntos de interés que se van a querer mostrar. Para ello vamos a hacer uso del objeto WikitudePOI del que antes hablámos:

private void addPois(WikitudeARIntent intent) {

Resources res = getResources();

WikitudePOI poi = new WikitudePOI(40.441346, -3.785702,636, "Paradigma Tecnológico", "La empresa ágil");

poi1.setLink("http://www.paradigmatecnologicom.com/");

poi1.setIconresource(getResources.getResourceName(R.drawable.icon));

intent.addPOI(poi);

}

Con esto ya podremos probar nuestra primera aplicación en un dispositivo real o en el emulador. Si vais a probar sobre este último podéis simular el movimiento del dispositivo con las teclas 1-6 del teclado numérico y para poner la vista horizantal recordad que podéis hacerlo con Ctrl+F11. De todas maneras os adelanto que depurar con el emulador es bastante incómodo ya que la simulación no funciona todo lo fluido que nos gustaría.

Cuando arranquemos la aplicación se mostrará nuestra primera pantalla con el botón que arrancará la vista de AR:

Vista de inicio de nuestra aplicación de realidad aumentada

Al pulsar sobre el icono del POI que hemos agregado se desplegará debajo una ventana con la información que hemos incorpora al objeto:

Realidad aumentada en un POI concreto

Además de esta información podemos añadir un botón de detalles y personalizar la acción que queremos que haga al pulsar sobre él. Para ello debemos escribir:

poi1.setDetailAction("wikitudeapi.mycallbackactivity");

y configurar en el Manifest la actividad que se lanzará:

<activity android:name=".MiCallbackActivity"

android:theme="@*android:style/Theme.Translucent.NoTitleBar" >

<intent-filter>

<action android:name="wikitudeapi.mycallbackactivity" />

<category android:name="android.intent.category.DEFAULT" />

</intent-filter>

</activity>

Un ejemplo de implementación de una actividad puede ser un diálogo que muestre información extra asociada al POI.

En ella recuperamos el ID del POI seleccionado gracias al Extra que te proporciona el API de Wikitude:

this.getIntent().getIntExtra(WikitudeARIntentHelper.EXTRA_INDEX_SELECTED_POI, -1);

En el ejemplo hemos hecho la lista con los POI accesible desde cualquier punto de la aplicación incluyéndolo en una clase que herede de Application pero siempre se pueden utilizar otros métodos para recuperarlos.

Os dejo abajo el código de ejemplo para la actividad que muestra el siguiente diálogo cuando pulsemos sobre el botón Details:

public clss MiCallbackActivity extends Activity {

private static final int POI_CLICKED = 1;

private static final int NO_POI = 2;

private int poiId;

private List<WikitudePOI> pois;

@Override

public void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

pois = ((MiAplicacion) this.getApplication()).getPois();

poiId = this.getIntent().getIntExtra(WikitudeARIntentHelper.EXTRA_INDEX_SELECTED_POI, -1);

if (pois != null && poiId != -1) {

this.showDialog(POI_CLICKED);

} else {

this.showDialog(NO_POI);

}

}

@Override

protected Dialog onCreateDialog(int id) {

AlertDialog.Builder builder = new AlertDialog.Builder(this);

switch (id) {

case POI_CLICKED:

String title = pois.get(poiId).getName();

builder.setTitle("Información sobre: " + title);

builder.setMessage(pois.get(poiId).getIconuri());

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

}

});

break;

case NO_POI:

builder.setTitle("No existe POI asociado");

builder.setMessage("Pulse sobre un icono en la vista de cámara para obtener más información");

builder.setPositiveButton("OK", new DialogInterface.OnClickListener() {

public void onClick(DialogInterface dialog, int whichButton) {

}

});

break;

}

return builder.create();

}

Espero que esta API sirva de revulsivo para aquellas personas que quieran profundizar un poco más en la programación en Android y la Realidad Aumentada. Si alguno lo había pensado alguna vez pero veía complicado empezar con la vista de cámara y la implementación de las capas esta API salvará ese primer escalón.

Oscar Ferrer es un ingeniero multidisciplinar con más de 3 años de experiencia en el desarrollo de aplicaciones de usuario. Anteriormente estuvo ligado a proyectos de investigación donde amplió sus conocimientos sobre varios lenguajes de programación y le permitió adquirir experiencia en otros campos. Ha participado en el desarrollo de aplicaciones móviles, desarrollos Web y la adaptación de estos a la tecnología móvil. Gran interesado en la experiencia del usuario, la accesibilidad y firme defensor del código abierto. Actualmente forma parte del equipo de Paradigma Tecnológico realizando desarrollos Web y aplicaciones Android.

Ver toda la actividad de Óscar Ferrer

Recibe más artículos como este

Recibirás un email por cada nuevo artículo.. Acepto los términos legales

Posts relacionados

11 comentarios

  1. Nelson Gonzalez dice:

    Buenos días, muchísimas gracias por compartir esta información, intentare crear mi aplicación, soy nuevo en android y me apasiona mucho, quisiera aprender a programar y empezando a investigar el tema llegue a este articulo.

    De antemano pido disculpas si empiezo a molestar con preguntas.

    Muchas gracias, saludos desde Colombia.

  2. Fapes dice:

    Excelente tutorial…. Gracias.

  3. Miguel dice:

    Buenas, el unico pero que le veo, es el tener que tener instalada y arrancada la aplicación de Wikitude. Es decir, para que un usuario pueda usar mi aplicación, le tengo que indicar antes que se instale la de Wikitude ¿no? y encima, que la arranque.. buff, no lo veo

  4. gian dice:

    Gracias por el tutorial pero no habra una forma de que no tenga instalado el wikitude?..es decir adherir el codigo del wikitude a mi proyecto como una libreria o un plugin para no instalarlo aparte ese seria el inconveniente..espero que me puedas ayudar graciass

  5. Oscar Ferrer dice:

    Hola Gian.

    Esta plataforma ha evolucionado mucho desde que se publicó el post. Actualmente ya no es necesario el incómodo requisito de tener instalado Wikitude. Además han añadido nuevas Views y la forma de interactuar con estas.

    Te recomiendo que si estas interesado en comenzar a programar con el SDK de wikitude te pases por la página de developers para ver las novedades.

    Un saludo y ánimo con el desarrollo :)

  6. nelson redondo dice:

    estuve implementando tus códigos fuentes en el adt de java y me manda muchos errores, me gustaría que hicieras un nuevo post pero con la librería actualizada de wikitude que lo necesito para mi proyecto de grado y lo mas parecido es lo que tu realizaste en este post

  7. Maria del Carmen Morales dice:

    Comparto la necesidad de Nelson, por favor ayudanos con un nuevo post con la libreria actualizada, yo tambien lo necesito para mi proyecto de grado, y hay poca informacion util como la tuya, te agradecería también de sobremanera el que nos puedas ayudar. Graciassssss nuevamente…

  8. Mario dice:

    hola Oscar me gusto tu articulo, y e intentado guiarme con tu articulo para hacer mi proyecto en wikitude y tengo un error. Me sale un error al llamar ha (WikitudeARIntent). Y ya he importada a carpeta libs del proyecto la libreria de wikitude .jar.

    No se donde puedo estar equivocándome, se agradece cualquier ayuda. por favor..

  9. Mario dice:

    Ya pase por la ayuda de Wikitude y termine mas perdido que piojo en cabeza de calvo.

    Oh maestro Oscar ayuda a entender wikitude a estas deseosos de conocimiento…..

    por favor…..

  10. Mario dice:

    Oscar no poder subir tus ejemplos a gitHub, para que todos tus seguidores puedan guiarses de tus ejemplos y correr la voz de blog.

Escribe un comentario