Gestión del GPS en Android

La finalidad de este arítulo es comprobar si el GPS esta activo y si no lo esta pedir la activación para poder recoger las coordenadas de localización.

Un detalle importante a tener en cuenta en esta artículo es que no buscamos precisión en la localización, dando por buena la que nos da la red. Si necesitamos precisión tendríamos que utilizar sólo la parte GPS y no la network_location.

Primero añadimos los permisos en el “AndroidManifest.xml”.

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />

Utilizamos el locationmanager para comprobarlo. Si no esta activo lanzamos una alerta con un “AlertDialog”.

Si indicamos que queremos activarlo, se lanza la configuración del GPS.

  final AlertDialog alert = null;
  final LocationManager manager = (LocationManager) getSystemService( Context.LOCATION_SERVICE );

  if ( !manager.isProviderEnabled( LocationManager.GPS_PROVIDER ) ) {
      AlertNoGps();
  }

  private void AlertNoGps() {
    final AlertDialog.Builder builder = new AlertDialog.Builder(this);
    builder.setMessage("El sistema GPS esta desactivado, ¿Desea activarlo?")
           .setCancelable(false)
           .setPositiveButton("Si", new DialogInterface.OnClickListener() {
               public void onClick(@SuppressWarnings("unused") final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                   startActivity(new Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS));
               }
           })
           .setNegativeButton("No", new DialogInterface.OnClickListener() {
               public void onClick(final DialogInterface dialog, @SuppressWarnings("unused") final int id) {
                    dialog.cancel();
               }
           });
    alert = builder.create();
    alert.show();
  }

Se tiene que declarar la alerta para toda la actividad para que pueda descartarla en OnDestroy para evitar una pérdida de memoria

onDestroy()
{
  if(alert != null) 
  {
      alert.dismiss ();
  }
}[code]

[b]Recepción de nuevas localizaciones[/b]

Si queremos algo más elaborado que nos permita registrarnos para recibir los cambios de posición. Lo que se suele hacer es tener una variable con la locación y poner un listener al locationmanager para que la actualice cada vez que sea necesario.

Primero definimos un atributo de nuestra clase con un objeto del tipo [i]MiLocationListener[/i] que veremos más adelante.

[code]private LocationListener locListener =  null;

En el método onCreate inicializamos el listener con la clase MiLocationListener.

	// inicializamos el GPS
	if(locListener == null)
		locListener = new MiLocationListener(this);

Si queremos sacar la localización, desde cualquier parte de nuestro código podemos escribir lo siguiente.

	// Para sacar la localización
	Location loc = locListener.getLocation();

A continuación podemos ver la clase MiLocationListener. Esta clase es autoexplicativa.

/**
 * Esta clase se utiliza para recoger los eventos de localización
 * @author seni
 *
 */
public class MiLocationListener implements LocationListener 
{
	private String TAG = "MiLocationListener";
	private Activity actividad;
	private LocationManager locManager = null;
	private Location locGPS = null; // Es la localización del GPS

	public MiLocationListener(Activity actividad)
	{
		this.actividad = actividad;
		inicializaGPS();
	}

	@Override
	public void onLocationChanged(Location location) 
	{
		locGPS = location;
	}
	@Override
	public void onProviderDisabled(String provider) 
	{
	}
	@Override
	public void onProviderEnabled(String provider) 
	{
	}
	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) 
	{
	}

	/**
	 * Des registra el location listener 
	 */
    public void unregisterLocationListener() {
    	locManager.removeUpdates( this );
    }

    /**
     * Registra el location listener
     */
    public void registerLocationListener() {
    	locManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 20, this );
    }

	/**
	 * Inicializa el GPS para que tengamos las coordenadas GPS actualizadas
	 * Se puede utilizar cualquiera de las siguientes opciones
	 * 
	 * NETWORK_PROVIDER: Determina la posición del usuario basándose en la celda telefónica en la que se 
	 * encuentre y, si dispone de conexión wifi, de la combinación del punto de acceso al que se encuentre 
	 * conectado.
	 * 
	 * GPS_PROVIDER: Determina la posición el usuario usando satélites GPS. Dependiendo de las condiciones 
	 * en las que se encuentre el usuario puede tardar más tiempo en devolver una posición buena, por 
	 * ejemplo, si se encuentra en espacios interiores.
	 * 
	 * PASSIVE_PROVIDER: Determina la posición del usuario basándose en la recogida de posiciones de otras 
	 * aplicaciones. Por ejemplo, si Google Latitude necesita recoger la posición GPS para enviarla a un 
	 * servicio web, este proveedor se aprovecha de esa acción para obtener la coordenada. Si necesitamos 
	 * saber la posición de un usuario en un determinado momento, este es el proveedor menos adecuado. 
	 * Sin embargo, este es el proveedor que menos batería gasta.
	 */
	private void inicializaGPS() {
		try {
			//Obtenemos una referencia al LocationManager
			locManager = (LocationManager)actividad.getSystemService(Context.LOCATION_SERVICE);
			registerLocationListener();
			//Obtenemos la última posición conocida
			getLastKnownLocation(locManager);
        }catch(Exception e){
    		CDILog.e(TAG,"inizializaGPS Error: " + e.getMessage(),e);
        }
	}

	/**
	 * Cogemos la última posición conocida
	 * @param manager
	 */
    private void getLastKnownLocation( final LocationManager manager ) 
    {
		locGPS = manager.getLastKnownLocation( LocationManager.GPS_PROVIDER );

        if ( locGPS == null ) {
        	locGPS = manager.getLastKnownLocation( LocationManager.NETWORK_PROVIDER );
        }

        if ( locGPS == null ) {
        	locGPS = manager.getLastKnownLocation(LocationManager.PASSIVE_PROVIDER);
        }
    }

}

Se podría utilizar onProviderDisabled y onProviderEnabled para poner la variable loc a null.

Si queremos que se lance un evento cada vez que tengamos cambios de localización, podríamos crear nuestro propio listener dentro de MiLocationListener que llamara a un método onLocacizaciónCambiada(Location location).

Por ejemplo.

private Vector escuchadores = new Vector();
...
public void addLocationListener(MiLocationListener.LocationListener escuchador)
{
    escuchadores.addElement(escuchador);
}

public void removeLocationListener(MiLocationListener.LocationListener escuchador)
{
    escuchadores.removeElement(escuchador);
}

public interface LocationListener {
    public void onLocacizacionCambiada(Location location);
}

modificamos onLocationChanged por

	public void onLocationChanged(Location location) 
	{
		locGPS = location;
		for(int i = 0; limite = escuchadores.length();i < limite; i++)
		    escuchadores.elementAt(i).onLocacizacionCambiada(locGPS);
	}

Añadir comentario

Rellene el siguiente formulario para añadir sus propios comentarios

Datos de Usuario





Añada su comentario