Cours Android pour apprendre à développer Google maps API


Télécharger Cours Android pour apprendre à développer Google maps API

★★★★★★★★★★3.5 étoiles sur 5 basé sur 1 votes.
Votez ce document:

Télécharger aussi :


 

L'API Google de géolocalisation pour Android

Jean-marc Farinone Maître de conférences CNAM Paris

La (géo)localisation : le sytème GPS

 

? GPS = Global Positionning System

? 24 satellites  tournant autour de la terre

(au moins)

et diffusant leur position et l'heure de diffusion

? Un récepteur, équipé d'une horloge, reçoit au moins 4 signaux de 4 satellites et calcule alors sa position

? précision de 15 à 100 mètres (version standard)

? source :

La (géo)localisation :

l'Android's Network Location

 

? Utilise les réseaux téléphoniques cellulaires et le Wi-Fi

? Est plutôt conseillé : utilise moins de puissance électrique, fonctionne à l'intérieur et à l'extérieur, est plus rapide

? source :

tml

Utiliser les cartes de Google

 

? Un des grands avantages d'Android est de pouvoir bénéficier des principales applications déjà développées par Google. L'une d'elle sont les Google maps

? Toute une API permet d'utiliser ces cartes Google

? Cette API v2 est désormais comprise dans l'Android SDK Manager

? La version Google Maps Android v1 est officiellement dépréciée le 3 décembre 2012. Après le 18 mars 2013, on ne peut plus recevoir une API Key pour cette version (source

/documentation/android/v1/) mais les apps les contenant peuvent continuer à être exécuter

La bibliothèqueGoogle Maps

 

? On utilise donc les Google Maps Android API v2. La page d'accueil de cette technologie est à l'URL

? Cette API permet de manipuler des cartes terrestres. Ces classes se trouvent dans le package

? Pour afficher une carte, on utilise les fragments

? Cette API gère les entrées clavier, le zoom, le toucher sur une carte affichée

? On peut ajouter des dessins, des images sur la carte

? Pour utiliser cette API, on doit être enregistré auprès du service Google

Maps et avoir obtenu une clé Maps API v2

? On peut commencer à étudier cette API à partir de l'URL

/intro. La suite est à

/start#the_google_maps_api_key

Les étapes pour utiliser les cartes de Google

 

? Pour utiliser les cartes Google, il faut suivre les étapes suivantes :

? 1°) Charger la bibliothèque Google Play Services SDK

? 2°) Repérer cette bibliothèque dans votre projet

? 3°) Obtenir une Maps API v2 Key

? 4°) Configurer l' de l'application

? 5°) Ecrire une activité demandant à afficher une carte Google

? Toute la procédure est indiquée à

ndroid/start

Avant de commencer

 

? MAIS EUH !

? "Google Play services is not supported on the Android emulator — to develop using the APIs, you need to provide a development device such as an Android phone or tablet."

? source :

? Bref, au 21 mai 2013, il faut avoir une tablette ou un smartphone réel pour faire du développement. On ne peut tester le code

développé sur un émulateur (= AVD)

1°) Charger la bibliothèque Google Play Services SDK (1/3)

 

? Bibliographie :

ndroid/intro#sample_code

? Pour charger ou vérifier que vous avez les "Google Play services SDK", lancer l'"Android SDK" ("and AVD" dans certaines versions de plug-in) "Manager". Pour cela :

? soit cliquer sur l'icone

? soit Window | Android SDK Manager

1°) Charger et configurer les services Google Play SDK (2/3)

 

? Descendre dans Extras | Google Play services :

 

? Les installer si ce n'est pas le cas (sélectionner et cliquer Install 1 package, puis accept, puis Install, puis c'est bon)

1°) Charger la bibliothèque Google Play Services SDK (3/3)

 

? On doit obtenir :

 

? source :


dans votre projet (1/6)

?

?

?

dans votre projet (2/6)

 

? Parcourir le disque pour trouver le répertoire <android-sdk-

folder>/extras/google/google_play_services/libproj ect/google-play-services_lib

? Cliquer OK

? ATTENTION, ce n'est pas terminé ! On a simplement chargé cette bibliothèque dans l'espace de travail

(workspace)

? Il faut encore référencer cette bibliothèque dans le projet

dans votre projet (3/6)

 

? Après l'étape précédente on a une configuration comme :

 

