Android bringt von Haus aus Unterstützung einer ganzen Reihe von Sensoren mit, die Werte wie Temperatur, Helligkeit oder Orientierung auslesen können. Ob der jeweilige Sensor vom Gerät unterstützt wird verrät einem die Funktion getSensorList(). Der Zugriff auf die Hardware erfolgt über das Android SDK.
Zum Auslesen eines Sensors unter Android benötigt man zuerst einmal einen SensorManager, an den man einen SensorEventListener "hängt". Letzteren muss man sich selber schreiben, da die Klasse SensorEventListener abstrakt implementiert ist. Hierfür müssen aber prinzipiell nur zwei Funktionen implementiert werden, in denen die Daten des jeweiligen Sensors dann verarbeitet (ausgegeben) werden. Registriert wird der eigene Listener dann letztendlich beim SensorManager via registerListener(), wobei man gleich noch die Updaterate übergibt.
In einem Minimalbeispiel könnte das Auslesen des OrientationSensors wie folgt aussehen:
public class OrientationSensorTest extends Activity { protected SensorManager sManager; protected TextView mainText; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); mainText = (TextView) findViewById(R.id.mainText); sManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); OrientationListener sListener = new OrientationListener(); sManager.registerListener(sListener, sManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_NORMAL); } class OrientationListener implements SensorEventListener { @Override public void onSensorChanged(SensorEvent event) { mainText.setText("Orientation: " + event.values[0]); } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { // unused } } }
event.values ist hierbei ein Array vom Typ float, das die Orientierung des Geräts an den drei Achsen beschreibt. Was ihr mit diesen Rohwerten anfangt, bleibt euch überlassen... Und bevor ich gefragt werde, ob ich die XML-Datei fürs Layout mitliefern kann:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:id="@+id/mainText" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/mainText" /> </LinearLayout>
Für Easteregg-Liebhaber ist auch etwas dabei. Ob man die Konstante GRAVITY_MARS neben GRAVITY_EARTH jetzt implementiert hat, um Android für die Zukunft zu rüsten sei mal dahingestellt - GRAVITY_JUPITER wird aber kaum jemals (sinnvollen) praktischen Einsatz erfahren. Was GRAVITY_THE_ISLAND und GRAVITY_DEATH_STAR_I aber im SDK zu suchen haben könnt ihr euch selbst zusammenreimen... ;)