我们有一个连接到 Google Fit 的应用程序,我们获取用户会话,例如睡眠活动(活动 = 72)。两年多来,我们每天都在运行这个应用程序,大约有 15.000 名用户,无缝运行。
我们最近在我们的应用程序中发现了一位用户,他的华为 Watch 2 Pro 连接到 Google Fit。此用户在他的手机上有睡眠会话,但在 Google Fit API 中没有这些会话(在会话端点中)。
我们已经将同一个 Googlefit 帐户连接到第二部手机,因此我们可以验证会话是否在云端,并且第二部手机已经能够加载所有睡眠会话;所以我们相信这些会话在云中,但我们不能将它们视为睡眠会话(通过会话端点)。
为了进一步分析,我们还插入了来自 Google Fit 应用程序的手动睡眠测量,它确实出现在 Google Fit API 中。所以我们认为这与华为应用如何在 Google Fit 中保存睡眠会话有关。
因此,我们试图查看华为在哪里保存数据,如果它不在睡眠会话中。我们查看了 dataSources,raw:com.google.activity.segment:com.huawei.health:,然后,dataset aggregate:
https://www.googleapis.com/fitness/v1/users/userId/dataset:aggregate
使用请求正文和我们知道用户进行睡眠会话的一系列日期:
{
"aggregateBy": [{
"dataSourceId": "raw:com.google.activity.segment:com.huawei.health:",
"dataTypeName": "com.google.activity.segment"
}],
"bucketByTime": { "durationMillis": 86400000 },
"startTimeMillis": 1603753199000, //GMT: Monday, 26 October 2020 22:59:59
"endTimeMillis": 1603782000000 //GMT: Tuesday, 27 October 2020 7:00:00
}
我们获得一系列点,可能是睡眠会话,例如: 响应:
{
"bucket": [
{
"startTimeMillis": "1603753199000",
"endTimeMillis": "1603782000000",
"dataset": [
{
"dataSourceId": "derived:com.google.activity.summary:com.google.android.gms:aggregated",
"point": [
{
"startTimeNanos": "1603753380000000000", //GMT: Monday, 26 October 2020 23:03:00
"endTimeNanos": "1603780140000000000", //GMT: Tuesday, 27 October 2020 6:29:00
"dataTypeName": "com.google.activity.summary",
"originDataSourceId": "raw:com.google.activity.segment:com.huawei.health:",
"value": [
{
"intVal": 109,
"mapVal": []
},
{
"intVal": 20160000,
"mapVal": []
},
{
"intVal": 336,
"mapVal": []
}
]
},
{
"startTimeNanos": "1603755240000000000", //GMT: Monday, 26 October 2020 23:34:00
"endTimeNanos": "1603779600000000000", //GMT: Tuesday, 27 October 2020 6:20:00
"dataTypeName": "com.google.activity.summary",
"originDataSourceId": "raw:com.google.activity.segment:com.huawei.health:",
"value": [
{
"intVal": 110,
"mapVal": []
},
{
"intVal": 6600000,
"mapVal": []
},
{
"intVal": 110,
"mapVal": []
}
]
},
{
"startTimeNanos": "1603781520000000000", //GMT: Tuesday, 27 October 2020 6:52:00
"endTimeNanos": "1603781880000000000", GMT: Tuesday, 27 October 2020 6:58:00
"dataTypeName": "com.google.activity.summary",
"originDataSourceId": "raw:com.google.activity.segment:com.huawei.health:",
"value": [
{
"intVal": 7,
"mapVal": []
},
{
"intVal": 240000,
"mapVal": []
},
{
"intVal": 4,
"mapVal": []
}
]
}
]
}
]
}
]
}
我们认为这些点可能是睡眠时间,因为:
- dataTypeName: "com.google.activity.segment" 为睡眠会话,id 数据源为 huawei "raw: com.google.activity.segment: com.huawei.health"
- 前两点的时间是晚上,在例子中是从下午 23:03 到次日早上 6:20,正好是用户在 Google Fit 应用中的睡眠测量。
- 如果我们将前两个点的大值相加,我们会得到结果
26760000/1000*3600 = 7.43 = 7h26m
,这正是用户在 Google Fit 应用中 10 月 27 日的测量值
然后:
睡眠会话是否可以在数据源中而不是在睡眠会话中收集?我们能否在 Google Fit 应用程序中以某种方式区分这不是会话,而是数据集?为什么它没有在睡眠会话中被收集?是来自华为应用程序的东西吗?我们如何才能真正知道这些数据集是睡眠会话?