Como registrar dados do Android Motion Sensors a uma taxa fixa
Estou aprendendo o básico da programação do Android.
Eu tenho um aplicativo de teste android simples em que eu registro o acelerômetro, magnetômetro e os dados de orientação para um arquivo externo enquanto também exibi-lo. Eu inicio o processo de registro ao clicar de umComeçar botão (registerListener para sensores relevantes) chamando um métodoinitLogger.
Que parece algo parecido com isso ...
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....
Há também um botão Stop, que deve parar o processo de registro (e, finalmente, cancelar o registro chamando unregisterListener para cada sensor)
O processo de recuperação de dados acontece dentro doonSensorChanged Um manipulador que recuperará os dados dos sensores relevantes, definirá o valor para os respectivos elementos da interface do usuário e, finalmente, registrará os dados em um arquivo .csv externo.
onSensorChanged eventhandler parece algo assim ...
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 ....
Embora eu receba os dados de todos os sensores configurados, não tenho o controle sobre a taxa na qual os dados são recebidos. ou seja,
Eu sei que o evento SensorChanged é acionado como e quando os dados do Sensor são alterados. No entanto, quero que este evento seja disparado a uma taxa fixa.Por ex: a cada 40ms
Questão:
Como garantir que o evento SensorChanged seja disparado a uma taxa constante?A classe TimerTask em Java tem alguma ajuda neste caso?Especialistas aqui em SO.Por favor me ajude :)