5 dic 2011

Curso de introducción a Android VIII (Broadcast Receivers con GPS, o cómo saber si tu novia dice la verdad cuando se va con sus amigas…, Parte II)

En esta entrada vamos a seguir aprovechando la funcionalidad que nos brinda la clase Broadcast Receiver. Esta vez aprovecharemos para explicar cómo manejar el GPS en Android con el fin de obtener la coordenada del usuario, sin que éste sea consciente de ello, mediante la famosa llamada perdida.

A modo de recordatorio, vamos a ver por encima cómo era la estructura del programa que hicimos en la entrada anterior para aprovechar las partes que nos interesan y añadirle la parte del GPS.

Main.java: Actividad "Hola Mundo" que lanza el Broadcast Receiver.

TrojanCall.java: Broadcast Receiver que atrapa las llamadas entrantes que se producen en el teléfono móvil y las filtra y procesa mediante un listener MyPhoneStateListener.

MyPhoneStateListener.java: Implementación de PhoneStateListener para recoger el estado de una llamada entrante y poder filtrarla.

A nuestra clase Main.java vamos a añadirle una función que inicialice el módulo GPS y que lance un listener para que registre la posición del usuario cada 20 segundos. Nuestro Main.java quedaría así:

Si nos fijamos en el código, se han añadido dos partes fundamentales en él: una variable global donde se almacenará la posición del usuario y un método para inicializar y recoger la posición mediante GPS.

Para recoger la posición GPS, lo primero que hacemos es obtener una instancia del manejador GPS del móvil. Una vez tenemos referenciado el manejador GPS procedemos a inicializar la variable loc mediante la última posición que hayamos obtenido del proveedor que le indiquemos al método getLastKnowLocation. En nuestro caso, hemos elegido que el proveedor sea la red telefónica LocationManager.NETWORK_PROVIDER, pero podemos elegir entre los siguientes:

  • 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.

Una vez indicado el proveedor lanzamos un listener en una clase que monitorice lo que está pasando en el GPS del móvil. Cuando lanzamos el listener LocationListener debemos añadir los siguientes métodos:

  • onLocationChanged: Este método se activa cada vez que se cumple una condición que indicaremos más adelante mediante el método requestLocationUpdates. El método requestLocationUpdates recibirá un parámetro de tiempo y otro de distancia, de esta forma onLocationChanged se activará siempre que haya pasado más tiempo y más distancia que la indicada.
  • onProviderEnabled: Este método se activa al activarse el proveedor indicado en requestLocationUpdates.

  • onProviderDisabled: Este método se activa al desactivarse el proveedor indicado en requestLocationUpdates.
  • onStatusChanged: Este método se activa al cambiar el estado del proveedor indicado en requestLocationUpdates.

Después de definir el listener, lo lanzamos mediante el método requestLocationUpdates con la condición de que registre la posición siempre que hayan pasado 20 segundos y más de 0 metros. Le indicamos también que utilice como proveedor NETWORK_PROVIDER.

Vamos a pasar ahora a la clase que recibe y envía la coordenada GPS a un servidor. La clase que se encarga de esta tarea es MyPhoneStateListener.java y tiene la siguiente pinta:

Como podemos observar seguimos el mismo procedimiento que en la entrada anterior. Simplemente hemos añadido un método privado para obtener las coordenadas moduleGPSPosition() que obtiene la latitud, la longitud y la precisión del usuario (para poder fiarnos de la coordenada) mediante los métodos getLatitude(), getLongitude() y getAccuracy() de la clase Location. Una vez obtenida la coordenada la enviamos al servidor mediante el método sendGPSinfo().

Por último, hay que añadir los permisos al AndroidManifest.xml, ya que para el GPS tenemos algunos permisos nuevos. El fichero quedaría de la siguiente manera:

Aquí os dejo un ejemplo de la salida del programa donde se ve claramente que me han pillado en la cafetería de la uni echando unas cerves... y yo que le había dicho a mi jefe que estaba currando!! :P

Y esto es todo, adjuntamos el código como siempre y espero que os guste! Saludoss!Descargar Proyecto

5 comentarios:

  1. [...] Miguel Ángel Moreno publica el octavo artículo sobre desarrollo software para Android. En este post sigue con la subcadena sobre recuperación de información del móvil de la víctima jugando con el GPS: Curso de introducción a Android VIII (Broadcast Receivers con GPS, o cómo saber si tu novia dice l... [...]

    ResponderEliminar
  2. Excelente amigo... tengo una inkietud??? en los lugares donde Google maps no tiene buen acercamiento ke se puede hacer....??? espero tu respuesta gracias...

    ResponderEliminar
  3. Hola amigo, te felicito por tus proyectos, la verdad son muy buenos, un saludo desde México y gracias por compartir tu conocimiento.

    ResponderEliminar
  4. Hola Amigo, tengo una duda, una vez que registré el BroadcastReceiver, es posible quitarlo del celular? Y De qué manera se podría hacer?

    ResponderEliminar
  5. Hola.Donde esta la parte 1??

    ResponderEliminar