GPS y Mapas Android

Posicionamiento y Geolocalizacion en Android.

Bueno, este tema para mi es uno de los mas interesantes y útiles, cuando hablamos de GPS automáticamente nos viene a la cabeza el típico TomTom ¿verdad? xD, con la aparición de los SmartPhones, este concepto se amplia muchiiiisimo mas! el uso del GPS no requiere para nada un mapa, podemos usarlo para muchas cosas, por ejemplo, en mi caso, tengo subida al GooglePlay una app que supervisa tu movimiento vía GPS y en caso de que estés cierto tiempo sin moverte interpreta que puedes haber sufrido un accidente y activa una alarma, que si no cancelas, enviara un SMS con tu posición al numero de teléfono que tu elijas.

Esta app esta dirigida para los que hacemos deporte solos, si te da un mareo, si te caes... etc... manda un SMS ¿útil? pos se llama SOS Sport.

La mayoría de los dispositivos Android traen incorporado un dispositivo GPS con el que podemos obtener las coordenadas donde se encuentra. Para acceder a estos datos necesitamos dos cosas: un manejador o controlador y un lisener que escuche los cambios de estado del gps (cuando nos movemos, encendemos o apagamos el GPS). Para lo primero debemos usar un servicio de sistema que obtendremos haciendo una llamada a la función getSystemService(). En concreto tendremos que usar un objeto LocationManager.

Propiedades, TextView, eclipse

Una vez obtenido el manejador o controlador, debemos definir un Listener que escuche los cambios de posición y realice las operaciones correspondientes, para ello deberemos crear una clase que extienda de la clase LocationListener, esta clase nos obligara a sobrescribir e implementar cuatro métodos:

 onLocationChanged(). Este método se llama cuando la posición GPS cambia, para mi es el mas útil, ya que nos pasará el nuevo punto y podremos calcular distancias.. etc.
 onProviderDisabled(). Este método se llama cuando el usuario desactive el GPS.
 onProviderEnabled(). Este método se llama cuando el usuario ha activado el GPS.
 onStatusChanged(). Este método se llama cuando el estado del manejador ha cambiado.

Propiedades, TextView, eclipse

La segunda línea de la imagen de arriba seria la forma de crear el lisener que hemos hablado, y la siguiente imagen de abajo, os muestro la clase que he creado para controlar los cambios del servicio de GPS. Esta clase te aconsejo que la crees en la misma clase desde donde estemos corriendo nuestra Activity o Servicio, os aconsejo esto, porque así tendremos acceso a las variables de forma mas sencilla.

Propiedades, TextView, eclipse

Fíjate, que de los 4 métodos que hemos hablado que podemos controlar, yo solo tengo código en la OnLocationChanged, (dependerá de lo que necesitemos). Lo primero es decirte que este método, recibe un objeto tipo Location que contiene un montón de datos.. latitud, longitud, velocidad, altitud, error... es muy útil, fíjate que en mi caso, lo primero que hago es recortar los decimales a 5 decimales, este objeto recibe 14 decimales!

Imagina la precisión que tiene el sistema GPS, si con 8 decimales ya tenemos una precisión de 1,11 milímetros!! ¿no te parece increíble? a mi me dejo fascinado! en fin..

recuerda que las variables que aparecen en color azul son variables GOBALES, te aconsejo que uses este tipo de variables para todo eso, ya que normalmente accedes a estas desde varios sitios de tu programa, y si no lo haces así, no tendrás acceso a ellas.

sigamos! lo siguiente que hago es extraer los datos de la variable que recibe este método, si en eclipse dentro de este método, escribes location y pones el '.' veras todas las opciones que te da esta variable.

En las lineas 324 a 329 extraigo la latitud, la longitud necesarias para Geolocalizarte, y otros datos de interés, como la altitud, la velocidad y el error que obtiene el GPS, las velocidades las da en m/s y el error y altitud nos la da en metros, por eso mas adelante convierto la velocidad dada en m/s a Km/h.

entre las lineas 331 a 343, que es lo que esta dentro del IF es una condicion para que me coja datos solo cuando hay velocidad y tengo un numero superior o igual a 3 satelites para hacer unos calculos con la posicion recorrida... a esto no le hagas mucho caso, es algo "complejo" si estas empezando y no es imprescindible para lo que estamos viendo hoy.

Por ultimo convierto la distancia de metros a kilometros y guardo los datos en un registro para poder acceder a ellos desde otro sitio...

Como te dije antes, si al location le pones un punto, te apareceran todas las opciones que puedes extraer de este objeto:

Propiedades, TextView, eclipse

Bueno, ya solo quedaría solicitar al manejador o controlador que creamos en la primera línea que nos comience a enviar los datos del GPS, para ello le tenemos que pasar 3 cosas:

El método que queremos usar para Geolocalizarnos (GSM, o GPS).
La frecuencia con la que pedimos los datos (nos pide 2 parámetros milisegundos y metros) en el ejemplo le he puesto 5000ms, 5metros. Los datos nos vendrán cuando se cumplan una de estas dos cosas.
El lisener que hemos definido en la segunda línea

Propiedades, TextView, eclipse

Y con estas 3 líneas + la clase que te puse arriba, seria suficiente para hacer cosillas con el GPS, una cosa mas muy importante, hay que eliminar el lisener del GPS cuando salgamos de la aplicación, si no lo hacemos, se quedara parpadeando el icono del GPS de nuestro teléfono y consumirá batería. ¡que no se os olvide!

execSQL, android, SQLite

Como sabéis, podéis poner este código en el OnDestroy de la activity, o si ponéis algún botón para salir, pos también podéis ponerlo ahí.

En la próxima lección veremos como aplicar esto en un mapa, Android para esto cuenta con una librería de GoogleMaps muy potente, podemos hacer un montón de cosas. Nos leemos!!