24 04 2009

Android, le futur de l’humanité ?

Je ne vais pas vous parler ici des robots humanoïdes mais bien de l’OS de Google, Android ! J’ai découvert ce petit monde il y a quelques temps et je souhaitais partager avec vous cette mini-révolution.

Android

Android, kezako ?

Pour ceux d’entre vous qui ne lirait jamais les news (comment êtes vous tombé sur mon blog ?!), Android est le système d’exploitation pour plateformes mobiles développé par Google. Dans les faits, Google a racheté une société qui avait conçu la première version d’Andoid mais peu importe. Android est donc un OS pour appareils mobiles (téléphones, dont le HTC Dream chez Orange et le HTC Magic chez SFR; netbooks; archos…).

A l’OS, s’ajoute un SDK (actuellent en v1.1, bientôt 1.5) permettant à tout un chacun de développer ses applications pour l’OS… à ceci prêt qu’il faut connaître le langage Java mais si vous fréquentez mon blog, je suppose que c’est le cas.

Un environnement de développement aux petits oignons

  • Tout d’abord, gros avantage, c’est du Java ! Mine de rien, les développeurs Java, c’est pas ce qu’il manque aujourd’hui sur le marché et on peut donc espérer une grosse activité de développement. Est ce le bon choix d’avoir pris un langage qui n’est pas réputé pour sa rapidité d’exécution ? Peut-être pas… toujours est-il que si Google veut rattraper le nombre d’applications déjà développées sur l’Iphone, ça me semble être une bonne stratégie.
  • Ensuite, il existe un plugin Eclipse (ajoutez cette adresse à vos updates Eclipse : http://dl-ssl.google.com/android/eclipse/). Là encore, la communauté Eclipse est à ce jour la plus importante comparé à Netbeans et IntelliJ. Encore un bon point pour toucher le plus grand nombre de développeurs. Avec le SDK, est fourni un émulateur pour tester vos applications sans pour autant avoir à acheter un téléphone. Le lancement de l’émulateur est pris en charge dans Eclipse, c’est donc un réel plaisir que de développer pour la plateforme. Je regrette juste la lenteur de démarrage de l’émulateur…
  • Le SDK en lui-même est d’une simplicité assez déconcertante, tout du moins pour qui connaît déjà Java. La doc est relativement claire, le SDK est fourni avec quelques exemples mais surtout, on peut en quelque lignes manipuler google maps, récupérer les coordonnées GPS, utiliser la liste de ses contacts (cf partie suivante)… En tout cas, on trouve pas mal d’infos partout sur le web : forum anddev, google groups, …

Code snippets

Récupérer la position GPS actuelle

Dans le manifest, il faut ajouter les permissions suivantes :

	
	
	

Dans votre activité, vous aurez un code ressemblant à ça :

Criteria criteria = new Criteria();
criteria.setAccuracy(Criteria.ACCURACY_FINE);
criteria.setAltitudeRequired(false);
criteria.setBearingRequired(false);
criteria.setCostAllowed(true);
criteria.setPowerRequirement(Criteria.POWER_LOW);

LocationManager locationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
String provider = locationManager.getBestProvider(criteria, true);
Location currentLocation = locationManager.getLastKnownLocation(provider);
locationManager.requestLocationUpdates(provider, 100, 100, locationListener); // si on se déplace de 100 m (vérification toutes les 100 millisecondes)

// ...

private final LocationListener locationListener = new LocationListener() {
	public void onLocationChanged(final Location location) {
		currentLocation = location;
	}

	public void onProviderDisabled(final String provider) {
		currentLocation = null;
	}

	public void onProviderEnabled(final String provider) {
	}

	public void onStatusChanged(final String provider, final int status,
			final Bundle extras) {
	}
};

Attention, si le GPS n’est pas activé, vous aurez des erreurs, notamment le provider sera null et getLastKnownLocation plantera lamentablement.

Pour tester, vous pouvez émuler une position. On est censé pouvoir le faire depuis eclipse mais perso, ça n’a pas fonctionné. J’ai donc utilisé la méthode geek :

telnet localhost 5554
geo fix 2.305114 48.869321

Afficher une map et dessiner dessus

Pour afficher la map (Google maps), c’est relativement simple, il y a une Activity et une View toutes prêtes. Dans votre fichier myMap.xml, vous aurez :



	


Remplacez le KEY HERE par une clé fournie par google à partir du keystore de votre sdk (plus de détails ici).

Dans le manifest, sous la balise application, vous aurez :

  

Enfin dans le code java :

public class MapLines extends MapActivity {
   @Override
	public void onCreate(final Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.myMap);
		MapView mapView = (MapView) findViewById(R.id.map_view);
		Overlay overlay = new MyOverlay();
		mapView.getOverlays().add(overlay);
	}

	private class MyOverlay extends Overlay {
		@Override
		public void draw(final Canvas canvas, final MapView mapView) {
			GeoPoint myPoint = new GeoPoint((int) (48.858563 * 1E6),
					(int) (2.347204 * 1E6));
			Point point = new Point();
			mapView.getProjection().toPixels(myPoint, point); // transforme les coordonnées GPS en position x/y sur l'écran
			RectF oval = new RectF(point.x - 2, point.y - 2, point.x + 2, point.y + 2);
			canvas.drawOval(oval, paint); // dessine un rond à la position souhaitée
		}
	}
}

