viernes, 2 de marzo de 2012

Mapas en Android


Mapas en Android (I): Preparativos y ejemplo básico

Siguiendo con nuestro Curso de Programación en Android, tras haber hablado en los dos últimos artículos sobre localización geográfica mediante GPS (aquí y aquí), en este nuevo artículo vamos a empezar a hablar de un complemento ideal para este tipo de servicios y aplicaciones, como es la utilización de mapas en nuestras aplicaciones haciendo uso de la API Android de Google Maps.
Antes de empezar a utilizar el servicio de mapas de Google es necesario realizar algunas tareas previas. En primer lugar, debemos asegurarnos de que tenemos instalado el paquete correspondiente a la versión de Android para la que desarrollamos “enriquecido” con las APIs de Google. Estos paquetes se llaman normalmente “Google APIs by Google, Android API x, revisión y“. Esto podemos comprobarlo y descargarlo si es necesario desde Eclipse accediendo al Android SDK and AVD Manager. En mi caso, utilizaré el paquete correspondiente a Android 2.1 (API 7) + APIs de Google:
mapas-avd-package
Para poder probar nuestras aplicaciones en el emulador también tendremos que crear un nuevo AVD que utilice este paquete como target:
mapas-avd-package-2
Y por supuesto, al crear nuestro proyecto de Eclipse también tendremos que seleccionarlo comotarget en las propiedades:
mapas-proyecto-eclipse
Con todo esto ya tendríamos creado nuestro proyecto de Eclipse y estaríamos preparados para poder ejecutar aplicaciones en el emulador sobre la versión correcta de Android y las APIs necesarias de Google. Por tanto, ya podemos centrarnos en la utilización de dichas APIs.
Esto último también requiere algunos pasos previos. Para poder utilizar la API de Google Maps se requiere la obtención previa de una clave de uso (API Key), que estará asociada al certificado con el que firmamos digitalmente nuestra aplicación. Esto quiere decir que si cambiamos el certificado con el que firmamos nuestra aplicación (algo que se hace normalmente como paso previo a la publicación de la aplicación en el Market) tendremos que cambiar también la clave de uso de la API.
En el tema de los certificados no voy a entrar mucho puesto que lo trataremos en un artículo posterior, por ahora tan sólo diremos que durante la construcción y depuración de nuestras aplicaciones en el emulador de Android se utiliza automáticamente un certificado de depuración creado por defecto. Por tanto, para poder depurar aplicaciones en el emulador que hagan uso de Google Maps tendremos que solicitar una clave asociada a nuestro certificado de depuración.
Para ello, en primer lugar debemos localizar el fichero donde se almacenan los datos de nuestro certificado de depuración, llamado debug.keystore. Podemos saber la ruta de este fichero accediendo a las preferencias de Eclipse, sección Android, apartado Build (mostrado en la siguiente imagen), y copiar la ruta que aparece en el campo “Default Debug Keystore“:
mapas-androiddebugkey-eclipse
Una vez conocemos la localización del fichero debug.keystore, vamos a accder a él mediante la herramienta keytool.exe de java para obtener el hash MD5 del certificado. Esto lo haremos desde la linea de comandos de Windows mediante el siguiente comando (click para ampliar):
mapas-androiddebugkey-cmd
Copiaremos el dato que aparece identificado como “Huella digital de certificado (MD5)” y con éste accederemos a la web de Google (http://code.google.com/android/maps-api-signup.html) para solicitar una clave de uso de la API de Google Maps para depurar nuestras aplicaciones (Insisto, si posteriormente vamos a publicar nuestra aplicación en el Market deberemos solicitar otra clave asociada al certificado real que utilicemos). Dicha web nos solicitará la marca MD5 de nuestro certificado y nos proporcionará la clave de uso de la API, como se muestra en la siguiente imagen:
mapas-androiddebugkey-google
Con esto, terminamos con todos los pasos previos para la utilización de los servicios de Google Maps dentro de nuestras aplicaciones Android.
Una vez contamos con la clave de uso de la API, la inclusión de mapas en nuestra aplicación es una tarea relativamente sencilla y directa. En este primer artículo sobre mapas nos vamos a limitar a mostrar el mapa en la pantalla inicial de la aplicación, habilitaremos su manipulación (desplazamientos y zoom), y veremos cómo centrarlo en una coordenadas concretas. En próximos artículos aprenderemos a manipular de forma dinámica estos mapas, a mostrar marcas sobre ellos, y a realizar otras operaciones más avanzadas.
Para incluir un mapa de Google Maps en una ventana de nuestra aplicación utilizaremos el controlMapView. Estos controles se pueden añadir al layout de la ventana como cualquier otro control visto hasta el momento, tan sólo teniendo en cuenta que tendremos que indicar la clave de uso de Google Maps en su propiedad android:apiKey como se muestra a cotinuación:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">
 
<com.google.android.maps.MapView
    android:id="@+id/mapa"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:apiKey="0ss-5q6s3FKYkkp3atMUH..."
    android:clickable="true" />
 
</LinearLayout>
Como vemos, además de la propiedad apiKey, también hemos establecido la propiedad clickablecon valor true,de forma que podamos interactuar con el control mediante gestos con el dedo (por ejemplo, para desplazarnos por el mapa).
Este tipo de controles tienen la particularidad de que sólo pueden ser añadidos a una actividad de tipo MapActivity, por lo que pantalla de la aplicación en la que queramos incluir el mapa debe heredar de esta clase. Así, para nuestro caso de ejemplo, vamos a hacer que la clase principal herede de MapActivity, como vemos en el siguiente código:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
package net.sgoliver.android;
 
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
 
import android.os.Bundle;
 
public class AndroidMapas extends MapActivity {
 
    private MapView mapa = null;
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
 
        //Obtenemos una referencia al control MapView
        mapa = (MapView)findViewById(R.id.mapa);
 
        //Mostramos los controles de zoom sobre el mapa
        mapa.setBuiltInZoomControls(true);
    }
 
    @Override
    protected boolean isRouteDisplayed() {
        return false;
    }
}
Como vemos, si nuestra clase hereda de MapActivity debemos implementar obligatoriamente el método isRouteDisplayed(), cuyo valor de retorno debe ser true sólo en caso de que vayamos a representar algún tipo de información de ruta sobre el mapa (esto no se trata de ningún tema técnico, sino tan sólo legal, para cumplir los términos de uso de la API de Google Maps). En este primer artículo nos limitaremos a mostrar el mapa en la pantalla principal de la aplicación, por lo que por el momento devolveremos false.
Además de esto, en el método onCreate() llamaremos al método setBuiltInZoomControls()sobre la referencia al control MapView para mostrar los controles de zoom estandar sobre el mapa, de forma que podamos acercar y alejar la vista del mapa. Con esto, ya tendríamos un mapa completamente funcional funcionando en nuestra aplicación.
Para ejecutar la aplicación de ejemplo sobre el emulador de Android aún nos queda un paso más, modificar el fichero AndroidManifest.xml. Por un lado, tendremos que especificar que vamos a hacer uso de la API de Google Maps (mediante la cláusula <uses-library>), y en segundo lugar necesitaremos habilitar los permisos necesarios para acceder a Internet (mediante la cláusula<uses-permission>). En el siguiente fragmento de código vemos cómo quedaría nuestroAndroidManifest tras añadir estas dos lineas:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?xml version="1.0" encoding="utf-8"?>
      package="net.sgoliver.android"
      android:versionCode="1"
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="7" />
 
    <application
        android:icon="@drawable/icon"
        android:label="@string/app_name">
 
        <uses-library android:name="com.google.android.maps" />
 
        <activity android:name=".AndroidMapas"
                  android:label="@string/app_name">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>
 
    <uses-permission android:name="android.permission.INTERNET" />
 
</manifest>
Tras estos dos cambios ya podemos ejecutar el proyecto de Eclipse sobre el emulador. Comprobaremos cómo podemos movernos por el mapa y hacer zoom con los controles correspondientes:
mapa-ejemplo

No hay comentarios:

Publicar un comentario