Les smartphones récents sont de magnifiques appareils, qui intègrent de plus en plus de capteurs.

Sur mon Samsung Galaxy S, si on omet les deux capteurs vidéo et le micro, on compte un capteur GPS-A, un accéléromètre, un capteur de lumière, un capteur de champ magnétique, un capteur d'orientation, un capteur de proximité, un capteur de température pour la batterie.

Malheureusement, dans la version actuelle du du SDK de Air for Android, la classe flash.sensors.* ne permet d’accéder qu'à deux capteurs, le GPS et l'accéléromètre.

Cependant, le SDK android permet d'utiliser tous ces capteurs. Alors nous allons utiliser le SDK Android pour récupérer les valeurs des capteurs qui nous intéressent, intégrer un SWF dans ce projet Android et les faire communiquer afin de réaliser une boussole sous AIR for Android.

Durant mes recherches, je suis tombé sur deux pistes : utiliser un portage de BlazeDS pour Air for Android, un projet de Farata Systems que vous retrouverez sur http://code.google.com/p/clear-android/ dans une version dev et un article de James Ward très utile que vous conseille de lire.

Pour la parti Android native, rien de bien compliqué :

import air.app.AppEntry;
import android.content.Intent;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
 
public class MainApp extends AppEntry implements SensorEventListener {
    private SensorManager sensorManager;
    public float myAzimuth = 0;
    private float myPitch = 0;
    private float myRoll = 0;
    
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);       
        sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
        sensorManager.registerListener(this, 
                sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION),
                SensorManager.SENSOR_DELAY_NORMAL);  
    }
 
    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }
 
    public void onSensorChanged(SensorEvent event) {
        myAzimuth = event.values[0];
        myPitch = event.values[1];
        myRoll = event.values[2];
    }
}

Et pour la communication, j'ai choisi la solution de James Ward, à savoir les sockets. Vous trouverez sur le net plein de tutoriaux sur la création d'un serveur de socket en Java, et comment "lire" sur la connection avec Flash (voir la classe socket).Ici je veux récupérer des infos depuis Java (Android) et les "lire" depuis flash, mais n'oubliez pas que depuis AIR 2.0, on peut créer un serveur de socket en AS3 et faire donc l'inverse...

Bon trêve de blabla, voici une vidéo pour montrer le résultat.

Texte de remplacement


Et voila...