samedi 8 octobre 2011

Géolocalisation sous Android


Dans cette partie, nous allons aborder la géolocalisation sous Android.
Une fois le projet mis en place dans votre Eclipse, nous allons commencer cette partie.

LocationListener

La première étape pour pouvoir géocaliser un utilisateur est d’implémenter l’interfaceLocationListener dans votre HelloGoogleMapActivity. Cette classe est utilisée quand la localisation du téléphone est mise à jour.
Ainsi la première étape est d’appeler la méthode requestLocationUpdates(String, long, float, LocationListener) qui permet de s’abonner aux changements de localisation.
Implementer l’interface LocationListener signifie qu’on surchage les 4 méthodes suivantes :
  • OnLocationChanged(Location location) : Cette méthode est appelée quand lagéolocalisation de l’utilisateur change. L’argument représente la nouvelle localisation du téléphone.
  • OnProviderDisabled(String provider) : Cette méthode est appelée quand l’utilisateur désactive la source de localisation (GPS, 3G..etc). L’argument est le nom de la source désactivée.
  • OnProviderEnabled(String provider) : Cette méthode est appelée quand l’utilisateur active une source qu’on peux utiliser pour géolocaliser (GPS, 3G..etc). L’argument est le nom de la source activée.
  • OnStatusChanged(String provider, int status, Bundle extras) : Appeler quand le status d’une source change.
On va appliquer ce qu’on vient de dire sur notre code. Ce qui donne :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package com.android.map;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.KeyEvent;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapView;
public class HelloGoogleMapActivity extends MapActivity implements LocationListener
{
 private MapView                mapView;
 private LocationManager            lm;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 mapView = (MapView) this.findViewById(R.id.mapView);
 mapView.setBuiltInZoomControls(true);
 lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this);
 lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, this);
 }
 @Override
 protected boolean isRouteDisplayed()
 {
 return false;
 }
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
 if (keyCode == KeyEvent.KEYCODE_S)
 {
 mapView.setSatellite(!mapView.isSatellite());
 return true;
 }
 return super.onKeyDown(keyCode, event);
 }
 @Override
 public void onLocationChanged(Location location)
 {
 // TODO Auto-generated method stub
 }
 @Override
 public void onProviderDisabled(String provider)
 {
 // TODO Auto-generated method stub
 }
 @Override
 public void onProviderEnabled(String provider)
 {
// TODO Auto-generated method stub
 }
 @Override
 public void onStatusChanged(String provider, int status, Bundle extras)
 {
 // TODO Auto-generated method stub
 }
}
Petite explications :
  • Nous avons besoin d’une instance de la classe LocationManager. Cette dernière donne accés au service de localisation. Cela permet aux applications d’obtenir des mises à jour périodiques de la géocalisation de l’utilisateur.
  • On appele la méthode requestLocationUpdate pour la mise à jour via le Réseau (NetWork) et le GPS.
  • On implémente les méthodes obligatoires de LocationListener.

OnLocationChanged

Maintenant nous allons implémenter la méthode OnLocationChange pour obtenir les nouvelles coordonnées dès qu’elles seront mise à jour. On va commencer par déclarer deux attributs à la classe.
1
2
private double      lat = 0;
private double      lng = 0;
Puis nous allons implémenter OnLocationChanger, et stocker les nouvellescoordonnées afin de les afficher à l’aide d’un Toast.
1
2
3
4
5
6
7
8
public final void onLocationChanged(Location location)
{
 lat = location.getLatitude();
 lng = location.getLongitude();
 Toast.makeText(getBaseContext(),
 "Location change to : Latitude = " + lat + " Longitude = " + lng,
 Toast.LENGTH_SHORT).show();
}
Dans votre AndroidManifest, il faut absolument rajouter les permissions suivantes, pour pouvoir accéder à la géolocalisation et au GPS :
1
2
3
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_GPS" />
<uses-permission android:name="android.permission.LOCATION" />
Pour pouvoir mettre à jour les coordonnées de l’utilisateur dans l’émulateur, deux solutions sont disponibles :
  • l’émulateur contrôle : Fourni avec le SDK et intégré à Eclipse.
  • Un client telnet (PuttyTel) : Pour l’utiliser, il suffit de le lancer et remplir les champs suivants (Host Name : localhost et Port 5554) et pour finir taper help pour connaître les différentes commandes. En ce qui concerne la géolocalisation la commande est la suivante : geo fix latitude longitude.
