Vous-êtes vous déjà demander comment faire pour afficher sa position en temps réel via un GPS sur son smartphone ? Et bien cet article vous l’expliquera pas à pas !

Attention, ce tuto s’adresse aux gens qui s’y connaissent déjà en programmation android et qui possède certaines bases !

Nous allons développer une application de géolocalisation via Google maps ( rien de très original ). La particularité de notre appli sera de pouvoir savoir à quel adresse on se trouve en temps réel grâce à un simple clic sur l’icône indiquant notre position.

 

Pré-requis pour cette application :

  • Connaissance en programmation orientée objet ( POO )
  • Connaissance du cycle de vie d’une activity
  • Récupérer un apiKey pour l’utilisation du google map ( voir le tuto Obtention d’une clé pour l’api google map )


<p >Rappel de la commande :

keytool -list -alias androiddebugkey \

<p >-keystore <chemin_du_debug_keystore>debug.keystore \

-storepass android -keypass android

 

 Dans le manifest.xml, il vous faudra ajouter les permissions suivantes :

 

– Les permissions pour l’accès à internet : <uses-permission android:name= »android.permission.INTERNET » />

 – Access_fine_location : <uses-permission android:name= »android.permission.ACCESS_FINE_LOCATION » />

– Access-coarse_location : <uses-permission android:name= »android.permission.ACCESS_COARSE_LOCATION » />

– Il faut également ajouter la librairie de google map : <uses-library android:name= »com.google.android.maps » />


Dans votre layout/ main.xml, ajoutez le layout suivant :

main.xml
<com.google.android.maps.MapView     android:id="@+id/mapview"     android:layout_width="fill_parent"     android:layout_height="fill_parent"     android:apiKey="Votre cle google map" /> 


Modélisation :

 

La classe que nous devons créée héritera de la classe abstraite MapActivity pour pouvoir afficher la carte.

On implémentera également LocationListener qui permettra de mettre à jour la carte lorsqu’une nouvelle position est détectée.

Une instance de la classe LocationManager nous permettra d’accéder aux services de localisation.

Si on souhaite également afficher une boussole et un rond bleu autour de notre point, on devra utiliser une instance de la carte MyLocationOverlay.

 

voici un diagramme de classe présentant les interactions entre les classes :

 

 

Implémentation :

 Voici donc le code de notre activité principale !

Activité principale
public class GmapActivity extends MapActivity implements LocationListener{        private MapController mapController;    private MapView mapView;    private LocationManager locationManager;    MyLocationOverlay myLocationOverlay;   private MyOverlays itemizedoverlay;       public void onCreate(Bundle bundle) {    super.onCreate(bundle);    setContentView(R.layout.main);       mapView = (MapView) findViewById(R.id.mapview);    mapView.setBuiltInZoomControls(true);    mapView.setSatellite(true);         mapController = mapView.getController();     mapController.setZoom(18);         locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);        locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 5000, 10, this);         myLocationOverlay = new MyLocationOverlay(this, mapView);    mapView.getOverlays().add(myLocationOverlay);        myLocationOverlay.runOnFirstFix(new Runnable() {    public void run() {    mapView.getController().animateTo(    myLocationOverlay.getMyLocation());    }    });        Drawable drawable = this.getResources().getDrawable(R.drawable.ic_launcher);    itemizedoverlay = new MyOverlays(drawable, mapView);    afficherMarker();    }         @Override    protected void onResume() {    super.onResume();    myLocationOverlay.enableMyLocation();    myLocationOverlay.enableCompass();    }        @Override    protected void onPause() {    super.onResume();    myLocationOverlay.disableMyLocation();    myLocationOverlay.disableCompass();    }       @Override    protected boolean isRouteDisplayed() {     return false;    }         @Override     public void onLocationChanged(Location location) {     int lat = (int) (location.getLatitude() * 1E6);     int lng = (int) (location.getLongitude() * 1E6);     GeoPoint point = new GeoPoint(lat, lng);         mapController.animateTo(point);    mapController.setCenter(point);     afficherMarker();    }        @Override    public void onProviderDisabled(String provider) {    }         @Override     public void onProviderEnabled(String provider) {     }         @Override     public void onStatusChanged(String provider, int status, Bundle extras) {     }     private void afficherMarker() {    GeoPoint p = mapView.getMapCenter();     Geocoder gcd = new Geocoder(GmapActivity.this, Locale.getDefault());    String addr ="";    List<Address> addresses;    try {    addresses = gcd.getFromLocation( (p.getLatitudeE6() / 1E6) , (p.getLongitudeE6() / 1E6) ,1);        if (addresses.size() > 0 && addresses != null) {    addr = addresses.get(0).getAddressLine(0);     OverlayItem overlayitem = new OverlayItem(p, "Adress",addr);    itemizedoverlay.addOverlay(overlayitem);    mapView.getOverlays().add(itemizedoverlay);    }    } catch (IOException e) {    e.printStackTrace();    }     }    }

 

Voici maintenant la classe MyOverLays qui hérite de la classe abstraite ItemizedOverlay<OverlayItem>. Cette classe permet de gérer l’affichage des overlays sur la carte ( curseur, etc … )

Deux méthodes abstraites ( createItem et size ) de la classe Itemized<OverlayItem> ainsi que la méthode onTap ( détection du clic sur l’overlay ) devront être redéfinies.

 

Modélisation de ces classes :

 

 

 

 

Implémentation :

 

public class MyOverlays extends ItemizedOverlay<OverlayItem> {    private OverlayItem overlays[] = new OverlayItem[1];     //private ArrayList<OverlayItem> m_overlays = new ArrayList<OverlayItem>();    private Context c;        public MyOverlays(Drawable defaultMarker, MapView mapView) {    super(boundCenterBottom(defaultMarker));    c = mapView.getContext();    }        public void addOverlay(OverlayItem overlay) {    overlays[0] = overlay;     populate();    }        @Override    protected OverlayItem createItem(int i) {    return overlays[i];    }        @Override    public int size() {    return overlays.length;    }        @Override    protected boolean onTap(int index) {    OverlayItem overlayItem = overlays[index];    Toast.makeText(c,overlayItem.getSnippet() , Toast.LENGTH_LONG)    .show();    return true;    };       }

 

Ainsi s’achève ce tuto sur la géolocalisation sur google maps ! Bonne implémentation à vous !

Il est possible de récupérer le zip du projet associé à ce tuto sur demande ! ( Postez des commentaires 😉 )

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.