通过 Google Fit Api 检索到的步数与 Google Fit 官方应用程序中显示的步数不匹配
Step count retrieved through Google Fit Api does not match Step count displayed in Google Fit Official App
我开发了一个需要显示每日步数的应用程序。
为此,我使用了 Google Fit SDK 中可用的 API。
似乎一切正常,但我得到的步数与 Google Fit 官方应用程序中显示的步数不匹配。
例如,当 Google Fit App 显示 2367 步时,我得到 2308 步。
这有什么原因吗?有没有人有同样的问题?
有人知道吗?
Google Fit sdk 是 Google Play 服务的一部分。官方 Google Fit 应用程序也从 Google Play 服务 sdk 收集相同的数据,但是Google 可能在 Google Fit 应用程序中添加了更多代码以使数据更准确。它也可能是 Google Fit 应用程序中的错误。
我找到了解决方案。
健身应用会在这些步骤之上进行一些额外的处理。当记录 none 时,它根据 activity 估计步数。
如果它可以帮助某人:
您需要使用包 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 中可用的 API。
似乎一切正常,但我得到的步数与 Google Fit 官方应用程序中显示的步数不匹配。
例如,当 Google Fit App 显示 2367 步时,我得到 2308 步。
这有什么原因吗?有没有人有同样的问题? 有人知道吗?
Google Fit sdk 是 Google Play 服务的一部分。官方 Google Fit 应用程序也从 Google Play 服务 sdk 收集相同的数据,但是Google 可能在 Google Fit 应用程序中添加了更多代码以使数据更准确。它也可能是 Google Fit 应用程序中的错误。
我找到了解决方案。
健身应用会在这些步骤之上进行一些额外的处理。当记录 none 时,它根据 activity 估计步数。
如果它可以帮助某人: 您需要使用包 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));
}
}
});