Skip to content

13 août 2010 | Rédigé par Axon

104

Géolocalisation grâce au GPS ou au réseau mobile [Tutoriel Android n°15]

Grâce à ce nouveau tutorial Android, nous allons passer à la vitesse supérieur dans notre apprentissage dans le développement d’application Android. Nous allons apprendre à afficher l’adresse correspondant à l’endroit où l’on se trouve et ceux grâce à la puce GPS de votre téléphone Android ou simplement grâce au réseau GSM de votre mobile (moins précis). Avant de commencer, je souhaite remercier Benjamin de MobCréation qui m’a fournit le code source commenté.

Avant de se lancer tête baissé dans le code, nous allons voir ensemble les trois parties essentielles du fonctionnement de notre application :

  • On choisit la source (le provider) qui va permettre de nous localiser, c’est à dire la puce GPS ou le réseau GSM
  • On récupère les données correspondant à notre position : longitude, latitude et altitude
  • Enfin, on va chercher l’adresse correspondante à cette position.

Je vous montre tout de suite le résultat final de l’application que nous allons faire. Ceci vous donnera une idée de l’interface graphique que nous allons devoir réaliser.

Dans ce tuto nous allons utiliser les classes et interfaces suivantes:

  • LocationManager : Cette classe permet d’accéder aux services de localisation du système.
  • LocationListener : Utilisé pour la réception des notifications du LocationManager lorsque la position change.
  • Location : Classe représentant une position géographique
  • Adress : Une classe représentant une adresse, c’est à dire un ensemble de chaînes décrivant une position
  • Geocoder : Classe utilisant le service de géolocalisation de Google

Allez hop c’est partie, ce tuto va être un petit peu plus long que les précédents, il ne faut donc pas perdre de temps. Nous sommes là pour apprendre pleins de nouvelles choses alors au boulot ! ;) Comme d’habitude créez un nouveau projet Android (personnellement j’ai utilisé la version 1.6) et c’est partie !!!

AndroidManifest.xml

Nous allons avoir besoin d’un accès à internet et d’un accès à la localisation via le réseau GSM et le GPS. Il faut donc ajouter les permissions suivantes dans le fichier AndroidManifest.xml :

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

Code XML

Le code XML va être beaucoup plus gros que les précédents codes XML que nous avons pu réaliser jusqu’à maintenant. Mais il ne faut pas être effrayé, nous n’utiliserons que des TextView, des EditText et des Button. Néanmoins, nous utiliserons pour la première fois les RelativeLayout, qui sont très pratique pour positionner nos éléments. Cependant il faut savoir les utilisés, donc je pense qu’un prochain tuto sur les fichiers XML sera publié dans les prochains jours, en expliquant comment utiliser les différents layout. Je ne vais donc pas trop m’attarder sur ceci aujourd’hui.

Voici donc le code que vous allez insérer dans le fichier main.xml :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01"
	android:layout_width="fill_parent" 
	android:layout_height="fill_parent"
	xmlns:android="http://schemas.android.com/apk/res/android">
 
	<TextView android:text="Latitude" 
		android:id="@+id/TextView01"
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content"
		android:gravity="center" 
		android:layout_marginLeft="10dip" />
 
	<EditText android:text="0.0" 
		android:id="@+id/latitude"
		android:layout_height="wrap_content" 
		android:layout_alignParentRight="true"
		android:editable="false"
		android:focusable="false"
		android:gravity="center" 
		android:layout_marginRight="10dip"
		android:layout_width="150dip" />
 
	<TextView android:text="Longitude" 
		android:id="@+id/TextView02"
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content"
		android:layout_alignBottom="@+id/longitude" 
		android:layout_alignTop="@+id/longitude"
		android:gravity="center" 
		android:layout_marginLeft="10dip" />
 
	<EditText android:text="0.0" 
		android:id="@+id/longitude"
		android:layout_height="wrap_content" 
		android:layout_alignParentRight="true"
		android:editable="false"
		android:focusable="false"
		android:gravity="center" 
		android:layout_marginRight="10dip"
		android:layout_width="150dip" 
		android:layout_below="@+id/latitude" />
 
	<TextView android:text="Altitude" 
		android:id="@+id/TextView03"
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content"
		android:layout_alignBottom="@+id/altitude" 
		android:layout_alignTop="@+id/altitude"
		android:gravity="center" 
		android:layout_marginLeft="10dip" />
 
	<EditText android:text="altitude" 
		android:id="@+id/altitude"
		android:layout_height="wrap_content" 
		android:layout_alignParentRight="true"
		android:editable="false"
		android:focusable="false"
		android:gravity="center" 
		android:layout_marginRight="10dip"
		android:layout_below="@+id/TextView02" 
		android:layout_width="150dip" />
 
	<LinearLayout android:id="@+id/LinearLayout01"
		android:layout_width="wrap_content" 
		android:layout_height="wrap_content"
		android:layout_below="@id/TextView03" 
		android:layout_centerHorizontal="true"
		android:layout_marginTop="10dip">
 
		<Button android:layout_height="wrap_content" 
			android:text="Choisir la source"
			android:id="@+id/choix_source" 
			android:layout_width="100dip" />
 
		<Button android:layout_height="wrap_content" 
			android:id="@+id/obtenir_position"
			android:text="Obtenir Position" 
			android:layout_width="100dip" />
 
		<Button android:layout_height="wrap_content" 
			android:text="Afficher adresse"
			android:layout_width="100dip" 
			android:id="@+id/afficherAdresse" />
 
	</LinearLayout>
 
	<TextView android:layout_width="wrap_content"
		android:layout_height="wrap_content" 
		android:id="@+id/adresse"
		android:layout_below="@+id/LinearLayout01"
		android:layout_centerHorizontal="true" 
		android:layout_marginTop="10dip" />
 
