Google Maps V2 en Android


Hace ya un tiempo que ha aparecido la nueva API para Google Maps así que ya iba siendo hora de que le echáramos un vistazo para ver que es capaz de hacer esta nueva versión.


Hay unas cuantas cosas nuevas en esta versión, lo que más llama la atención es que ahora no necesitamos utilizar un MapActivity sino que se utilizan Fragments lo que facilita la tarea de integrar un mapa (o varios) en cualquier tipo de pantalla. Además los mapas se representan mediante vectores lo que según Google va a consumir menos ancho de banda y además los mapas se cachean con lo que no tendremos tantas zonas sin cargar. Por último, esta versión incluye mapas en 3D y se podrá cambiar la perspectiva del mapa lo que les dará mucho más juego a estos.

Los mapas de Google ahora vienen integrados en la librería de Google Play Services por lo que si no la tenemos instalada debemos hacerlo ahora. Para ello en Eclipse vamos a Window -> Android SD Manager, en la sección Extras buscamos Google Play Services y si no está instalado lo marcamos para su instalación.



Una vez hecho esto vamos a crear un nuevo proyecto en Eclipse a partir de esto que hemos instalado, para ello en File -> New... -> Project -> Android Project From Existing Code pinchamos sobre Browse y desde el directorio donde tengáis el SDK de Android seguís la siguiente ruta <PATH_SDK_ANDROID>/extras/google/google_play_services/libproject/google-play-services_lib/ , aceptáis y listo. En la ruta <PATH_SDK_ANDROID>/extras/google/google_play_services/samples/ tenéis una serie de ejemplos que podéis hacerle este proceso para tener a mano y ver que se puede hacer con esta librería.

Por último, en el proyecto que vais a incluir los mapas debéis hacer referencia a este proyecto, hacéis botón derecho sobre vuestro proyecto y seleccionáis Properties ->Android y en la parte derecha abajo de todo añadís una nueva librería. Seleccionáis la de Google Play Services y listo.

Ahora toca crear una key para que se puedan ver los mapas en nuestra aplicación, para ello tenemos que ir a la consola de las Google Apis en https://code.google.com/apis/console/. Ya vimos algo sobre ella cuando hablamos de como enviar notificaciones push. Simplemente os creáis un proyecto y vamos a activar el servicio de Google Maps en la sección Services buscando Google Maps API V2 y poniendo el switch en ON.

Una vez activado debemos ir a la sección API Access a crear nuestra key. Vamos a hacer un paréntesis aquí para abrir un terminal y ejecutar lo siguiente:

keytool -list -v -keystore ~/.android/debug.keystore -alias androiddebugkey -storepass android -keypass android

Esto nos va a genera una salida con un montón de texto, nos centramos en buscar la linea que empieza por SHA1:, y copiamos el código que hay a continuación. La anterior instrucción es para cuando utilizamos el certificado de debug, para cuando estamos realizando pruebas en el emulador o en nuestro dispositivo de desarrollo. Para obtener el código para el certificado con el que firmáis las aplicaciones para producción debéis ejecutar lo siguiente (he marcado en rojo donde debéis incluir vuestros datos):

keytool -list -v -keystore /path/a/vuestra/keystore/my_keystore.keystore -alias nombre_de_vuestro_alias_name

Una vez que ya tenemos el código SHA1 de nuestro almacén de claves volvemos a la consola de Google Apis donde lo dejamos. Pulsamos el botón Create new Android key... y pegamos el código SHA1. Además debemos escribir un punto y coma seguido del package de nuestra aplicación, si tenéis por ejemplo com.trespies.mapdemo quedaría algo así:

45:B5:E4:6F:36:AD:0A:98:94:B4:02:66:2B:12:17:F2:56:26:A0:E0;com.trespies.mapdemo

Esto nos va a dar nuestra api key que debemos utilizar en nuestra aplicación. Y una vez listo esto podemos ir por fin a Eclipse para crear el primer ejemplo. Empezaremos por el archivo AndroidManifest.xml.

Empezamos por meter la siguiente meta-data dentro de la etiqueta <application>:

<meta-data
      android:name="com.google.android.maps.v2.API_KEY"
      android:value="AQUI_VUESTA_API_KEY_DE_GOOGLE"/>

Lo siguiente es incluir los siguientes permisos, dentro de la etiqueta <manifest>, sustituyendo el package que está en rojo por el vuestro:

<permission
        android:name="com.trespies.mapdemo.permission.MAPS_RECEIVE"
        android:protectionLevel="signature"/>
<uses-permission android:name="com.trespies.mapdemo.permission.MAPS_RECEIVE"/>

La versión 2 de la API de Google Maps requiere Open GL ES versión 2 por lo que debemos añadir la siguiente etiqueta:

<uses-feature
        android:glEsVersion="0x00020000"
        android:required="true"/>

Y por último añadimos los siguientes permisos:

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permission android:name="com.google.android.providers.gsf.permission.READ_GSERVICES"/>

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

Los dos últimos no son estrictamente necesarios pero son recomendables instalarlos. Nos queda por último el layout y la activity. Vamos primero con el layout, yo le llamo map_view_v2.xml:

<?xml version="1.0" encoding="utf-8"?>
<fragment xmlns:android="http://schemas.android.com/apk/res/android"
  android:id="@+id/map"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  class="com.google.android.gms.maps.SupportMapFragment"/>

Este layout es muy sencillo, como único objeto tenemos un fragment que llama a una clase de nuestra librería Google Play Services y que se encargará de presentarnos el mapa. Veamos la activity:

public class MapInfo extends FragmentActivity {

    private GoogleMap mMap; 

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
           
        setContentView(R.layout.map_view_v2);
        setUpMapIfNeeded();
    }
  
    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }
    private void setUpMapIfNeeded() {
        if (mMap == null) {            
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map)).getMap();
            
            if (mMap != null) {
                setUpMap();
            }
        }
    }
    
private void setUpMap() {
  mMap.addMarker(new MarkerOptions().position(new LatLng(0, 0)).title("Marker"));
    }
}

Nuestra Activity no es una Activity sino un FragmentActivity, debéis importar la librería para el FragmentActivity de la android.support.v4. En el onCreate se llama a nuestro layout y al método que inicializa el mapa, setUpMapIfNeeded.

En este método se intenta obtener el mapa del fragment donde lo tenemos en la variable mMap de tipo GoogleMap, si no es nulo se va añadir un marcador con el método setUpMap.

Como veis es muy sencillo. Una vez que tenemos los pasos previos, añadir mapas es un juego de niños. Como os comenté antes hay bastantes ejemplos en la carpeta samples, así que si queréis,  podéis ir viendo más ejemplos por vuestra cuenta.

Comments are closed.