? La bibliothèque google-play-services_lib est bien dans l'espace de travail. Mais certains projets (cf. ci dessus) ne les référencent pas

? Il faut référencer cette biblilothèque dans le projet. Pour cela voir à

#ReferencingLibraryProject

? Ou explications diapos suivantes !

dans votre projet (4/6)

 

? Pour référencer cette bibliothèque google-play-services_lib dans le projet :

? a) sélectionner votre projet, cliquer droit, selectionner Properties

? b) dans la fenêtre Properties, sélectionner Android (colonne de gauche)

? c) dans la partie Library (partie droite), cliquer Add (en bas à droite)

? d) dans la fenêtre de dialogue "Project Selection", sélectionner la bibliothèque (library) google-play-services_lib. Cliquer OK.

? e) Cette bibliothèque apparait dans la partie Library du projet (en bas à droite). Cliquer Apply puis OK dans la fenêtre "Properties for leProjet "

? Remarque : parfois cela ne fonctionne pas. Fermer Eclipse, le relancer (faire des clean, des refresh, des CTRL-SHIFT-O, la vie quoi ;-))

? source :

dans votre projet (5/6)

 

? En images, cela donne :

? a)? b) ? d)

et c)

dans votre projet (6/6)

?


3°) Obtenir une Maps API v2 Key (1/10)

 

? "Note: The Google Maps Android API v2 uses a new system of managing keys. Existing keys from a Google Maps Android v1 application, commonly known as MapView, will not work with the v2 API." (*)

? "You obtain a Maps API key from the Google APIs Console by providing your application's signing certificate and its package name. Once you have the key, you add it to your application by adding an element to your application's manifest file ." ? Bon, c'est clair, non ?

? De plus comme toute application Android est signée, "Maps API keys are linked to specific certificate/package pairs, rather than to users or applications"

? (*) source

/start#getting_the_google_maps_android_api_v2

3°) Obtenir une Maps API v2 Key (2/10)

 

? L'exposé ci dessous est fait avec le "Debug Certificate". C'est similaire pour le "Release Certificate" (= clé de publication de l'application) ? Il y a 3 étapes :

? a) obtenir l'empreinte (réduit , digest, hascode, ) SHA1 du certificat (de debug)

? b) inscrire son projet (auprès de google)

? c) obtenir une clé "API key" de google pour votre projet

? (*) source

/start#getting_the_google_maps_android_api_v2

(3/10) a)empreinte SHA1du certificat

? Bref avant tout, et avant d'avoir obtenu une clé Google, il faut un certificat de l'entrepôt de clés

? Rappel (?) : un certificat contient essentiellement une clé publique (et souvent des renseignements associés)

? Pour créer un certificat, une clé publique (associé à une clé privée), un entrepôt de clés, on utilise l'outil keytool. Ce n'est pas de l'Android, c'est du Java

? Pour la clé debug, l'entrepôt de clés se trouve :

? pour Windows Vista et 7, sous

C:\Users\<user>\.android\debug.keystore

? pour Windows XP: C:\Documents and Settings\<user>\.android\debug.keystore

? pour OS X and Linux: ~/.android/debug.keystore


(4/10) a)empreinte SHA1du certificat

? L'entrepôt de la debug key peut être trouvé dans Eclipse par Windows | Preferences, puis Android | Build

 

(5/10) a)empreinte SHA1du certificat

? Pour créer une empreinte SHA1 d'un certificat on lance la commande

keytool -list -v -keystore

"arborescenceAmenantA\debug.keystore" -alias androiddebugkey

-storepass android -keypass android

? -list permet d'obtenir une empreinte du certificat créé

? -alias nomDeCle est l'alias de clé généré dans ce certificat

? -keystore nomEntrepotDeCles précise l'entrepôt de clés

? -storepass motDePasseDeLEntrepot indique le mot de passe de l'entrepôt de clés. Euh il devrait plutôt être passé pendant l'exécution de la commande plutôt qu'en clair sur la ligne de commande !

? -keypass motDePasseDeLaClé indique la clé. Euh idem !

? Les valeurs debug.keystore (pour -keystore), androiddebugkey (pour

-alias), android (pour -storepass et -keypass) sont les valeurs données pas défaut par le plug-in Android

3°) Obtenir une Maps API v2 Key (6/10) a) empreinte SHA1 du certificat

 

? En résumé, en lançant :

keytool -list -v -keystore arborescenceAmenantA\debug.keystore -alias androiddebugkey -storepass android -keypass android on obtient un résultat comme :

 