</RelativeLayout>

Il peut y avoir des choses qu’à première vue vous ne comprendrez pas, donc je vous conseil de supprimer les lignes que vous ne comprendrez pas comme ça vous verrez tout de suite à quoi ça sert, puis remettez-les ensuite ! ^^ En attendant un tuto sur ce sujet…

Code JAVA

Concernant le code JAVA je vais vous le donner comme d’habitude commenter. Et comme toujours si vous avez le moindre souci n’hésitez pas à nous en parler dans un petit commentaire, on se fera une joie de vous aider du mieux que l’on peut. Juste une précision notre classe doit implémenter OnClickListener et LocationListener. Il faut donc obligatoirement implémenter certaine méthode comme onClick(), onLocationChanged(), onProviderDisabled(), onProviderEnabled(), et onStatusChanged(). Vous verrez que certaines ne nous serviront pas, nous nous contenterons d’écrire simplement un Log.

package com.tutomobile.android.geolocalisation;
 
import java.io.IOException;
import java.util.List;
 
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.Window;
import android.view.View.OnClickListener;
import android.widget.TextView;
import android.widget.Toast;
 
public class Tutoriel12_Android extends Activity implements OnClickListener, LocationListener{
	private LocationManager lManager;
    private Location location;
    private String choix_source = "";
 
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
 
        //On spécifie que l'on va avoir besoin de gérer l'affichage du cercle de chargement
        requestWindowFeature(Window.FEATURE_INDETERMINATE_PROGRESS);
 
        setContentView(R.layout.main);
 
