我开发了一个需要显示每日步数的应用程序。为此,我使用了 Google Fit SDK 中提供的 API。
一切似乎都正常工作,但我得到的步数与 Google Fit 官方应用程序中显示的步数不匹配。
例如,当 Google Fit App 显示 2367 步时,我得到 2308 步。
是否有一个原因?有没有人有同样的问题?有人有线索吗?
我开发了一个需要显示每日步数的应用程序。为此,我使用了 Google Fit SDK 中提供的 API。
一切似乎都正常工作,但我得到的步数与 Google Fit 官方应用程序中显示的步数不匹配。
例如,当 Google Fit App 显示 2367 步时,我得到 2308 步。
是否有一个原因?有没有人有同样的问题?有人有线索吗?
我找到了解决方案。
Fit 应用程序在这些步骤之上进行了一些额外的处理。当没有记录时,它会根据活动估计步骤。
如果它可以帮助某人:您需要使用包 com.google.android.gms 的自定义数据源
DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder()
.setDataType(DataType.TYPE_STEP_COUNT_DELTA)
.setType(DataSource.TYPE_DERIVED)
.setStreamName("estimated_steps")
.setAppPackageName("com.google.android.gms")
.build();
并在您的聚合方法中使用它,如下所示:
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA)
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.build();
Google Play Services 7.3(2015 年 4 月 28 日发布)在HistoryApi.readDailyTotal中添加了一个新方法,该方法与 Google Fit 官方应用上的步数相匹配,并且更易于使用。
PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(fitnessApiClient, DataType.AGGREGATE_STEP_COUNT_DELTA);
DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS);
if (totalResult.getStatus().isSuccess()) {
DataSet totalSet = totalResult.getTotal();
steps = totalSet.isEmpty() ? -1 : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
}
正如Sameer Z.要求的那样,我正在发布完整的代码以获取值。
DataSource estimatedSteps = new DataSource.Builder()
.setDataType(DataType.TYPE_STEP_COUNT_DELTA)
.setType(DataSource.TYPE_DERIVED)
.setStreamName("estimated_steps")
.setAppPackageName("com.google.android.gms")
.build();
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(estimatedSteps, DataType.AGGREGATE_STEP_COUNT_DELTA)
.setTimeRange(startTimeSeconds, endTimeSeconds, TimeUnit.SECONDS)
.bucketByTime(1, TimeUnit.DAYS)
.enableServerQueries()
.build();
PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi.readData(client, readRequest);
pendingResult.setResultCallback(new ResultCallback<DataReadResult>() {
@Override
public void onResult(@NonNull DataReadResult dataReadResult) {
List<Bucket> allBuckets = dataReadResult.getBuckets();
for (Bucket bucket : allBuckets) {
long startAtSeconds = bucket.getStartTime(TimeUnit.SECONDS);
Value stepsValue = getValue(bucket, DataType.TYPE_STEP_COUNT_DELTA, Field.FIELD_STEPS);
int steps = stepsValue != null ? stepsValue.asInt() : 0;
Log.d(TAG, String.format("startAtSeconds %s, steps %s", startAtSeconds, steps));
}
}
});
Google Fit sdk 是 Google Play 服务的一部分。官方的 Google Fit 应用程序也从 Google Play 服务 sdk 收集相同的数据,但 Google 可能在 Google Fit 应用程序中添加了更多代码以使数据更准确。这也可能是 Google Fit 应用程序中的错误。