我正在开发一个与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 Fit应用使用哪种数据源来计算步数?
2.为什么数据源的价值和Google Fit值有所不同?
3.我如何获得Google Fit值?
答案 0 :(得分:8)
Google Fit App使用estimated_steps数据源来计算步数。 DataSourceId:derived:com.google.step_count.delta:com.google.android.gms:estimated_steps
每个数据源代表不同的设备/来源。我看到你有一个Sony Smart Watch和HTC Desire连接到Google Fit。您的每个设备都会将值汇总为Fit,这些值将合并在一起。 Merge_step_deltas为您提供所有步骤计数器的合并流。 Estimated_steps还会考虑活动,并在没有活动时估算步数。
REST API只能访问已同步到后端的数据。 要获得与Google Fit相同的值,请阅读estimated_steps数据源。它应该与您在https://fit.google.com/上看到的相同。设备可能具有尚未同步到服务器的最新值。我们正在努力使同步和跨平台体验更加无缝。
- Google Fit Team的工程师。
答案 1 :(得分:6)
我认为您看到的区别在于Google使用History API和Sensors API之间的区别。如果您使用的是PHP,则可以通过可用的健身API查询Google Fit Store,这取决于应用程序通过录制API保存的内容。因此,您可能无法看到设备可用的所有数据。
我认为,但不确定,Fit App使用传感器api。在应用程序中,您可以使用Google文档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.");
}
}
});
}
您可能会发现这可以让您更接近Fit App提供的值。但是,这显然只能在设备上使用,因此您需要运行更新外部数据库的后台服务,这是录制和历史API为您提供的。
作为一个注意事项,要确保在您的应用处于后台时继续将数据发送到Fitness Store,您需要使用Recording API,这也可能会更改您看到的值。
<强>更新强>
写完上面的内容后我觉得我应该测试一下。这是从早晨散步。
这是来自Google+帖子,您可以找到here
“merge_step_deltas为您提供所有步骤计数器的合并流。估计_步骤也会考虑活动,并在没有步骤时估算步骤”
我还没有达到底部的是使用上面显示的传感器,它只给我2,548步。
另一个有点奇怪的事情是,一天后,Fit显示我做了6,668步,更接近Apple结果,但重新计算了数据同步后最初显示的内容。我的应用仍显示6,920!
全部同步的时间我没有测量。
答案 2 :(得分:0)
我最幸运的是derived:com.google.step_count.delta:com.google.android.gms:estimated_steps
最初的结果比我的手机读取的结果更高,所以我过滤了我的两个主要步骤设备select{|q| q["originDataSourceId"] =~ /360|Nexus/}
,这给了我最接近的结果。
如果我稍后尝试不同的日间范围并完全脱离墙壁,我会回来并注意到这一点。
答案 3 :(得分:0)
通过Google登录并存储用户的身份验证令牌时请求用户活动
添加额外的范围 例如在iOS中=
GIDSignIn.sharedInstance()?.scopes.append("https://www.googleapis.com/auth/fitness.activity.read")
与此类似,我们可以用其他语言添加范围
现在调用api以获取步骤
Api Reference Link - https://developers.google.com/fit/scenarios/read-daily-step-total
Api URL - https://www.googleapis.com/fitness/v1/users/me/dataset:aggregate
Api Method - POST
Headers - Authorization Access Token
API Request - {
"aggregateBy": [{
"dataTypeName": "com.google.step_count.delta",
"dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps"
}],
"bucketByTime": { "durationMillis": 86400000 }, //86400000 is 24 Hours in milli second
"startTimeMillis": 1582654903000, // Start time in milli second
"endTimeMillis": 1582741303000 // End time in milli second
}
{
"bucket": [
{
"startTimeMillis": "1582654903000",
"endTimeMillis": "1582741303000",
"dataset": [
{
"dataSourceId": "derived:com.google.step_count.delta:com.google.android.gms:aggregated",
"point": [
{
"startTimeNanos": "1582715420043664097",
"endTimeNanos": "1582721490164126971",
"dataTypeName": "com.google.step_count.delta",
"originDataSourceId": "raw:com.google.step_count.cumulative:Xiaomi:Mi A1:e96661ecb4ffb28d:Step Counter",
"value": [
{
"intVal": 683, // This is steps value
"mapVal": []
}]
}]
} ]
} ]
}