        //On récupère le service de localisation
        lManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE);
 
        //Initialisation de l'écran
        reinitialisationEcran();
 
        //On affecte un écouteur d'évènement aux boutons
        findViewById(R.id.choix_source).setOnClickListener(this);
        findViewById(R.id.obtenir_position).setOnClickListener(this);
        findViewById(R.id.afficherAdresse).setOnClickListener(this);
    }
 
        //Méthode déclencher au clique sur un bouton
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.choix_source:
			choisirSource();
			break;
		case R.id.obtenir_position:
			obtenirPosition();
			break;
		case R.id.afficherAdresse:
			afficherAdresse();
			break;
		default:
			break;
		}
	}
 
	//Réinitialisation de l'écran
	private void reinitialisationEcran(){
		((TextView)findViewById(R.id.latitude)).setText("0.0");
		((TextView)findViewById(R.id.longitude)).setText("0.0");
		((TextView)findViewById(R.id.altitude)).setText("0.0");
		((TextView)findViewById(R.id.adresse)).setText("");
 
		findViewById(R.id.obtenir_position).setEnabled(false);
		findViewById(R.id.afficherAdresse).setEnabled(false);
	}
 
	private void choisirSource() {
		reinitialisationEcran();
 
		//On demande au service la liste des sources disponibles.
		List <String> providers = lManager.getProviders(true);
		final String[] sources = new String[providers.size()];
		int i =0;
		//on stock le nom de ces source dans un tableau de string
		for(String provider : providers)
			sources[i++] = provider;
 
		//On affiche la liste des sources dans une fenêtre de dialog
		//Pour plus d'infos sur AlertDialog, vous pouvez suivre le guide
		//http://developer.android.com/guide/topics/ui/dialogs.html
		new AlertDialog.Builder(Tutoriel12_Android.this)
		.setItems(sources, new DialogInterface.OnClickListener() {
			public void onClick(DialogInterface dialog, int which) {
				findViewById(R.id.obtenir_position).setEnabled(true);
				//on stock le choix de la source choisi
				choix_source = sources[which];
				//on ajoute dans la barre de titre de l'application le nom de la source utilisé
				setTitle(String.format("%s - %s", getString(R.string.app_name),
						choix_source));
			}
		})
		.create().show();
	}
 
	private void obtenirPosition() {
		//on démarre le cercle de chargement
		setProgressBarIndeterminateVisibility(true);
 
		//On demande au service de localisation de nous notifier tout changement de position
		//sur la source (le provider) choisie, toute les minutes (60000millisecondes).
		//Le paramètre this spécifie que notre classe implémente LocationListener et recevra
		//les notifications.
		lManager.requestLocationUpdates(choix_source, 60000, 0, this);
	}
 
	private void afficherLocation() {
		//On affiche les informations de la position a l'écran
		((TextView)findViewById(R.id.latitude)).setText(String.valueOf(location.getLatitude()));
		((TextView)findViewById(R.id.longitude)).setText(String.valueOf(location.getLongitude()));
		((TextView)findViewById(R.id.altitude)).setText(String.valueOf(location.getAltitude()));
	}
 
	private void afficherAdresse() {
		setProgressBarIndeterminateVisibility(true);
 
		//Le geocoder permet de récupérer ou chercher des adresses
		//gràce à un mot clé ou une position
		Geocoder geo = new Geocoder(Tutoriel12_Android.this);
		try {
			//Ici on récupère la premiere adresse trouvé gràce à la position que l'on a récupéré
			List
<Address> adresses = geo.getFromLocation(location.getLatitude(),
					location.getLongitude(),1);
 
			if(adresses != null && adresses.size() == 1){
				Address adresse = adresses.get(0);
				//Si le geocoder a trouver une adresse, alors on l'affiche
				((TextView)findViewById(R.id.adresse)).setText(String.format("%s, %s %s",
						adresse.getAddressLine(0),
						adresse.getPostalCode(),
						adresse.getLocality()));
			}
			else {
				//sinon on affiche un message d'erreur
				((TextView)findViewById(R.id.adresse)).setText("L'adresse n'a pu être déterminée");
			}
		} catch (IOException e) {
			e.printStackTrace();
			((TextView)findViewById(R.id.adresse)).setText("L'adresse n'a pu être déterminée");
		}
		//on stop le cercle de chargement
		setProgressBarIndeterminateVisibility(false);
	}
 
	public void onLocationChanged(Location location) {
		//Lorsque la position change...
		Log.i("Tuto géolocalisation", "La position a changé.");
		//... on stop le cercle de chargement
		setProgressBarIndeterminateVisibility(false);
		//... on active le bouton pour afficher l'adresse
		findViewById(R.id.afficherAdresse).setEnabled(true);
		//... on sauvegarde la position
		this.location = location;
		//... on l'affiche
		afficherLocation();
		//... et on spécifie au service que l'on ne souhaite plus avoir de mise à jour
		lManager.removeUpdates(this);
	}
 
	public void onProviderDisabled(String provider) {
		//Lorsque la source (GSP ou réseau GSM) est désactivé
		Log.i("Tuto géolocalisation", "La source a été désactivé");
		//...on affiche un Toast pour le signaler à l'utilisateur
		Toast.makeText(Tutoriel12_Android.this,
				String.format("La source \"%s\" a été désactivé", provider),
				Toast.LENGTH_SHORT).show();
		//... et on spécifie au service que l'on ne souhaite plus avoir de mise à jour
		lManager.removeUpdates(this);
		//... on stop le cercle de chargement
		setProgressBarIndeterminateVisibility(false);
	}
 
	public void onProviderEnabled(String provider) {
		Log.i("Tuto géolocalisation", "La source a été activé.");
	}
	public void onStatusChanged(String provider, int status, Bundle extras) {
		Log.i("Tuto géolocalisation", "Le statut de la source a changé.");
	}
 
}

Voila normalement après tant d’effort (félicitation d’être arrivé jusque là ;) ), si vous lancer votre application vous devriez tomber sur l’interface afficher en début de tuto et si vous vous amusez  avec, l’application devrait vous donnez l’adresse où vous êtes (bon à quelques mètres près surtout si vous êtes localisé avec le réseau GSM). J’espère que ce tuto vous a plu. Encore une fois si vous ne comprenez pas certaine partie du code, je vous conseille de vous amusez à supprimer ces parties ou ajouter des traces par ci par là et vous découvrirez par vous même à quoi ça sert. Bien entendu si jamais vous ne comprenez vraiment pas laissez-nous un commentaire et on vous répondra.

Continuez à nous soutenir via Twitter et FaceBook cela nous encourage à poursuivre nos effort et n’oublier de voter pour ce tuto (avec le petit « + » en haut à droite du tuto) s’il vous a plu ! A bientôt pour un prochain tuto et encore merci à Benjamin de nous avoir fourni ce code très propre ! ;)

Découvrez d'autre articles de la catégorie Tutoriels Android

Encore un peu de lecture :

104 Commentaires Poster un commentaire
  1. manasse
    16 mar 2013

    salut! je voudrais savoir d’abord par quel moyen un terminal GPS peut-il envoyer ses données de localisation à un PC distant par internet? comment il faut programmer ou configurer un tel terminal ou récepteur GPS pour qu’il envoie les informations de sa position à un PC distant via internet!.

Trackbacks & Pingbacks

  1. Les tweets qui mentionnent Tutoriel Android : Géolocalisation GPS ou réseau GSM | Tuto Mobile -- Topsy.com
  2. Benoot : les vacances sont finies? Partagez-les ! | Tuto Mobile
  3. Localisation Android – Android.x-tr4.com

Une question, une suggestion, une opinion? Partagez ce que vous pensez, laissez un commentaire.

(obligatoire)
(obligatoire)

Note: Votre adresse email ne sera jamais publiée.

Suivez les réponses aux commentaires