Bien entendu, vous pouvez dessiner autre chose que des ronds, des carrés… vous pouvez mettre des images par exemple.

Récupérer les contacts

Là encore, c’est très simple. Dans le fichier manifest, vous déclarez la permission :


Ensuite, dans votre code, pour récupérer par exemple les noms des contacts :

String[] columns = new String[] { People.NAME };
Cursor cursor = getContentResolver().query(People.CONTENT_URI, columns, null, null, People.NAME);

String[] contacts = new String[cursor.getCount()];
if (cursor.moveToFirst()) {
	int i = 0;
	do {
		contacts[i++] = cursor.getString(cursor.getColumnIndex(People.NAME));
	} while (cursor.moveToNext());
}

Vous pouvez ensuite les mettre dans un spiner ou une liste :

ArrayAdapter contactAdapter = new ArrayAdapter(MainSearch.this, android.R.layout.simple_dropdown_item_1line, contacts);
AutoCompleteTextView textView = (AutoCompleteTextView) findViewById(R.id.edit);
textView.setAdapter(contactAdapter);

Et voilà !!

Mon humble participation

Concours SFR Jeunes Talents

SFR a annoncé il y a un mois le lancement d’un concours de développement d’applications pour Android afin de faire connaître la plateforme et surtout pour annoncer l’arrivée de l’HTC G2 (qui se fait attendre…). C’est à cette occasion que je me suis lancé dans le développement d’une application qui à défaut d’être originale, sera d’une grande utilité pour tous ceux qui habitent Paris (dans un premier temps et n’importe quelle ville où il y a un métro à terme). Vous l’aurez compris, il s’agit d’une application gérant les itinéraires en métro !

Metroide

Metroide, c’est son nom, permet simplement de calculer votre itinéraire en métro depuis n’importe où (station, contact, adresse, favori et position gps courante). L’avantage est qu’il n’a pas besoin de connexion internet pour calculer un itinéraire de station à station (aucune connexion au site de la ratp).

En effet, toutes les stations et tous les liens sont dans l’application (au format XML pour l’instant), et j’ai implémenté l’algorithme Dijkstra pour calculer le plus court chemin, donc le meilleur itinéraire entre deux points.

Par contre, si vous utilisez les autres options, elles font toutes appel au GeoCoder pour transformer l’adresse en coordonnées GPS et donc là, une connexion internet est requise.

Trève de blabla, voici la présentation que j’ai soumise au concours SFR :

Ainsi que la vidéo de l’appli :

J’ai encore un peu de boulot pour rendre le tout plus joli (notamment les favoris), et beaucoup de boulot pour saisir les stations de RER / tramway et trains de banlieue. La version actuelle sera mise à disposition gratuitement sur l’android market et je verrai pour passer à une version payante (1 ou 2 €) quand elle sera plus aboutie.

4 Comments

farhdineavril 25th, 2009 at 16:31

Bravo JVA, je suis fière de toi :)

Jérômemai 2nd, 2009 at 23:43

Malheureusement, je crains de n’avoir rien gagné… d’après ce post : http://www.frandroid.com/2495/jury-sfr-jeunes-talents-developpeurs-ce-nest-pas-simple/, les gagnants ont été contacté et je ne l’ai pas été… J’attends de voir les résultats pour me décider à finir l’appli ou pas.

Charlesmai 3rd, 2009 at 8:42

Chapeau pour la presentation de l’appli…

Jérômemai 7th, 2009 at 23:45

Merci !

J’ai ouvert un nouveau blog dédié à Metroide : http://www.javasioux.fr/metroide/
Ca me servira à communiquer sur les évolutions, de relever les bugs… Je verrai pour ouvrir un nom de domaine dédié lorsque ça vaudra le coût.

Leave a comment

Your comment

CAPTCHA image