? La clé SHA1 est celle commençant par 28:FB


3°) Obtenir une Maps API v2 Key (7/10) b) inscrire son projet

? Il faut aller à Google APIs Console d'URL :

879367110412

? On arrive à la page

? Cliquer Services et descendre pour sélectionner Google Maps Android API v2 (et pas Google Maps API v2) ! c'est à dire l'item

? Cliquer On. Vous devez obtenir :

? Lisez et acceptez (!) les "terms of service"

? Euh, vous devez avoir un compte gmail



3°) Obtenir une Maps API v2 Key (8/10) c) obtenir une c "API key"

? Ayant obtenu le certificat SHA1 (étape a)) et atteint le site Google APIs (étape b)), à cette page de la "Google APIs Console", cliquer API Access

? Les clés des anciens projets apparaissent. Pour avoir une clé pour le projet courant cliquer le bouton "Create new Android key " (et pas sur l'image "Create " !)

3°) Obtenir une Maps API v2 Key (9/10) c) obtenir une c "API key"

? Si vous voulez une clé pour le projet courant cliquer le bouton

"Create new Android key " (et pas sur l'image "Create " !)

? On a alors la fenêtre

? Comme indiqué (si, si, en gras, en grisé, mais indiqué !), entrer la clé SHA1 (obtenu en a)) suivi de ; suivi du nom du paquetage de votre application (= l'attribut package de la balise manifest de l' ) ? Par exemple :

3°) Obtenir une Maps API v2 Key (10/10) c) obtenir une clé "API key"

? En retour, une nouvelle entrée dans la page API Access indique l'API key associée au couple (réduit SHA1;paquetage) :

 

? La valeur API key est celle commençant par AIza

4°) Configurer

(1/3)

 

? Il y a beaucoup d'indications à mettre dans l' ? Des permissions d'accès réseau :

<manifest xmlns:android="; package="paquetageDeLAppli" >

<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=".permission.READ_GSERVICES" />     <!--

     The following two permissions are not required to use      Google Maps Android API v2, but are recommended.

-->

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

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

? Des indications d'utilisation d'OpenGL

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

4°) Configurer

(2/3)

 

? Des indications d'utilisation de réception de cartes géographiques

<permission android:name="paquetageDeLAppli.permission.MAPS_RECEIVE" android:protectionLevel="signature" />

<uses-permission

android:name="paquetageDeLAppli.permission.MAPS_RECEIVE" />

? L'API key utilisée

<meta-data android:name=".v2.API_KEY" android:value="lAPIkey" />

? Evidemment toutes ces indications à mettre comme fils de basile adéquate

? Voir à ndroid/start#specify_settings_in_the_application_m anifest


4°) Un (3/3)

   

<?xml version="1.0" encoding="utf-8"?>

 

<manifest xmlns:android=";

XXX package="paquetageDeLAppli"

>

    <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=".permission.READ_GSERVICES" />     <!--

     The following two permissions are not required to use

     Google Maps Android API v2, but are recommended.

    -->

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

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

    <uses-sdk />

    <permission android:name="paquetageDeLAppli.permission.MAPS_RECEIVE" android:protectionLevel="signature" />

    <uses-permission android:name="paquetageDeLAppli.permission.MAPS_RECEIVE" />

    <application >

        <activity

        </activity>

        <meta-data android:name=".v2.API_KEY"

android:value="lAPIkey© JMF (Tous droits réservés)" />                              29

    </application>

</manifest>

 

?

5°) Ecrire une activité demandant à afficher une carte Google

 

import .Activity; import .Bundle;

public class MainActivity extends Activity {

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); }   }

? Le code de l'activité est :

? Peut on faire plus simple ?

? Tout est donc dans l' qui est :

<?xml version="1.0" encoding="utf-8"?>

<fragment

xmlns:android="; android:id="@+id/map" android:name=".MapFragment" android:layout_width="match_parent"     android:layout_height="match_parent" />

© JMF (Tous droits réservés)

Exécution du programme

 

? Rappelons que l'exécution doit être faite sur un véritable smartphone : pas possible de la faire sur un AVD (au 23 mai 2013, depuis le 18 mars 2013)

