Map application pour Android SDK 1.5, première partie

Vous aviez été nombreux à apprécier le tutoriel d’André sur la géolocalisation. Il est de retour avec un nouveau tutoriel qui vous permettra d’explorer les fonctionnalités maps et GPS du nouveau SDK Android version 1.5 !

Pour porter mon application GLocationMap sous le SDK 1.5, j’ai choisi la solution de réécriture pas à pas. Ceci m’a paru nécessaire compte tenu des differences majeures entre le SDK 1.0 et le SDK 1.5 et me permet donc de faire une série de tutoriaux progressifs expliquant en détails l’utilisation des fonctions Maps, GPS et Location Services mais aussi les difficultés rencontrées.

Ce premier tutoriel va présenter les bases d’une application Android élémentaire intégrant Google Maps.

Nous présenterons dans les tutoriaux suivants tout ce qui concerne l’intégration de menus pour interopérer avec la carte, puis les Overlays pour ajouter des informations, puis la recuperation des infos de localisation, la communication avec des serveurs d’application et bien plus encore !

Android Virtual Devices

La version 1.5 du SDK Android introduit une nouveauté avec les Android Virtual Devices, des terminaux Android virtuels configurables dans les moindres détails, qui seront nécessaires au lancement de votre application.

Un Android Virtual Device (AVD) modélise un seul virtual device hébergeant la plateforme Android qui a au minimum son propre Kernel, system image et data partition.

Un emulator process peut lancer un seul AVD à la fois, mais vous pouvez créer plusieurs Android Virtual Devices et les faire tourner en parallèle.

Création d’un AVD : android create avd –name my_avd –target t (t = 1 pour Android 1.1, 2 pour 1.5 etc)

Pour avoir la liste des avds : android list avds

Vous obtenez par ex :

Available Android Virtual Devices:

Name: avd_1.5

Path: /home/rcs/.android/avd/avd_1.5.avd

Target: Android 1.5 (API level 3)

Skin: HVGA

———

Name: my_avd

Path: /home/rcs/.android/avd/my_avd.avd

Target: Android 1.1 (API level 2)

Skin: HVGA

Pour utiliser un AVD :

Si vous lancez votre application depuis Eclipse, l’environnement de développement va identifier automatiquement l’AVD à utiliser en fonction des options de compilation que vous avez choisi.

Pour lancer l’émulateur vous devez specifier le nom de l’AVD que vous souhaitez utiliser : emulator @my_avd

Pour avoir plus de détails sur les AVD : emulator -help-virtual-device

Utiliser Google Maps avec le SDK 1.5

Nous devons en premier éditer le fichier layout de notre application contenu dans le fichier /res/layout/mapview.xml :

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/main"
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent">
    <com.google.android.maps.MapView
        android:layout_width="fill_parent" 
        android:layout_height="fill_parent"
        android:enabled="true"
        android:clickable="true"
        android:apiKey="@string/mapskey"
     />
</LinearLayout>

Comme vous le voyez, notre layout ne contient pour l’instant rien d’autre qu’un MapView, élément indispensable pour une application utilisant Google Maps.

Les IDs du LinearLayout et du MapView sont utilisés pour rendre accessibles les Views dans l’Activity.

Pour utiliser les composants Google Maps  une API key est nécessaire, et sera stockée comme une ressource string référencée par la clé @string/mapskey.

Obtenir une clé pour l’API Google Maps :

Android autorise l’installation des applications signées exclusivement. Avant d’installer une application dans l’émulateur, Eclipse va automatiquement signer votre application, utilisant un certificat de debug qui vient avec le SDK Android. Eclipse crée le fichier debug.keystore lors de la compilation (réussie) du projet, stocké dans le répertoire ~/.android. La clé pour l’API Google Maps est basée sur ce certificat de debug. Une explication detaillée expliquant comment signer une application peut facilement se trouver en ligne.

Pour obtenir une Google Maps API key (en utilisant le debug certificate) vous devez suivre les étapes suivantes :

Créer un md5 checksum du debug certificate :
Trouver le debug.keystore

Et appeler la commande : keytool -list -alias androiddebugkey -keystore .keystore -storepass android -keypass android

Le md5 checksum est généré et affiché à l’écran :

androiddebugkey, Apr 20, 2009, PrivateKeyEntry,

