Sunteți pe pagina 1din 29

L'API Google de golocalisation pour Android

JMF (Tous droits rservs)

La (go)localisation : le sytme GPS


GPS = Global Positionning System 24 satellites (au moins) tournant autour de la terre

et diffusant leur position et l'heure de diffusion Un rcepteur, quip d'une horloge, reoit au moins 4 signaux de 4 satellites et calcule alors sa position prcision de 15 100 mtres (version standard)
source : http://fr.wikipedia.org/wiki/GPS
JMF (Tous droits rservs) 2

La (go)localisation : l'Android's Network Location


Utilise les rseaux tlphoniques cellulaires et le Wi-Fi Est plutt conseill : utilise moins de puissance lectrique, fonctionne l'intrieur et l'extrieur, est plus rapide
source : http://developer.android.com/guide/topics/location/obtaininguser-location.html

JMF (Tous droits rservs)

Utiliser les cartes de Google


Un des grands avantages d'Android est de pouvoir bnficier des principales applications dj dveloppes par Google. L'une d'elle sont les Google maps Toute une API permet d'utiliser ces cartes Google Hormis que cette API n'est pas comprise dans les API Android (c'est une extension) mais dans une API Google : les Google APIs Add-On. Il faut donc l'indiquer et l'avoir lors du dveloppement et de l'excution Un excellent tutorial sur ce domaine se trouve http://code.google.com/intl/en/ android/add-ons/google-apis/ index.html

JMF (Tous droits rservs)

La bibliothque Google Maps


Elle permet d'afficher des cartes terrestres. C'est une bibliothque en supplment des bibliothques Android. Elle se trouve dans le package com.google.android.maps La classe qui affiche une carte est la ViewGroup com.google.android.maps.MapView Cette vue gre les entres clavier, le zoom, le toucher On peut ajouter des dessins, des images, sur la carte Pour utiliser cette API, on doit enregistrer le service Google Maps et obtenir une cl Maps API Bibliographie : http://code.google.com/intl/en/android/add-ons/googleapis/mapkey.html

JMF (Tous droits rservs)

Les tapes pour utiliser les cartes de Google


Pour utiliser les cartes Google, il faut suivre les tapes suivantes : 1) Installer les Google APIs add-on (GAAO) dans le SDK 2) Crer (ou reconfigurer) un projet utilisant ces GAAO 3) Lancer un Android Virtual Device (AVD) ayant ces GAAO 4) Utiliser la classe MapView dans le code 5) Obtenir une cl "Maps API" pour que l'application puisse afficher les donnes Google Maps 6) Ajouter l'lement XML dans l'AndroidManifest.xml indiquant qu'on a besoin d'utiliser les GAAO 7) Signer l'application en utilisant la cl "Maps API" source : http://code.google.com/intl/en/android/addons/google-apis/maps-overview.html
JMF (Tous droits rservs) 6

1) Installer les Google APIs Add-On (1/2)


Pour charger ou vrifier que vous avez la bonne Google Apis 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

source : http://code.google.com/intl/en/android/addons/google-apis/installing.html
JMF (Tous droits rservs) 7

1) Installer les Google APIs Add-On (2/2)


L'"Android SDK Manager" est la fentre :

Slectionner la version Google APIs voulue et cliquer Install (si elle n'est pas dj installe !)
JMF (Tous droits rservs)

2) Crer un projet utilisant les GAAO


A la cration d'un projet, il est demand les APIs (Android ou Google ou ...) utiliss. Prciser qu'on veut les GAAO

JMF (Tous droits rservs)

2) Configurer un projet utilisant les GAAO


Il se peut que le projet soit dj en partie construit mais que les GAAO ne soient pas intgres ce projet existant. Pour les ajouter : Dans l'onglet Package Explorer, slectionner le projet, cliquer droit | Properties Dans le fentre "Properties for LeProjet ", slectionner Android, slectionner l'API GAAO qui convient et cliquer OK

JMF (Tous droits rservs)

10

3) Lancer un Android Virtual Device (AVD) ayant ces GAAO


Cliquer Window | AVD Manager Dans la fentre "Android Virtual Device Manager", si vous avez dl des AVD utilisant les GAAO, c'est fini

Sinon cliquez "New...". Donner un nom l'AVD (Name: ) et indiquer l'API que cet AVD doit avoir : ici une des GAA0 Par la suite, l'excution du projet devra utiliser cet AVD

JMF (Tous droits rservs)

11

4) Utiliser la classe MapView dans le code


Le paquetage com.google.android.maps est non banal. L'API Google Maps ne faisant pas partie des APIs de base d'Android, sa documentation n'est pas avec l'API de base mais http://code.google.com/intl/fr-FR/android/addons/google-apis/reference/index.html Pour afficher une carte Google, on devra construire une activit qui drive de MapActivity et qui affiche une MapView. Lorsqu'on utilise une MapView, celle-ci gre non seulement l'affichage d'une carte mais ses interactions "naturelles" : zoom, dplacement au toucher On ajoute en gnral des indications sur une carte : point de localisation, points importants sous forme de "marqueurs" (= Overlay) Un bon tutorial pour coder une application utilisant les cartes Google se trouve http://developer.android.com/guide/tutorials/views/hello -mapview.html
JMF (Tous droits rservs) 12

