jueves, 3 de mayo de 2012

Realidad Aumentada en Android. Geolocalización

Acceso a la geolocalización
En los post anteriores sobre realidad aumentada se ha explicado como acceder a la cámera y a la brújula (sensor de orientación espacial) del dispositivo. En este post, se explica como acceder a la geolocalización mediante el dispositivo GPS del teléfono móvil.
Lo primero que hay que hacer para conversar con los satélites y dar permisos a la aplicación para que el objeto LocationManager pueda acceder al hardware del dispositivo. Para ello, como siempre, se edita el fichero AndroidManifest.xml y se añaden estas dos lineas

<?xml version="1.0" encoding="utf-8" ?> 
<manifest android:versioncode="1" android:versionname="1.0" package="com.m607" xmlns:android="http://schemas.android.com/apk/res/android">
    <uses-sdk android:minsdkversion="10">
    <application android:icon="@drawable/ic_launcher" android:label="@string/app_name">
       
        <activity android:configchanges="orientation|keyboardHidden" 
               android:label="@string/app_name" 
      android:name=".RealidadAumentadaActivity" 
      android:screenorientation="landscape" 
      android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen">
            <intent-filter>
                <action android:name="android.intent.action.MAIN">

                <category android:name="android.intent.category.LAUNCHER">
            </category></action></intent-filter>
        </activity>
        
    </application>
 <uses-permission android:name="android.permission.CAMERA" />
    <uses-permission android:name="android.permission.LOCATION" />
    <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

</uses-sdk>



Sin estas dos líneas cada vez que la aplicación intente registrar cambios de localización, Android lanzará una excepción de seguridad y parará la aplicación.
Una vez se han incluido estas dos líneas en el manifest es el momento de implementar el listener de localización GPS;
package com.m607.orientation;

import android.location.Location;
import android.location.LocationListener;
import android.os.Bundle;

public class GPSListener implements LocationListener {
 Location localizacionActual;
 boolean cambioLocalizacion = false;

 public void onLocationChanged(Location location) {
  if (localizacionActual == null) {
   localizacionActual = location;
   cambioLocalizacion = true;
  }

  if (localizacionActual.getLatitude() == location.getLatitude()
    && localizacionActual.getLongitude() == location
      .getLongitude())
   cambioLocalizacion = false;
  else
   cambioLocalizacion = true;

  localizacionActual = location;
 }

 public void onProviderDisabled(String provider) {
 }

 public void onProviderEnabled(String provider) {
 }

 public void onStatusChanged(String provider, int status,
   Bundle extras) {
 }
}




Esta clase implementa el método onLocationChanged que pasa como argumento el objeto Localtion con la nueva localidación del dispositivo. En caso de encontrar un cambio en la localización actual frente a la localización anterior, se guarda la actual en la variable almacén y se actualiza el valor del booleano que indica el cambio de localización.
Escrito el listener queda asignarlo al objeto LocationMaganer que se recupera del contexto de la actividad principal por medio del método getSystemService pasando como argumento el Context.LOCATION_SERVICE. Posteriormente se requiere actualizaciones en la geolocalización llamando al método requestLocationUpdates, asignando un poll de 100 milisegundos, la distancia mínima para disparar un evento de localización (en este caso 1 metro) y el escuchador de evento de localización, LocationListener.
...
public void onCreate(Bundle savedInstanceState)
{
LocationManager locationManager;
locationManager =
(LocationManager)getSystemService(Context.LOCATION_SERVICE);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
100, 1, gpsListener);
}


...

No hay comentarios:

Publicar un comentario