Wie log-Daten von Android-Bewegungs-Sensoren mit einer festen rate

Lerne ich die Grundlagen der Android-Programmierung.

Habe ich eine einfache android-test-Anwendung, in der ich log den Beschleunigungsmesser,das magnetometer und die Ausrichtung der Daten in eine externe Datei, während auch die Anzeige. Ich initiieren die Protokollierung auf dem klicken einer Start - Taste (registerListener für die relevanten sensoren) durch den Aufruf der Methode initLogger.

Die sieht ungefähr so 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.... 

Gibt es auch eine Stop-Taste, die stop der Protokollierung (und schließlich aufheben der Registrierung durch aufrufen unregisterListener für jeden sensor)

Den Daten-retrieval-Prozess geschieht innerhalb der onSensorChanged handler, die Holen die Daten aus den entsprechenden sensoren, legt den Wert auf die jeweiligen UI-Elemente und schließlich melden die Daten an einen externen .csv-Datei.

onSensorChanged eventhandler sieht wie folgt 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 Daten empfangen, die von allen konfigurierten sensoren, ich habe nicht die Kontrolle über die rate, mit der die Daten empfangen werden. ich.e

Ich weiß SensorChanged-Ereignis wird ausgelöst, wenn der Sensor-Daten geändert. Jedoch möchte ich dieses Ereignis ausgelöst werden, zu einem festen Zinssatz. Für ex: alle 40ms

Frage:

  1. Wie zur Gewährleistung der SensorChanged-Ereignis ausgelöst wird, bei konstanter Geschwindigkeit ?
  2. Ist die Klasse TimerTask, der in Java für jede Hilfe in diesem Fall ?

Experten hier draußen ALSO aus.Bitte helft mir 🙂

da Sie protokollieren möchten die Daten in Ihrer gegebenen Abständen, warum fireing die SensorChanged Veranstaltung? warum nicht mit irgendeiner Art von timer und anfordern der tatsächlichen Werte nach der angegebenen Zeit? oder bin ich immer etwas falsch hier?
Die SensorChanged-Ereignis ausgelöst wird, wie und Wann es zu einer änderung in der sensor-Daten. Ich habe keine Kontrolle über das Ereignis. Über Ihren Vorschlag zu Lesen/Anfragen der tatsächlichen Werte zu einem bestimmten Zeitpunkt....ist genau das, was ich verlange. Wie explizit Anforderung für die Daten des Sensors ??
gut, nach nininho schrieb dies scheint nicht möglich zu sein, in android. Aber da Sie wissen, dass wenn es keine SensorChanged Ereignisses, das ausgelöst wird, gab es keine Veränderung, können Sie einfach Ihre alten Werte. Da fragte man für LOG-Daten in bestimmten Abständen, das würde ich nicht tun, keine Ausgabe in der onSensorChanged-Methode nur clone die neuen Daten an Ihre accelerometerdata variable. Und als log-Wert von accelerometerdata alle 40ms. Auf diese Weise sind Sie die Protokollierung der tatsächliche Wert jedes 40ms, auch wenn die Daten nicht ändern....
Infact dies ist, was ich gestern Tat. Sieht aus wie wir beide sind in gleichen Zeilen 🙂 Kannst du das als Antwort, so dass ich Sie akzeptieren kann.
und da ist es...

InformationsquelleAutor this-Me | 2012-09-03

Schreibe einen Kommentar