Сохранить данные акселерометра в Android через фиксированный интервал времени? - PullRequest
0 голосов
/ 03 марта 2020

Я пишу Android Приложение, которое автоматически записывает акселерометр за короткий промежуток времени (10 - 20 секунд), а затем обрабатывает и анализирует записанные данные. Я знаю, как использовать SensorEventListener для извлечения данных из акселерометра, но я не знаю, как автоматически отменить регистрацию прослушивателя после временного интервала, так как onSensorChanged может работать в другом потоке, и я, по-видимому, не могу их создать (я не очень знаком с многопоточное программирование), так как мне нужно только записать только для такого количества из них, а затем передать их напрямую в функцию анализа.

Любой может помочь мне в этом. Вот простой код, который я написал до сих пор (извините, так как я не могу показать полный код, так как некоторые части не мои):

import android.hardware.SensorManager;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.Sensor;
/*... Other Imports ...*/

public class AccelerometerTask implements SensorEventListener {
    private ArrayList<float[]> accList;  //Store accelerometers data
    private ArrayList<Long> timestamps;  //Store timestamps
    /*... Other Attributes ...*/

    public void onSensorChanged(SensorEvent event) {
        if (event.sensor.getType() == Sensor.TYPE_ACCELEROMETER) {
            accList.add(event.values);
            timestamps.add(event.timestamp);
        }
    }

    public void onAccuracyChanged(Sensor sensor, int accuracy) {
    }

    /*... unrelated code ...*/

    public void collectAndAnalyzeInputs() {
        accList = new ArrayList<float[]>();
        timestamps = new ArrayList<Long>();
        SensorManager sensorManager = service.getSystemService(Context.SENSOR_SERVICE);
        sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ACCELEROMETER), sensorManager.SENSOR_DELAY_NORMAL);
        Thread.sleep(10000);
        sensorManager.unregisterListener(this);
        analyze(accList, timestamps);
    }
}

Итак, я попытался запустить приведенный выше код, но программа не получила никаких данных от датчиков (при разборе функции анализа список пуст)). Я просто один, чтобы приостановить программу на несколько секунд, чтобы функция onSensorChanged могла записать некоторые данные и затем перейти к анализу. Может ли кто-нибудь помочь мне с этим?

Кроме того, я знаю, что обычно люди регистрируют слушателя, когда программа запускается, и отменяют регистрацию, когда она выключена, но это будет конфликтовать с другими частями приложения (этот класс может использоваться в качестве фонового потока).

...