Android-Geräte haben mehrere Sensoren eingebaut.
- ACCELEROMETER: Beschleunigungsmesser in drei Richtungen.
- GYROSCOPE: Drehungen
- LIGHT: Umgebungslicht
- MAGNETIC_FIELD: Magnetfeld
- ORIENTATION: Richtung
- TEMPERATURE: Temperatur
SensorEventListener
Um an die Werte der Sensoren zu gelangen, implementiert die Activity den SensorEventListener. Das erzwingt eine Implementierung der Methoden onSensorChanged und onAccuracyChanged. In der Regel ist nur die erste Methode interessant.
@Override public void onSensorChanged(SensorEvent event) { super.onSensorChanged(event); // Sensorwerte in event.values[0] bis event.values[2] } @Override public void onAccuracyChanged(Sensor sensor, int accuracy) { super.onAccuracyChanged(sensor, accuracy); // ... }Man legt lokal einen SensorManager und einen Sensor als lokale Referenzen an und ermittelt diese beispielsweise in onCreate.
sensorManager = (SensorManager) getSystemService(Context.SENSOR_SERVICE); sensor = sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER);Die Sensoren werden dann bei onResume registriert.
sensorManager.registerListener(this, sensor, SensorManager.SENSOR_DELAY_GAME);Die Sensorereignisse werden auch empfangen, wenn die App im Hintergrund läuft. Ist das nicht erforderlich, sollte der Sensor in onPause deaktiviert werden. Ansonsten wird unnötig Energie verbraucht.
@Override protected void onPause() { sensorManager.unregisterListener(this); super.onPause(); }
Beschleunigungen
Zu den Beschleunigungen, die immer da ist, gehört die Erdanziehungskraft (GRAVITY). Mit ACCELEROMETER werden auch andere Beschleunigungen berechnet. Dort ist die Erdanziehung eingerechnet. Bei der LINEAR_ACCELERATION wird die Erdanziehung nicht berücksichtigt.
Achsen
Die Beschleunigungskräfte, die Magnetfelder und die Drehungen werden in einem Koordinatensystem aus drei Achsen im Raum betrachtet.
- x geht von links nach rechts
- y von vorn nach hinten
- z von oben nach unten