Я пытался получить количество шагов, сделанных за интервал в 30 секунд. Я использую датчик TYPE_STEP_COUNTER
и пользовательский класс, который реализует интерфейс SensorEventListener
. Моя текущая реализация выглядит следующим образом:
import android.app.job.JobParameters;
import android.app.job.JobService;
import android.hardware.Sensor;
import android.hardware.SensorEvent;
import android.hardware.SensorEventListener;
import android.hardware.SensorManager;
import java.util.Date;
import java.util.concurrent.TimeUnit;
public class StepSensor extends JobService implements SensorEventListener {
private static final String TAG = "StepSensor";
public static final Integer JOB_ID = TAG.hashCode();
private SensorManager sensorManager;
private Sensor stepSensor;
@Override
public boolean onStartJob(JobParameters params) {
logStepInformation();
return false;
}
private void logStepInformation() {
sensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
stepSensor = sensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
sensorManager.registerListener(this, stepSensor, SensorManager.SENSOR_DELAY_FASTEST);
}
@Override
public boolean onStopJob(JobParameters params) {
return false;
}
@Override
public void onSensorChanged(SensorEvent event) {
StringBuilder stringBuilder = new StringBuilder();
long milliseconds = TimeUnit.MILLISECONDS.convert(event.timestamp, TimeUnit.NANOSECONDS);
stringBuilder.append("Registered ");
stringBuilder.append(event.values[0]);
stringBuilder.append(" steps at ");
stringBuilder.append(new Date(milliseconds).toString());
System.out.println(stringBuilder.toString());
sensorManager.unregisterListener(this);
stopSelf();
}
@Override
public void onAccuracyChanged(Sensor sensor, int accuracy) {
// Nothing
}
}
Класс передается экземпляру JobScheduler
и выполняется в фоновом режиме:
JobScheduler jobSchedulerstepcounter =
(JobScheduler) getSystemService(Context.JOB_SCHEDULER_SERVICE);
jobSchedulerstepcounter.schedule(new JobInfo.Builder(StepSensor.JOB_ID,
new ComponentName(this, StepSensor.class))
.setPeriodic(ParamsLogging.STEPCOUNTER_CONTROL_INTERVAL_MILLIS)
.build());
где
public static final long STEPCOUNTER_CONTROL_INTERVAL_MILLIS = 30*1000L;
Однако, похоже, что значения, хранящиеся в SensorEvent
, устарели, и шаги, предпринятые в этом интервале, не меняются:
Registered 134.0 steps at Thu Jan 01 23:04:32 MEZ 1970
Registered 134.0 steps at Thu Jan 01 23:05:02 MEZ 1970
Registered 134.0 steps at Thu Jan 01 23:05:32 MEZ 1970
Registered 134.0 steps at Thu Jan 01 23:06:02 MEZ 1970
Из документации :
ПРИМЕЧАНИЕ : приложению не принадлежит объект события, переданный в качестве параметра, и, следовательно, он не может удерживать его. Объект может быть частью внутреннего пула и может быть повторно использован платформой.
Я предполагаю, что объект SensorEvent
, переданный в качестве параметра, всегда совпадает с обновленной отметкой времени. Можно ли получить фактическое количество шагов, предпринятых при регистрации события?
Я использую Android версии 5.0.2.