? En lançant le programme précédent (constitué de la bonne activité, le bon , le bon ), une carte (de l'Afrique ?) doit s'afficher

? Pour cela il faut avoir les Google Play Services (voir à

) dans le smartphone. Théoriquement, "Devices running Android 2.2 and newer and that have the Google Play Store app automatically receive updates to Google Play services. Enhance your app with the most recent version of Google Play services without worrying about your users' Android version."

? "In general, devices running Android 2.2 (Froyo) or later and have the Google Play Store app installed receive updates within a few days. This allows you to use the newest APIs in Google Play services and reach most of the devices in the Android ecosystem"

                                                                                                  © JMF (Tous droits réservés)                              31

Mise à jour du smartphone

 

? Euh, le code précédent fonctionne si le smartphone est bien à jour (version >= 2.2) avec la bibliothèque Google play services. On peut le vérifier avec une autre application Android contenant le code :

int result = GooglePlayServicesUtil.isGooglePlayServicesAvailable(this);

int SDK_INT = .Build.VERSION.SDK_INT; Log.d("JMF", "version android = " + SDK_INT);

switch (result) { case ConnectionResult.SUCCESS :

Log.d("JMF", "GooglePlayServicesUtil.SUCCESS"); break;

}

? Parfois (!), si la bibliothèque Google play services n'est pas présente une boite de dialogue est affichée pour la charger ? source :

d-8-or-higher-check-for-google-play-services

? On peut aussi vérifier qu'on peut afficher des maps© JMF (Tous droits réservés)         en lançant l'application Maps (merci Frédéric)

Afficher une carte centrée sur un point terrestre

 

? Le code complet de l'activité affichant les champs élysées est :

import .Activity; import .Bundle; import ;

import .CameraUpdateFactory; import .GoogleMap; import .MapFragment; import .model.LatLng;

public class MainActivity extends Activity { static final LatLng PARIS_CHAMPS_ELYSEES = new LatLng(48.870209,2.306268); private GoogleMap map;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((MapFragment) getFragmentManager().findFragmentById()).getMap();

if (map!=null){ map.moveCamera(CameraUpdateFactory.newLatLngZoom(PARIS_CHAMPS_ELYSEES, 14));



} else {

Log.v("JMF", "map == null"); }

}  

                                                                                                    © JMF (Tous droits réservés)                                                     33

}


Explication du code

 

? Pour modéliser les couples (latitude, longitude) on dispose de la classe .model.LatLng. Pour

accéder à la latitude et la longitude d'un objet de cette classe on appele directement les champs publics :

public final double latitude (la latitude en degrés) public final double longitude (la longitude en degrés) (beurk)

? Un carte est un objet de la classe .GoogleMap. On ne construit pas d'objet de cette classe. On les récupère par

map = ((MapFragment) getFragmentManager().findFragmentById()).getMap();

? (MapFragment) getFragmentManager().findFragmentById(); retourne un MapFragment (qui est un Fragment) construit à partir de la balise fragment du fichier

Position sur un point terrestre

 

? Un objet de la classe CameraUpdateFactory modélise un point de vue

? Les méthodes (toutes statiques) de cette classe modifie le point de vue (zoom, déplacement, animation de déplacement, ). Il faut utiliser ces méthodes, après avoir testé que getMap() a retourné une valeur non null

? La méthode public static CameraUpdate newLatLngZoom (LatLng latLng, float zoom) "returns a CameraUpdate that moves the center of the screen to a latitude and longitude specified by a LatLng object, and moves to the given zoom level."

? La valeur de zoom est ajustée de 2.0 à 21.0 (zoom maximal) ? La méthode public final void moveCamera

(CameraUpdate update) de la classe GoogleMap positionne le

point de vue indiqué par l'argument. Le mouvement e© JMF (Tous droits réservés)                                                                           st instantaté35

Conversion adresse d'un point terrestre en (longitude,latitude)

 

? Utiliser google maps à

? Indiquez l'adresse, clic droit sur le point et item "Plus d'infos sur cet endroit"

 

? Les coordonnées latitude, longitude apparaissent à place de l'adresse

 

Afficher des marqueurs sur une carte

 

? Le code complet de l'activité affichant les champs élysées est :

import .Activity; import .Bundle; import ;

import .*; import .model.*;

public class MainActivity extends Activity { static final LatLng PARIS_CHAMPS_ELYSEES = new LatLng(48.870209,2.306268); static final LatLng GAUMONT_CHAMPS_ELYSEES = new LatLng(48.870386,2.306793); private GoogleMap map;

@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); map = ((MapFragment) getFragmentManager().findFragmentById()).getMap();

