So protokollieren Sie Daten von Android-Bewegungssensoren mit einer festen Rate
Ich lerne die Grundlagen der Android-Programmierung.
Ich habe eine einfache Android-Testanwendung, in der ich den Beschleunigungsmesser, den Magnetometer und die Ausrichtungsdaten in einer externen Datei protokolliere und sie gleichzeitig anzeige. Ich starte den Protokollierungsprozess mit einem Klick auf aStart Schaltfläche (registerListener für relevante Sensoren) durch Aufruf einer MethodeinitLogger.
Welches sieht so ähnlich aus ...
public void initLogger(View view)
{
boolean bFlag = false;
Button btnStart = (Button)findViewById(R.id.btnStartLog);
Button btnStop = (Button)findViewById(R.id.btnStopLog);
btnStart.setEnabled(bFlag);
btnStop.setEnabled(!bFlag);
bEnableLogging = true;
//Start reading the sensor values
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_MAGNETIC_FIELD), SensorManager.SENSOR_DELAY_UI);
sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), SensorManager.SENSOR_DELAY_UI);
//so on....
Es gibt auch eine Stopp-Schaltfläche, die den Protokollierungsprozess anhält (und schließlich die Registrierung durch Aufrufen von unregisterListener für jeden Sensor aufhebt).
Der Datenabruf erfolgt innerhalb deronSensorChanged Der Handler, der die Daten von den relevanten Sensoren abrufen soll, setzt den Wert auf die jeweiligen UI-Elemente und protokolliert die Daten schließlich in einer externen CSV-Datei.
onSensorChanged Eventhandler sieht ungefähr so aus ...
public void onSensorChanged(SensorEvent event) {
// TODO Auto-generated method stub
// accelerometer
TextView tAX = (TextView) findViewById(R.id.txtViewAxValue);
TextView tAY = (TextView) findViewById(R.id.txtViewAyValue);
TextView tAZ = (TextView) findViewById(R.id.txtViewAzValue);
// magnetic field
TextView tMX = (TextView) findViewById(R.id.txtViewMx);
TextView tMY = (TextView) findViewById(R.id.txtViewMy);
TextView tMZ = (TextView) findViewById(R.id.txtViewMz);
if (bEnableLogging) {
if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
accelerometerdata = event.values.clone();
tAX.setText(Double.toString(accelerometerdata[0]));
tAY.setText(Double.toString(accelerometerdata[1]));
tAZ.setText(Double.toString(accelerometerdata[2]));
}
if (event.sensor.getType() == Sensor.TYPE_MAGNETIC_FIELD) {
magneticmatrixdata = event.values.clone();
tMX.setText(Double.toString(magneticmatrixdata[0]));
tMY.setText(Double.toString(magneticmatrixdata[1]));
tMZ.setText(Double.toString(magneticmatrixdata[2]));
}
// so on ....
Obwohl ich die Daten von allen konfigurierten Sensoren erhalte, habe ich keine Kontrolle über die Rate, mit der die Daten empfangen werden. d.h.
Ich weiß, dass das SensorChanged-Ereignis ausgelöst wird, wenn die Sensordaten geändert werden. Ich möchte jedoch, dass diese Veranstaltung zu einem festen Preis abgefeuert wird.Zum Beispiel alle 40ms
Frage:
Wie kann sichergestellt werden, dass das SensorChanged-Ereignis mit konstanter Rate ausgelöst wird?Hilft in diesem Fall die Klasse TimerTask in Java?Experten hier in SO.Bitte hilf mir :)