Pages

dimanche 4 novembre 2012

Google Map sous Android

Cet article concerne la Google Maps Android API v1. Pour la V2 sortie fin 2012, la procédure décrite pour obtenir un certificat est différente... nouvel article en prévision...

Google Map peut être utilisé librement sur un site ou une application gratuite. Par contre la version libre est limitée en nombre de requête par jour, en résolution ... Vous trouverez toutes les informations sur https://developers.google.com/maps/licensing.



Dans une application Android vous pouvez soit faire appel directement à l’application Gmap (présente la plupart du temps sur votre device) soit directement intégrer une map dans votre application. Nous allons plutôt nous attarder sur le second cas.

MapView est la classe centrale de la librairy Maps. Elle permet d’afficher une carte avec les données récupérées à partir des web services Google Maps. Ce composant peut capturer les actions utilisateurs (frappes de touche, le tacile) pour lancer un zoom ou des traitements pour affiner leur recherche

Paramétrage de votre projet
Ajouter les librairies Google API à votre projet lors de la création via le wizard


Ou dans les propriétés d’un projet existant

Vous allez aussi devoir ajouter des informations dans de description de votre projet, le fichier  AndroidManifest.xml, pour indiquer que vous utilisez une API Google qui va se connecter à internet. Votre application ne sera par exemple pas installée sur les devices n’ayant pas la librairie installée


<manifest 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    package="com.ehret.scoresheet" 
    android:versionCode="3" 
    android:versionName="1.2"
    android:installLocation="preferExternal">

    <uses-permission android:name="android.permission.INTERNET"/>
    <application android:label="@string/app_name">
        <uses-library android:name="com.google.android.maps" />
        ……
    </application>
</manifest>



Récupérer une clé pour utiliser l’API Maps
Comme je l’ai dit en préambule de cet article l’utilisation de l’API peut être payante si vous faites beaucoup de requêtes aux serveurs Google. Vous devez donc dans un premier temps vous enregistrer auprès du service Google Map et accepter les conditions d’utilisation (que ce soit dans un contexte de développement ou de production)

Chaque clé Google Map API est associée avec un et un seul certificat (la clé se base sur l’empreinte MD5 du certificat). Chaque MapView doit faire référence à cette clé.

En développement vous pouvez utiliser le certificat de debug utilisé par le sdk pour tester votre application sur un device, mais lors de la publication sur Google Play vous devrez utiliser le certificat de l’application (voir http://javamind-fr.blogspot.fr/2012/08/publication-dune-application-sur-google.html)

Pour déterminer l’empreinte MD5 de votre certificat, vous avez besoin de savoir où se trouve le keystore (fichier contenant les certificats). Si je prends l’exemple du certificat de debug vous pouvez connaître l’emplacement en allant dans Eclipse dans le menu Windows > Preferences > Android > Build. Généralement il se trouve dans le répertoire .android situé dans le répertoire d’installation du SDK Android

La commande ci-dessous permet de calculer l’empreinte MD5 du fichier debug.keystore pour la clé ayant l’alias androiddebugkey.

keytool -list -alias androiddebugkey -keystore debug.keystore 

Attention n’utilisez pas la commande keytool fournie dans le JDK7 car le code MD5 obtenu ne sera pas reconnu par Google. Celui du JDK6 ne pose pas de problème

Vous devez ensuite saisir le mot de passe qui est dans notre cas android (voir http://developer.android.com/tools/publishing/app-signing.html#debugmode )


Exemple de MD5 : 94:1E:43:49:87:73:BB:E6:A6:88:D7:20:F1:8E:B5:98

Il ne vous reste plus qu’à aller sur https://developers.google.com/maps/documentation/android/v1/maps-api-signup, accepter les termes du contrat et rentrer le code MD5 généré, pour que Google vous fournisse la clé associée

Créer une MapView
La première étape consite à créer un fichier layout (Par exemple /res/layout/gmap.xml) dans lequel vous allez déclarer votre MapView et la clé asociée



<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <com.google.android.maps.MapView
            android:id="@+id/mapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:apiKey="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"
            android:clickable="true"
            android:enabled="true"
    />
</RelativeLayout>


où XXXXXXXXXXXXXXX... représente votre clé Google Map

Créer ensuite une activity qui étend la classe com.google.android.maps.MapActivity et non pas la classe habituelle android.app.Activity. Cette classe permet de gérer pour vous les interactions avec votre MapView.



public class ScoreSheetMapActivity extends MapActivity {

    private MapView mapView;

    @Override
    public void onCreate(Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      setContentView(R.layout.gmap);
      mapView = (MapView) this.findViewById(R.id.mapView);
      mapView.displayZoomControls(true);
     
    }
    /**
     * Indique si l'application gère des itinéraires
     */
    @Override
    protected boolean isRouteDisplayed() {
      return false;
    }
}

Vous devrez également déclarer cette activité au niveau de votre fichier AndroidManifest.xml


<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.ehret.scoresheet"
    android:versionCode="3"
    android:versionName="1.2"
    android:installLocation="preferExternal">
      <uses-permission android:name="android.permission.INTERNET" />
      <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
   
    <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="16"/>
  
   
    <application
        android:icon="@drawable/ic_launcher"
        android:label="@string/app_name"
        android:theme="@style/Theme.FeuilleDeMatch">
        
        <uses-library android:name="com.google.android.maps" />
   
        <activity
            android:name=".ScoreSheetMapActivity"
            android:label="@string/app_name"
            android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>


Et le résultat sera le suivant



2 commentaires:

  1. Bonjour,
    J'aimerais savoir s'il est possible d'intégrer une MapView sur Android 2.2 par exemple, j'ai essayé ajouter le fichier maps.jar dans mon projet mais j'ai des erreurs:
    Installation error: INSTALL_FAILED_MISSING_SHARED_LIBRARY
    PackageManager: Package fr.oenotourisme requires unavailable shared library com.google.android.maps; failing!
    Cordialement

    RépondreSupprimer
  2. Bonjour
    Oui il est possible d'utiliser une MapView que Android 2.2. L'exemple lié à cet article fonctionne sur un HTC Desire sous Android 2.2. Cette erreur INSTALL_FAILED_MISSING_SHARED_LIBRARY est liée au fait qu'il ne trouve pas la librairie spécifiée dans le fichier AndroidManifest. Il faudrait vérifier si l'étape d'association du projet à la Google API est faite (voir le paragraphe "Paramétrage de votre projet"). Dans le SDK Manager il faut vérifier que le SDK et les Google API sont installées.

    RépondreSupprimer

Remarque : Seul un membre de ce blog est autorisé à enregistrer un commentaire.