if (map!=null){ map.moveCamera(CameraUpdateFactory.newLatLngZoom(PARIS_CHAMPS_ELYSEES, 14));

map.addMarker(new MarkerOptions() .position(GAUMONT_CHAMPS_ELYSEES)

.icon(BitmapDescriptorFactory.fromResource(R.drawable.cinema)));

                               }                    © JMF (Tous droits réservés)                                                     37

}  

}


Marqueur "cliquable" "simple"

 

? S'il s'agit simplement d'ajouter une bulle d'aide avec titre et un commentaire, il suffit d'écrire :

map.addMarker(new MarkerOptions()

.position(GAUMONT_CHAMPS_ELYSEES)

.title("cinéma gaumont")

.snippet("super le cinéma")

.icon(BitmapDescriptorFactory.fromResource(R.drawable.cinema)));

? Les méthodes position( ), title( ), snippet( ), icon( ) retourne le MarkerOptions sur lequel elles ont été lancées. D'où l'enchainement des appels

Marqueur "cliquable"

 

? Pour lancer du code quelconque lorsqu'un marqueur est cliqué, il suffir d'ajouter un OnMarkerClickListener à la GoogleMap ? Par exemple :

map.setOnMarkerClickListener(new OnMarkerClickListener() {

@Override

  public boolean onMarkerClick(Marker marker) {

Toast leToast = Toast.makeText(getApplicationContext(), "message", Toast.LENGTH_LONG); (); return false;

  }

});

? L'argument de onMarkerClick( ) est le marqueur utilisé

? tutorial sur les marqueurs à

ndroid/marker

Exercice

 

? Faire afficher une activité montrant une carte avec des marqueurs iteractifs

 

Street View

? = Une application Google intéressante qui montre des photos terrestres

? Après un clic sur un marqueur, on peut utiliser ce service dans une application Android à l'aide du code :

map.setOnMarkerClickListener(new OnMarkerClickListener() {

  @Override   public boolean onMarkerClick(Marker marker) { double laLatitudeTerrestreDuPoint = marker.getPosition().latitude; double laLongitudeTerrestreDuPoint = marker.getPosition().longitude;

String uri = "google.streetview:cbll="+laLatitudeTerrestreDuPoint

+","+laLongitudeTerrestreDuPoint+"&cbp=1,99.56,,1,1&mz=21" ;

Intent streetView = new Intent(Intent.ACTION_VIEW, Uri.parse(uri));

().startActivity(streetView);

return false;

  }

});

? On utilise l'URI

google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zo om&mz=mapZoom

URI de Street View

 

? C'est l'URI

google.streetview:cbll=lat,lng&cbp=1,yaw,,pitch,zoom&mz= mapZoom

? Les champs cbp (non expliqué ?) et mz sont facultatifs

? yaw ici égal a 99.56 est la direction de vue mesurée en degré depuis le nord dans le sens des aiguilles d'une montre. Ici 99.56 indique l'est, légèrement vers le sud

? Les 2 virgules consécutives sont nécessaires pour des raisons de compatibilités avec des versions précédentes

? pitch ici égal à 1 est l'angle par rapport a l'horizontal : -90 pour une vue vers le haut, et 90 vers le bas. 1 indique une direction légèrement en dessous de l'horizontal (vue humaine normale)

? zoom est l'angle de vision, 1 est le zoom normal (= 90°)

? mapZoom est la valeur de zoom des carttes Google

? source : © JMF (Tous droits réservés)

Exercice

 

? Lorsque l'utilisateur sélectionne un marqueur, une street view du lieu est affiché


chapitre(1/3)

? La page d'accueil de Maps Android API v2 :

ndroid/

? Le tutorial de Google sur les Maps Android API v2 :

ndroid/start

? Le tutorial de Lars Vogel :

? Installation de la bibliothèque Google play services :

ndroid/intro

? Obtenir une clé Maps API v2 :

ndroid/start#the_google_maps_api_key© JMF (Tous droits réservés)

chapitre(2/3)

 

? La documentation des classes Google Maps Android :


chapitre(2/2)

 

? Pour street view : "Réalisation de l'application établissement scolaire à destination des élèves sur le système Android", Bistra Raykova rapport interne CNAM RSX215 soutenu le 29 septembre 2011 ? street view :

-using-streetview-without-starting-an-intent


 

Fin



9