Dans l’émulateur contrôle, dans la partie Location Controls, tapez les coordonnées que vous voulez, puis cliquez sur send.
Voila le résultat au lancement :
Et celui après avoir changer la géolocalisation :
On remarquera qu’on a bien la réception des nouvelles coordonnées mais la carte n’a pas bougé. Allons changer ça.
Pour cela il nous suffit de créer un MapController( une classe qui sert à gérer le déplacement, le zoom et la pose de panneau dans une google map) :
1
private MapController               mc;
Puis dans le OnCreate, on rajoute
1
2
mc = mapView.getController();
mc.setZoom(12);
puis finalement dans le OnLocationChanged
1
2
3
p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
mc.animateTo(p);
mc.setCenter(p);
Ce qui donnera finalement :
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
package com.android.map;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.view.KeyEvent;
import android.widget.Toast;
import com.google.android.maps.GeoPoint;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
public class HelloGoogleMapActivity extends MapActivity implements LocationListener
{
 private MapView                            mapView                     = null;
 private LocationManager            lm                              = null;
 private double                         lat                             = 0;
 private double                         lng                             = 0;
 private MapController              mc                              = null;
 @Override
 public void onCreate(Bundle savedInstanceState) {
 super.onCreate(savedInstanceState);
 setContentView(R.layout.main);
 mapView = (MapView) this.findViewById(R.id.mapView);
 mapView.setBuiltInZoomControls(true);
 lm = (LocationManager) this.getSystemService(LOCATION_SERVICE);
 lm.requestLocationUpdates(LocationManager.GPS_PROVIDER, 10000, 0, this);
 lm.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 10000, 0, this);
 mc = mapView.getController();
 mc.setZoom(12);
 }
 @Override
 protected boolean isRouteDisplayed()
 {
 return false;
 }
 @Override
 public boolean onKeyDown(int keyCode, KeyEvent event)
 {
 if (keyCode == KeyEvent.KEYCODE_S)
 {
 mapView.setSatellite(!mapView.isSatellite());
 return true;
 }
 return super.onKeyDown(keyCode, event);
 }
 @Override
 public void onLocationChanged(Location location)
 {
 lat = location.getLatitude();
 lng = location.getLongitude();
 Toast.makeText(getBaseContext(),
 "Location change to : Latitude = " + lat + " Longitude = " + lng,
 Toast.LENGTH_SHORT).show();
 GeoPoint p = new GeoPoint((int) (lat * 1E6), (int) (lng * 1E6));
 mc.animateTo(p);
 mc.setCenter(p);
 }
 @Override
 public void onProviderDisabled(String provider)
 {
 // TODO Auto-generated method stub
 }
 @Override
 public void onProviderEnabled(String provider)
 {
 // TODO Auto-generated method stub
 }
 @Override
 public void onStatusChanged(String provider, int status, Bundle extras)
 {
 // TODO Auto-generated method stub
 }
}
Allons voir le résultat maintenant, avant de changer de géolocalisation (On remarque que la carte est zoomée et ça grâce au setZoom défini plus haut)
Et une fois les coordonnées changées( on remarquera que la carte s’est bien deplacée):

Conclusion

Voila ce tutoriel est maintenant fini, en espérant qu’il vous a aidé à mieux comprendre lagéolocalisation sur Android. N’hésitez pas à me contacter, commenter ou poser vos questions. Je vous fourni le code du projet ici.
Si la géolocalisation vous intéresse énormément, et que vous voulez appliquer le même principe sur votre navigateur en utilisant la nouvelle fonctionnalité de l’HTML 5  par exemple je vous conseille ce tutoriel.

1 commentaires:

groupe 5 Web Social a dit…

:) merci

Enregistrer un commentaire

Twitter Delicious Facebook Digg Stumbleupon Favorites More

 
Design by Free Android website | Bloggerized by wassim El mririe - Ramzi Essid | TO Best Web Host