5) Obtenir une cl Google pour utiliser les GAAO (1/7)


Pour afficher des donnes de cartes Google, il faut avoir une cl Google (appel "Maps API Key"). Sans cl Google, on peut nanmoins compiler et excuter mais seul le fond de la carte est affich Une cl Google est associe une empreinte MD5 d'un certificat (et oui !) = une cl Google permet d'identifier une empreinte (hashcode) d'un certificat (enveloppe contenant un cl publique) Une cl Google Maps API est donc associe une empreinte de certificat. En cours de dveloppement on utilise une cl de dveloppement dite de debug ! Lorsqu'on publie l'application, on doit utiliser une cl de dploiement dite "release key"

source : http://code.google.com/intl/en/android/addons/google-apis/maps-overview.html
JMF (Tous droits rservs) 13

5) Obtenir une cl Google pour utiliser les GAAO (2/7)


"Registering is free and takes only a few minutes" ou encore "Registering for a Maps API Key is simple, free, ..." Euh, c'est vrai que c'est gratuit ! Toutes les MapView d'une application doivent utiliser la mme cl Google. Deux applications peuvent utiliser la mme cl Google mais elles peuvent aussi utiliser des cls Google diffrentes source : http://code.google.com/intl/en/android/addons/google-apis/mapkey.html

JMF (Tous droits rservs)

14

5) Obtenir une cl Google pour utiliser les GAAO (3/7)


Bref avant tout, et avant d'avoir une cl Google pour utiliser les GAAO, il faut un certificat Rappel (?) : un certificat contient essentiellement une cl publique (et souvent des renseignements associs) Pour crer un certificat, une cl publique (associ une cl prive), un entrept de cls, on utilise l'outil keytool. Ce n'est pas de l'Android, c'est du Java Pour la cl debug, l'entrept de cls 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
JMF (Tous droits rservs) 15

5) Obtenir une cl Google pour utiliser les GAAO (4/7)


L'entrept de la debug key peut tre trouv dans Eclipse par Windows | Preferences, puis Android | Build

JMF (Tous droits rservs)

16

5) Obtenir une cl Google pour utiliser les GAAO (5/7)


Pour crer une empreinte MD5 d'un certificat on lance la commande keytool -list -alias androiddebugkey -keystore "arborescenceAmenantA\debug.keystore" -storepass android -keypass android -list permet d'obtenir une empreinte MD5 du certificat cr -alias nomDeCle est l'alias de cl gnr dans ce certificat -keystore nomEntrepotDeCles prcise l'entrept de cls -storepass motDePasseDeLEntrepot indique le mot de passe de l'entrept de cls. Euh il devrait plutt tre pass pendant l'excution de la commande plutt 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 donnes pas dfaut par le plug-in Android source : http://developer.android.com/guide/publishing/appsigning.html
JMF (Tous droits rservs) 17

5) Obtenir une cl Google pour utiliser les GAAO (6/7)


La commande prcdente (keytool -list ...) retourne l'empreinte MD5 du certificat cr. Par exemple : C7:BB:B6:6B:01:6D:7A:A1:90:03:7C:4F:35:BE:B8:47 Remarque : utiliser keytool de Java 6 (qui gnre des empreintes MD5). keytool de Java 7 gnre des empreintes SHA1 ! Dans ce cas utiliser l'option -v On se connecte ensuite l'URL
http://code.google.com/intl/en/android/maps-api-signup.html

en bas de cette page, il faut : - cocher la case "I have read ..." - recopier cette cl MD5 Puis cliquez sur le bouton "Generate API Key"

JMF (Tous droits rservs)

18

5) Obtenir une cl Google pour utiliser les GAAO (7/7)


On arrive alors sur la page : (euh il faut avoir un compte Google !) qui renvoie la cl Google Cette page prcise l'utilisation de cette cl Remarque : "If you happen to forget your Maps API Key, you can generate a fingerprint for your certificate and register it again. The registration server will give you the same Maps API Key for the specified certificate fingerprint." => la mme empreinte donne la mme cl Maps APIs Super non !
JMF (Tous droits rservs) 19

6) Element XML dans AndroidManifest.xml pour les GAAO


Le fichier de configuration de l'application Android AndroidManifest.xml doit contenir l'entre uses-library avec l'attribut android:name ayant pour valeur com.google.android.maps comme fille de l'lment application En gnral, l'application a aussi besoin d'un accs internet donc il faut aussi avoir comme fille de manifest, l'entre
<uses-permission android:name="android.permission.INTERNET" />

Exemple :
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.package.name"> <uses-permission android:name="android.permission.INTERNET" /> ... <application android:name="MyApplication" > <uses-library android:name="com.google.android.maps" /> ... </application> ... </manifest>

Remarque : on peut construire ces entres par l'IHM d'Eclipse mais bon ...
JMF (Tous droits rservs) 20

7) Signer l'application en utilisant la cl "Maps API"


