Desarrollando Android #3 Centrando la localización y marcadores
Sigamos con el desarrollo de la aplicación. Ahora que ya hemos conseguido añadir un mapa hemos de pasar al siguiente punto: por un lado hay que conseguir centrar el mapa en mi posición y por el otro he de conseguir añadir marcadores encima.
Centrando el mapa
Hay diversas maneras de obtener una locaclización en Android. Pero hay que tener una cosa muy presente: la batería. Cuando se desarrolla una aplicación que implementa la localización del usuario hay que decidir cómo obtener dicha posición. Podemos utilizar el GPS y obtener una localización más exacta a cambio de gastar más batería o bien utilizar la posición por 3G, menos precisa pero más durarera.
Otro punto importante es que utilizamos los Google Services para mostrar el mapa, así pues sería interesante comprobar que están instalados en el teléfono y se puede conectar a ellos correctamente.
Finalmente, vamos a seguir los pasos sugeridos por Google y puntualizaciones realizadas por Javanator para establecer una correcta conexión a los Google Play Services y obtener nuestra prosición.
1. Especificando los permisos necesarios
Vamos a necesitar permisos uno o dos permisos en nuestra aplicación: ACCESS_COARSE_LOCATION o ACCESS_FINE_LOCATION en función de el grado de precisión que queremos tener. Pero básicamente, estos permisos ya los hemos añadido en la etapa anterior. En cualquier caso, en nuestro AndroidManifest.xml deberíamos tener el permiso:
2. Comprobando los Google Play Services
Ojo que vienen curvas. Vamos a comprobar el estado de los Google Services con un conjunto de métodos. Como seguramente otra aplicación o función de nuestra app quiera también comprobar este estado, vamos a encapsularlo todo en una método al que iremos llamando.
Este código va en la actividad principal de vuestro proyecto.
Vamos a analizar un poco lo que hemos puesto
Todo este código se introduce en la MainActivity. Primero añadimos unas cuantas variables que utilizaremos: el SupportMapFragment que ya vimos en la etapa anterior, un objeto GoogleMap y un objeto LocationClient. Además definimos un tiempo máximo que vamos a esperar a la conexión (CONNECTION_FAILURE_RESOLUTION_REQUEST). Pasado este tiempo, daremos por perdida la conexión y dejaremos de intentarlo. El bloque [public static class ErrorDialogFragment] nos muestra un diálogo, un mensaje informando de que no se ha podido establecer dicha conexión.
En el onCreate básicamente instanciamos al objeto LocationClient y activamos la locaclización del mapa. Cuando la actividad pasa a ser visible se llama al método onStart y le decimos que intente conectarse si los servicios de GooglePlay están disponibles. Del mismo modo, le decimos que se desconecte en el onStop.
En onActivityResult básicamente le diremos que intente conectarse si nos han comunicado que los Google Services funcionan correctamente. Información que llega del método isGooglePlayServicesAvailable que no tocaremos.
Finalmente, en el onConnected le decimos qué ha de hacer nuestro programa una vez hemos establecido la conexión. En nuestro caso le decimos que muestre un mensaje por pantalla indicando que se ha conectado (con el Toast) y a continuación estamos centrando el mapa en nuestra posición. Así que básicamente, el trozo de código que centra nuestra vista en un mapa es:
Location location = mLocationClient.getLastLocation();
LatLng latLng = new LatLng(location.getLatitude(), location.getLongitude());
CameraUpdate cameraUpdate = CameraUpdateFactory.newLatLngZoom(latLng, 17);
map.animateCamera(cameraUpdate);
Funciona de la siguiente manera:
- Obetenemos nuestra posición y la almacenamos en location
- Creamos un objeto tipo LatLng con dicha posición
- Creamos una orden de actualización de la cámara (CameraUpdate) y le decimos que se vaya a nuestra posición con un zoom de 17.
- Finalmente ejecutamos esta orden, haciendo que se mueva la vista del mapa hasta nuestra situación actual.
Es interesante ver todas las cosas que podemos hacer con la cámara en Android.¡Podemos cambiar la posición, el zoom, la orientación e incluso el ángulo! Mucha más información al respecto en Changing the View.
Ahora que tenemos centrado nuestro mapa, vamos a añadir un marcador.
Añadir un marcador en el mapa
Muy muy sencillo. El código necesario para añadir un marcador es el siguiente:
mMap.addMarker (new MarkerOptions()
.position(new LatLng(lat, lng))
.title("El titulo que quieras"));
Así pues, basta con añadir este trozo de código en nuestro método onCreate para añadir un marcador. Por descontado, estos marcadores se pueden personalizar, rotar, cambiar de color y millones de cosas más. Pasaos por Markers en Android para saber más sobre el tema.
Ahora tenemos: Un mapa que se carga, se centra en nuestra posición y muestra un marcador.
En la próxima sesión: Parseo de un .xml para añadir varios marcadores a un mapa.
Links de interés:
- Location Strategies [Google Dev]
- Retrieving the Current Location [Google Dev]
- Changing the View [Google Dev]
- Interacting with the Map [Google Dev]
- Markers in Maps [Google Dev]
Os recuerdo que el código fuente del proyecto se encuentra en Github
¡Cualquier duda, sugerencia o cuestión me podéis encontrar en twitter!