通过Google Fit Api检索到的步数与Google Fit官方应用程序中显示的步数不匹配



我开发了一个需要显示每日步数的应用程序。为此,我使用了Google Fit SDK中提供的API。

所有这些似乎都正常工作,但我得到的步数与谷歌Fit官方应用程序中显示的步数不匹配。

例如,当谷歌健身应用程序显示2367步时,我得到了2308步。

这是有原因的吗?有人有同样的问题吗?有人知道线索吗?

我找到了解决方案。

Fit应用程序在这些步骤的基础上进行一些额外的处理。它根据没有记录的活动来估计步骤。

如果它能帮助某人:您需要使用包com.google.android.gms 的自定义DataSource

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 Fit应用程序中添加了更多代码,以使数据更加准确。这也可能是Google Fit应用程序中的一个错误。

创建一个Android应用程序,该应用程序使用Google Fit API访问步数数据,处理这些数据,并以用户友好的方式呈现。

最新更新