Certificate fingerprint (MD5): XX:YY:ZZ:AA:BB:CC:FF:CA:A7:99:AD:DD:DF:5C:12:ED

Enregistrer le md5 checksum :

S’enregister sur Google Code pour avoir une Maps API key. Un compte google est requis pour pouvoir le faire.

Saisir le checksum md5 et cliquer sur le bouton “Generate API key”.

Vous obtenez alors une page avec votre Google Maps API key et une petite explication de comment l’utiliser dans un layout.

Editer les resources dans le fichier string.xml :

Copier-coller la Google Maps API key dans le fichier string.xml pour la resource string/mapskey utilisée dans le layout :

<?xml version=“1.0″ encoding=“utf-8″?>

<resources>
    <string name="app_name">MapDemoV1</string>
    <string name="mapskey">XXXXXXXXXX7O2PwQ5YMM6ilp5HCJ4YYYYYYYYYY</string>
</resources>

Ajouter les permissions requises et les librairies au manifest

Notre application nécessite deux permissions :

De plus, la library Google Maps API (com.google.android.maps) doit être incluse dans le projet.

Notre fichier AndroidManifest.xml :

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="org.example.android.apis"
      android:versionCode="1"
      android:versionName="1.0">
    <application android:label="@string/app_name"
            android:icon="@drawable/icon">
                <uses-library android:name="com.google.android.maps" />
         <activity android:name=".MapViewDemo" 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-sdk android:minSdkVersion="3" />
        <uses-permission android:name="android.permission.INTERNET" />
        <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
</manifest>

Le code java

Cette application doit hériter de MapActivity et faire reference au layout défini dans mapview.xml a l’aide de la méthode setContentView.

Le fichier MapViewDemo.java :

package org.example.android.apis;

import android.os.Bundle;
import com.google.android.maps.MapActivity;
 
public class MapViewDemo extends MapActivity {
 
        /** Called when the activity is first created. */
        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mapview);
        }
 
        @Override
        protected boolean isRouteDisplayed() {
                return false;
        }
}

L’application peut être lancée en sélectionnant le projet dans Eclipse, clic droit, Run As, Android Application.

Compilation, exécution, debogage

Il est possible de tester l’application en utilisant l’émulateur.

Pour compiler de facon correcte une application utilisant Google Maps avec le SDK 1.5 vous devez definir le project target comme étant un Google Maps API.

emulator-map

Selectionnez le projet dans Eclipse, clic droit, Properties, Android et sélectionnez sur Google Maps API comme target.

Pour voir défiler le log : adb logcat dans une fenêtre indépendante lorsque l’émulateur est lancé

En cas de problème vous pouvez vouloir effacer les installations précéedentes pour repartir avec un émulateur propre grâce à cette commande : /tools/emulator -wipe-data @avd_1.5

Pour effacer ce que vous souhaitez seulement (attention aux erreurs !) : 

/tools/adb shell (quand l’emulateur fonctionne)

cd /data/app

rm appli.apk

Pour des débugage plus complexe, consultez la doc d’Eclipse. Pour ma part je préfère éviter les erreurs que les déboger !

La suite très prochainement…

Pour aller plus loin :

