我正在制作一个使用步数来测量距离的健身应用程序。 我正在尝试使用 sensorManager.requestTriggerSensor()
方法在应用程序启动时获取初始步骤计数。 但是,我的代码返回 false,这意味着传感器未被触发。我已经成功地实现了SensorEventListener
,我用它来继续计步。 我的代码片段如下,类似于文档
private SensorManager mSensorManager;
private Sensor sensorStepCounter;
private TriggerEventListener triggerEventListener;
@Override
protected void onCreate(Bundle savedInstanceState) {
...
mSensorManager = (SensorManager) getSystemService(SENSOR_SERVICE);
triggerEventListener = new TriggerEventListener() {
@Override
public void onTrigger(TriggerEvent event) {
float initialSteps = event.values[0];
Log.d(TAG, "initial Steps: " + Arrays.toString(event.values));
}
};
sensorStepCounter = mSensorManager.getDefaultSensor(Sensor.TYPE_STEP_COUNTER);
....
}
@Override
protected void onResume() {
...
boolean triggered = mSensorManager.requestTriggerSensor(triggerEventListener, sensorStepCounter);
}
或者是否有其他方法可以在启动应用时获取当前传感器数据,例如步数?
你想使用Google Fit API,而不是访问原始传感器数据。从文档中:
long total = 0;
PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(mClient, DataType.TYPE_STEP_COUNT_DELTA);
DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS);
if (totalResult.getStatus().isSuccess()) {
DataSet totalSet = totalResult.getTotal();
total = totalSet.isEmpty()
? 0
: totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
} else {
Log.w(TAG, "There was a problem getting the step count.");
}
请注意,此代码不希望在 UI 线程上运行。您可以将其移动到另一个线程中(如我链接的页面上所示(或使用 PendingResult.setResultCallback
方法。
我只假设触发步进传感器是错误的,因为传感器已被触发。然而,我提出了一个不同的解决方案。
- 你可以听Sensor.TYPE_STEP_COUNTER。然后,您在第一个传感器事件中收到的步数值是您的"偏差",因此要检测用户自应用程序启动以来走了多少步,您需要从最新的传感器值中减去"偏差"。
- 另一方面,还有另一个传感器:每一步都会触发Sensor.TYPE_STEP_COUNTER传感器。您可能还想使用这个。