如何从Google Fit REST应用程序获取Google Fit REST API的步数?

Kah*_*ahn 4 google-api-php-client google-fit

我正在开发一个与Google Fit API配合使用的PHP应用程序,以收集每日用户的步数.

我希望从"2015年1月15日00:00:00 GMT + 0700"到"2015年1月16日00:00:00 GMT + 0700"获得我的步数. - 首先,我得到了所有的数据源. - 然后,对于数据类型等于"com.google.step_count.delta"的每个数据源,我获取上述时间戳之间的数据集并将返回值一起添加.

我的代码:https://gist.github.com/daitr-gu/472c4f18522172542cca
我的结果:https://gist.github.com/daitr-gu/1a7e11eb483a657bdc8b

我发现,有很多数据源,它们返回不同的值.这些价值观与我在手机上的Google健身应用中看到的价值太大了.

问题:
1.Google健身应用使用哪种数据源来计算步数?
2.为什么数据源的值与Google Fit值有所不同?
3.我如何获得Google Fit值?

Gou*_*shi 8

  1. Google Fit应用使用哪种数据源来计算步数?

Google Fit App使用estimated_steps数据源来计算步数.DataSourceId:derived:com.google.step_count.delta:com.google.android.gms:estimated_steps

  1. 为什么数据源的价值与Google Fit值有所不同?

每个数据源代表不同的设备/源.我看到你有一个Sony Smart Watch和HTC Desire连接到Google Fit.您的每个设备都会将值汇总为Fit,这些值将合并在一起.Merge_step_deltas为您提供所有步骤计数器的合并流.Estimated_steps还会考虑活动,并在没有活动时估算步数.

  1. 如何获得Google Fit值?

REST API只能访问已同步到后端的数据.要获得与Google Fit相同的值,请阅读estimated_steps数据源.它应该与您在https://fit.google.com/上看到的内容相同.设备可能具有尚未同步到服务器的最新值.我们正在努力使同步和跨平台体验更加无缝.

- Google Fit Team的工程师.


Lon*_*ang 6

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

Google Fit 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.");
                    }
                }
            });
}
Run Code Online (Sandbox Code Playgroud)

您可能会发现这可以使您更接近Fit App给出的值.但是,这显然只能在设备上使用,因此您需要运行更新外部数据库的后台服务,这是记录和历史API为您提供的.

作为一个注意事项,当您的应用程序处于后台时,确保数据继续发送到Fitness Store,您需要使用Recording API,这也可能会更改您看到的值.

更新:

写完上面后我觉得我应该测试一下.这是从早晨散步.

  • Apple iPhone 6 HealthKit:6,762
  • Apple iPhone 6我的应用程序:6,762
  • Android Nexus 6 Fit: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为您提供所有步骤计数器的合并流.估计的步数也会考虑活动,并在没有步骤时估算步数"

我还没有到底的是使用我上面展示的传感器,它只给我2,548步.

另一个有点奇怪的事情是,一天后,Fit显示我做了6,668步,更接近Apple的结果,但重新计算了数据同步后最初显示的内容.我的应用仍显示6,920!

所有人同步的时间我没有测量.