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 esta web. 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 esta página.

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

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