12 commentaires sur "Map application pour Android SDK 1.5, première partie" :

  • Romain Guy le 18/05/2009

    Intéressant, merci :) Une remarque toutefois, le LinearLayout dans le layout XML est inutile. Tu peux mettre la MapView comme View par défaut. Cela optimise pas mal de choses. Je recommande également la lecture de cet article, très utile pour les applications utilisant MapView en mode fill_parent/fill_parent : http://android-developers.blog.....speed.html (notez que ce qu’explique l’article sera normalement inutile avec la release portant le nom de code Donut).

  • Andre Charles Legendre le 18/05/2009

    Merci Romain.

    Tu as raison pour le layout. Merci pour le lien je vais le potasser.
    Note que pour le 3eme tutorial (a venir) j’ai pris modele sur certains de tes choix techniques dans Shelves…
    Je conseille d’ailleurs la lecture du code de ce projet OpenSource super a tous ceux qui souhaitent progresser. Ou qui ont une bibliotheque a gerer..
    http://code.google.com/p/shelves/

    Je vais adapter le layout, selon ton conseil, dans le Tutorial 4 en cours d’ecriture.

  • Romain Guy le 18/05/2009

    Il faudrait que je vérifie Shelves histoire d’être sûr que je n’ai pas laissé de code infâme ou de hack ignoble alors ;-)

  • trebormat le 18/05/2009

    “notez que ce qu’explique l’article sera normalement inutile avec la release portant le nom de code Donut”
    Ca veut dire quoi ?. C’est une première fuite sur le contenu de Donut (:

  • Romain Guy le 18/05/2009

    Ça ne veut pas dire grand chose, juste que j’ai introduit une optimisation dans le système de rendu de Donut qui rend inutile l’astuce d’éliminer le background des windows pour accélérer le dessin. Ce changement sera d’ailleurs dans le prochain drop Open Source sur android.git.kernel.org. Il faut juste que je corrige tous les bugs que cette optimisation a engendré :) )

  • Andre Charles Legendre le 18/05/2009

    Et pour les inerdits de Donut cause regime (comme moi).

    Je propose des noms moins problematique comme :
    Camembert, Munster, rillettes etc..

    Ca nous mettrais vraiment en appetit… ;-)

  • sweet le 9/07/2009

    Salut tout d’abord merci pour ce tuto. Cependant je bloque au début lors de l’étape de création du md5 checksum. Comme tu as l’aire de développer sous Linux les commande pour le créer ne doivent pas être les même que sous Vista. J’ai trouver la fichier debug.keystore mais je n’arrive pas à en extraire le md5 checksum si quelqu’un a une idée elle serait la bienvenue …

  • sweet le 18/08/2009

    Autre soucis. Bizarrement j’étais déjà arriver à faire ce tuto mais en réessayant de le faire j’ai 3 erreur que je n’ai jamais vu auparavant. La première dans le manifest où eclipse ne reconnait pas le nom de mon activité (qui est bien celui définit au début lors de la création du projet) et dans le fichier java où la méthode onCreate est dite indéfinit pour le type objet et où le “R” de “R.layout.mapview” ne peut être résolut.
    Si quelqu’un a déjà eu ce type de problème et qu’il sait comment le résoudre ce serais sympa de me donner un coup de main svp.
    Merci
    Sweet

  • embensouda le 13/10/2009

    Bonjour,
    sympa le tuto, svp comment on peut installer une application developper sur eclipse vers un tel.
    Merci pour votre aide

  • Guerbouj le 25/10/2009

    Salut,

    j’ai essayé de faire cette application, pour les codes ça va aller pas d’erreurs mais après compilation l’application s’ouvre mais pas de map ? et dans eclipse il dit Source not found

  • Syl le 4/11/2009

    Salut,

    j’ai un soucis pour utiliser l’API Google Maps avec l’émulateur. L’élément MapView reste toujours gris (aucune carte n’est affichée).

    J’ai créé un projet HelloMapView en suivant les instructions fournies dans le guide des développeurs Android : http://developer.android.com/i.....pview.html

    Je n’ai pas oublié de remplacer la valeur de l’attribut “android:apiKey” avec la clé que j’ai générée.

    Dans les logs de LogCat, j’obtiens le message d’erreur suivant : “ERROR/MapActivity(875): Couldn’t get connection factory client”

    Q1 : Est-ce que quelqu’un a déjà rencontré ce problème ?

    Q2 : Est-ce que l’API Google Maps est utilisable derrière un proxy ? (j’ai configuré mon proxy dans les paramètres du système dans la section “Access Point Network”)

    Merci pour votre aide ! =)

  • Piwaï le 13/11/2009

    @Syl : ce problème est connu.

    L’API Google Maps n’est pour le moment pas utilisable derrière un proxy http. En effet, elle n’utilise pas la configuration globale de proxy du téléphone, contrairement au navigateur.

    J’ai ajouté un commentaire à ce sujet sur une issue :
    http://code.google.com/p/andro.....il?id=3764

    Espérons que ça sera réglé rapidement. N’hésitez pas à marquer ce rapport de bug (star this issue) ;-) .

    Par ailleurs, la plupart des développeurs ne sont pas au courant du fait qu’ils doivent gérer eux-même l’éventualité d’un proxy configuré, au sein de leurs applications.

    Voir à ce sujet : http://groups.google.com/group.....1b01472765

Exprimez-vous en laissant un commentaire !

Les commentaires ne sont pas modérés avant leur publication alors n'hésitez à vous exprimer librement.

Une seule règle : Rester un minimum poli et constructif.

Vous avez des questions d'ordre général à poser? Direction le forum.