Android bietet Unterstützung für eine große Menge an Sensoren, die allerdings nicht immer alle in einem Gerät verbaut sein müssen. Um die Beschleunigungssensoren zu testen haben ich ein kleines Programm geschrieben, dass einen Listener an den Sensor hängt und bei Änderungen ausliest und vierTextViews aktualisiert. Nach diesem Prinzip funktionieren auch die anderen Sensortypen in Android.
Um Zugriff auf den Sensor zu bekommen, muss man sich zunächst mit dem SensorManager Zugriff darauf verschaffen. Da es sich um Hardware handelt, geht man hier über die System Services und erhält den Manager mit dem Aufruf getSystemService(Context.SENSOR_SERVICE). Um Daten vom Sensor zu erhalten, machte man einen SensorListener beim Manager bekannt. Hierbei legt man den Sensortyp, der abgefragt werden soll, sowie die Aktualisierungsgeschwindigtkeit (Hier im Beispiel mit SensorManager.SENSOR_DELAY_NORMAL).
// mit dem SensorManager auf die Sensoren zugreifen
mgr = (SensorManager) getSystemService(Context.SENSOR_SERVICE);
// Den SensorListener bekannt machen.
mgr.registerListener(listener, mgr
.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
Im Listener überschreibt man die beiden Methoden onSensorChanged und onAccuracyChanged. Die Daten des Sensors erhält man dann aus dem float Array event.values, in dem je nach Sensortyp die Werte enhalten sind. Welche Werte man erhalten kann zeigt die Android API hier.
public void onSensorChanged(SensorEvent event) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
float x, y, z;
x = event.values[0];
y = event.values[1];
z = event.values[2];
Anzumerken bleibt noch, dass es unbedingt notwendig ist, den Listener wieder beim Manager abzumelden, da die Anwendung sonst nie komplett beendet wird, sondern weiterhin Daten vom Sensor empfängt.
@Override
public void onDestroy() {
super.onDestroy();
mgr.unregisterListener(listener);
}
Hier der gesamte Code des Beispiels.
package de.beanova.tripmeter;
import android.app.Activity;
import android.content.Context;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import android.os.Bundle;
import android.widget.TextView;
public class StartScreen extends Activity {
/** Called when the activity is first created. */
SensorManager mgr;
TextView tx, ty, tz, maxx;
float max;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
tx = (TextView)findViewById(R.id.tvx);
ty = (TextView)findViewById(R.id.tvy);
tz = (TextView)findViewById(R.id.tvz);
maxx = (TextView)findViewById(R.id.tvmaxx);
max = 0;
mgr = (SensorManager)getSystemService(Context.SENSOR_SERVICE);
mgr.registerListener(listener,
mgr.getDefaultSensor(Sensor.TYPE_ACCELEROMETER),
SensorManager.SENSOR_DELAY_NORMAL);
}
@Override
public void onDestroy(){
super.onDestroy();
mgr.unregisterListener(listener);
}
private SensorEventListener listener = new SensorEventListener() {
@Override
public void onSensorChanged(SensorEvent event) {
if(event.sensor.getType() == Sensor.TYPE_ACCELEROMETER){
float x, y, z;
x = event.values[0];
y = event.values[1];
z = event.values[2];
if(x > max){
max = x;
}
// update textviews
tx.setText(""+x);
ty.setText(""+y);
tz.setText(""+z);
maxx.setText(""+max);
}
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// unused
}
};
}