Comme indiqu dans la page web de Google, il faut mettre la cl "Maps API" comme valeur de l'attribut android:apiKey de l'lment MapView dans le fichier xml ddi l'IHM contenant cette MapView (map_station.xml) Par exemple : <com.google.android.maps.MapView
... android:apiKey="0Ij8_0kpzM7wmfXY2qmqP8DEAdQ2sOj8rimy4Yg" />

Remarque : En gnral, la valeur de la cl est mise dans strings.xml, et le fichier de layout ci dessus contient une rfrence cette valeur. Ce sera ainsi plus facile lorsqu'on devra ensuite utiliser la cl de dploiement (release key) On a donc : <com.google.android.maps.MapView
... android:apiKey="@string/mapkey" />

et dans strings.xml
<?xml version="1.0" encoding="utf-8"?> <resources> ... <string name="mapkey">0Ij8_0kpzM7wmfXY2qmqP8DEAdQ2sOj8rimy4Yg</string> </resources>

JMF (Tous droits rservs)

21

L'IHM affichant une carte


L'IHM qui affiche une carte est (videmmennt) dcrite dans un fichier XML. Ici le fichier map_station.xml :
<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mainlayout" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.google.android.maps.MapView android:id="@+id/carte" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apiKey="votreCleMapsAPI" android:clickable="true" /> </RelativeLayout>

votreCleMapsAPI est celle que vous avez eu de Google


JMF (Tous droits rservs) 22

Enfin du code : les amriques !


L'environnement Google Maps et la cl Maps API tant obtenu, on peut utiliser les cartes Google Le simple code suivant permet d'afficher la carte :
public class CarteGoogleProjetActivity extends MapActivity { private MapView mapView; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.map_station); mapView = (MapView) findViewById(R.id.carte); mapView.setBuiltInZoomControls(true); } @Override protected boolean isRouteDisplayed() { return false; } }

JMF (Tous droits rservs)

23

Explication du code
L'activit qui affiche une carte Google doit driver de MapActivity Ce qui ncessite d'implmenter la mthode boolean isRouteDisplayed() (abstraite dans la classe MapActivity) Cette mthode est utile pour le serveur Google pour savoir si on veut afficher des informations de routage (sens obligatoire, ...) : ce n'est pas clair dans la documentation Reamarque : les MapViews ne peuvent tre cres que l'intrieur d'une instance d'une MapActivity. C'est curieux mais c'est comme cela. Sinon on a, l'excution, l'erreur : "java.lang.IllegalArgumentException: MapViews can only be created inside instances of MapActivity."

JMF (Tous droits rservs)

24

Afficher une carte Google centre sur un point terrestre


Il faut, pour cela, un MapController rcupr de la MapView par la mthode getController() setContentView(R.layout.map_station); Par exemple :
MapView carte = (MapView) findViewById(R.id.carte); MapController mc = carte.getController();

La classe dont les instances sont des points terrestres est la classe GeoPoint. Le seul constructeur de cette classe est public GeoPoint(int latitudeE6, int longitudeE6) o latitudeE6 et longitudeE6 sont mesures en microdegrs (= degrs * 1E6) Par la suite on passe ce GeoPoint au MapController par la mthode : animateTo(leGeoPoint); On a donc : Double latCourant = laLatitudeTerrestreDuPoint * 1E6;

Double lngCourant = laLongitudeTerrestreDuPoint * 1E6; GeoPoint pointCourant = new GeoPoint(latCourant.intValue(), lngCourant.intValue()); mc.animateTo(pointCourant); mc.setZoom(17);

Une valeur de zoom de 17 (entre 1 droits et 21) est convenable (pour un quartier JMF (Tous rservs) 25 parisien !)

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


Utiliser google maps http://maps.google.fr/ Indiquez l'adresse, clic droit sur le point et item "Plus d'infos sur cet endroit"

Les coordonnes latitude, longitude (dans cet ordre !) apparaissent place de l'adresse

JMF (Tous droits rservs)

26

Les Intent : le retour


Les Intent permettent de dfinir des intentions faire quelque chose. On les a dj utiliss pour qu'une Activity en lance une autre Ils servent parfois d'enveloppes pour passer des informations d'une Activity une autre. On utilise pour cela une des mthodes
public Intent putExtra(String nomDeLExtra, unType valeur)

Par exemple :

Intent i = new Intent(leContexte, MapStationActivity.class); i.putExtra("latitude", latitudeDuPointCourant); i.putExtra("longitude", longitudeDuPointCourant); startActivity(i);

Dans une Activity, on rcupre l'Intent qui a lanc l'Activity par getIntent(). On peut alors rcuprer tous les extras de l'Intent par getExtras(), et, par la suite, un extra associ une entre par getTypeEntre(nomEntre, valeurParDefaut), valeurParDefaut est la valeur retourne si il n'y a pas d'extra associ nomEntre dans l'Intent laLatitudeDeLaStation = Par exemple : double getIntent().getExtras().getDouble("latitude", 0);
JMF (Tous droits rservs) 27

Exercice
Affichage d'une carte google

JMF (Tous droits rservs)

28

Fin

JMF (Tous droits rservs)

29

S-ar putea să vă placă și