为什么Google Fit步骤计数有所不同

时间:2016-01-14 12:27:06

标签: android google-fit

我使用Sensor API计算步数。我看到它与Google Fit App不同。 Google Fit应用会使用传感器API吗?

代码段:

Fitness.SensorsApi.add(
            mGoogleApiFitnessClient,
            new SensorRequest.Builder()
                    .setDataType(DataType.TYPE_STEP_COUNT_DELTA) 
                    .setSamplingRate(5, 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.");
                    }
                }
            });

步数结果

我的应用: 2484

Google Fit: 4636

我错过了什么吗?

2 个答案:

答案 0 :(得分:1)

如果您使用Fitness.HistoryApi.readData()方法,您的值将匹配或至少非常接近Google Fit中显示的值。您在Google健身应用中看到的是历史数据。历史记录我的意思是历史,直到谷歌云存储的最后更新为健身数据。可能只是一分钟前。显然,google fit会批量上传健康数据。这就是您在Google Fit应用中看不到实时更新的原因。例如当你走路时,这些步骤不会随时更改,而是会定期更新。

阅读documentation for Google Fit,详细了解如何拨打HistoryApi电话。此页面有一个检索步骤计数的详细示例。

因此,如果您上传数据然后阅读历史记录,数据将与Google健身应用中显示的内容相匹配。在此过程中,它还可以组合来自其他来源的数据(如果有),并提供标准化值。

答案 1 :(得分:1)

首先,您正在接收传感器值,用于实时更新,而不是用于统计评估。

除此之外,你正在阅读&#34; delta&#34;的步骤。 &#34;德尔塔&#34;表示自上次更新以来用户获得了多少步骤。它用于构建统计数据,例如每天,每小时,每月等行走统计数据

实际想要阅读的内容是&#34;汇总步骤&#34; - 在您的情况下是&#34;每天的总步数&#34;。为此,请使用HistoryApi

您有两种选择:

<强> 1。阅读汇总数据

DataReadRequest readRequest = new DataReadRequest.Builder()
        // The data request can specify multiple data types to return, effectively
        // combining multiple data queries into one call.
        // In this example, it's very unlikely that the request is for several hundred
        // datapoints each consisting of a few steps and a timestamp.  The more likely
        // scenario is wanting to see how many steps were walked per day, for 7 days.
        .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
                // Analogous to a "Group By" in SQL, defines how data should be aggregated.
                // bucketByTime allows for a time span, whereas bucketBySession would allow
                // bucketing by "sessions", which would need to be defined in code.
        .bucketByTime(1, TimeUnit.DAYS)
        .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
        .build();

PendingResult<DataReadResult> pendingResult =
                        Fitness.HistoryApi.readData(client, readRequest);

//synchronous execution, should happen on background thread
                DataReadResult result = pendingResult.await(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
  1. 阅读每日总数 - Google健身网提供便利功能,可以阅读当天的总数

    PendingResult<DailyTotalResult> stepsTotalPending = Fitness.HistoryApi
        .readDailyTotal(client, DataType.TYPE_STEP_COUNT_DELTA);    
        //synchronous execution
    DailyTotalResult stepsTotalResult = stepsTotalPending
        .await(CONNECTION_TIMEOUT_SECONDS, TimeUnit.SECONDS);
    
  2. 与案例1相同,startTime = current day's midnightendTime=now

    您可以在此处使用支持聚合的任何数据类型,例如卡路里和距离。有关详细信息,请参阅this link

    如果您使用解决方案1或2并且仍然具有不同的值,请参阅此FAQ, - 已知情况和Google健身应用可以使用更复杂的方法计算步数/卡路里/距离