我认为您看到的区别在于 Google 使用 History API 和 Sensors API 的方式之间的区别。如果您使用的是 PHP,您将通过可用的健身 API 查询 Google Fit Store,这取决于应用程序能够通过记录 API 保存的内容。因此,您可能看不到设备可用的所有数据。

我认为,但不确定,Fit App 使用传感器 API。在应用程序中,您可以使用 Google Docs Sensors API中描述的传感器 API ,并根据需要操作返回的数据。
下面显示了使用 TYPE_STEP_COUNT_CUMULATIVE 和 TYPE_RAW 获取步骤的简单方法
Fitness.SensorsApi.findDataSources(mClient, new DataSourcesRequest.Builder()
// At least one datatype must be specified.
.setDataTypes(DataType.TYPE_STEP_COUNT_CUMULATIVE)
// Can specify whether data type is raw or derived.
.setDataSourceTypes(DataSource.TYPE_RAW)
.build())
.setResultCallback(new ResultCallback<DataSourcesResult>() {
@Override
public void onResult(DataSourcesResult dataSourcesResult) {
Log.i(TAG, "Result: " + dataSourcesResult.getStatus().toString());
for (DataSource dataSource : dataSourcesResult.getDataSources()) {
Log.i(TAG, "Data source found: " + dataSource.toString());
Log.i(TAG, "Data Source type: " + dataSource.getDataType().getName());
//Let's register a listener to receive Activity data!
if (dataSource.getDataType().equals(DataType.TYPE_STEP_COUNT_CUMULATIVE) && mListener == null) {
Log.i(TAG, "Data source for TYPE_STEP_COUNT_CUMULATIVE found! Registering.");
registerFitnessDataListener(dataSource, DataType.TYPE_STEP_COUNT_CUMULATIVE);
}
}
}
});
private void registerFitnessDataListener(DataSource dataSource, DataType dataType) {
mListener = new OnDataPointListener() {
@Override
public void onDataPoint(DataPoint dataPoint) {
for (Field field : dataPoint.getDataType().getFields()) {
Value val = dataPoint.getValue(field);
Log.i(TAG, "Detected DataPoint field: " + field.getName());
Log.i(TAG, "Detected DataPoint value: " + val);
Log.i(TAG, "Difference in steps: " + (val.asInt()-previousValue));
previousValue = val.asInt();
}
}
};
Fitness.SensorsApi.add(
mClient,
new SensorRequest.Builder()
.setDataSource(dataSource) // Optional but recommended for custom data sets.
.setDataType(dataType) // Can't be omitted.
.setSamplingRate(10, TimeUnit.SECONDS)
.build(),
mListener)
.setResultCallback(new ResultCallback<Status>() {
@Override
public void onResult(Status status) {
if (status.isSuccess()) {
Log.i(TAG, "Listener registered!");
} else {
Log.i(TAG, "Listener not registered.");
}
}
});
}
您可能会发现这为您提供了与 Fit 应用程序给出的值更接近的值。然而,这显然只在设备上可用,因此您需要运行更新外部数据库的后台服务,这就是 Recording 和 History API 为您提供的。
需要注意的是,当您的应用程序处于后台时,您需要使用 Recording API 来确保数据继续发送到 Fitness Store,这也可能会更改您看到的值。
更新:
写完上面我想我应该测试一下。这是从早上散步开始的。
- 苹果 iPhone 6 HealthKit:6,762
- 苹果 iPhone 6 我的应用程序:6,762
- Android Nexus 6 适合:6,920
- Android Nexus 6 我的应用:6,920(使用 HistoryAPI)
- Android Rest API 估计步数:6,928
- Android Rest API merge_step_deltas:6,911
这是来自您可以在此处找到的 Google+ 帖子
“merge_step_deltas 为您提供所有计步器的合并流。estimated_steps 还考虑了活动,并在没有计步器时估计步数”
我还没有深入了解的是使用上面显示的传感器,它只给了我 2,548 步。
另一件有点奇怪的事情是,一天后,Fit 向我显示我做了 6,668 步,因此更接近 Apple 的结果,但在数据同步后它最初显示给我的结果是重新计算的。我的应用程序仍然显示 6,920!
我没有测量所有同步的时间。