华为Watch 2睡眠会话不在Google Fit Api睡眠端点中



我们有一个连接到Google Fit的应用程序,我们可以获得用户会话,例如睡眠活动(activity=72(。两年多来,我们每天都在运行这个应用程序,拥有大约15000名用户,可以无缝工作。

我们最近在我们的应用程序中发现了一位用户,他有一款华为Watch 2 Pro,连接到了谷歌Fit。该用户在其移动设备上有睡眠会话,但在Google Fit API(在会话端点中(中没有这些会话。

我们已经将同一个Googlefit帐户连接到第二部手机,这样我们就可以验证会话是否在云中,并且第二部移动电话能够加载所有睡眠会话;因此,我们相信这些会话在云中,但我们不能将它们视为睡眠会话(通过会话端点(。

为了进一步分析,我们还插入了谷歌Fit应用程序中的手动睡眠测量,它确实出现在谷歌Fit API中。因此,我们认为这与华为应用程序如何在谷歌Fit中节省睡眠时间有关。

因此,我们试图看看华为在哪里保存数据,如果它不在睡眠会话中的话。我们查看了dataSources内部,原始:com.google.activity.segment:com.huawei.health:然后,数据集聚合:

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": []
}
]
}
]
}
]
}
]
}

我们认为这些点可能是睡眠会话,因为:

  • 数据类型名称:"com.google.activity.segment";是睡眠会话,id数据源为huawei"原始:com.google.activity.segment.com.huawei.health">
  • 在本例中,前两点的时间是晚上,从晚上23:03到第二天早上6:20,这正是Google Fit应用程序中用户的睡眠测量
  • 如果我们将前两点的大值相加,我们得到的结果是26760000/1000*3600 = 7.43 = 7h26m,这正是用户在Google Fit应用程序中10月27日的测量值

然后:

睡眠会话是否在dataSource中,而不是在睡眠会话中收集?我们能在Google Fit应用程序中以某种方式区分这不是一个会话,而是一个数据集吗?为什么它没有在睡眠过程中被收集?这是来自华为应用程序的东西吗?我们怎么能真正知道这些数据集是睡眠会话?

我使用Python通过Google Fitness API从Oppo Watch收集睡眠数据。

我不使用会话访问数据,我只使用数据集。

source = "derived:com.google.sleep.segment:com.google.android.gms:sleep_from_activity<-raw:com.google.activity.segment:com.heytap.wearable.health:stream_sleep"
startEnd = "%s-%s" % (START, END)
dataset = fitService().users().dataSources().datasets().get(userId='me', dataSourceId=source, datasetId=startEnd ).execute()

然后响应看起来像这样(片段(:

"minStartTimeNs": "1607990400000000000",
"maxEndTimeNs": "1608063421000000000",
"dataSourceId": "derived:com.google.sleep.segment:com.google.android.gms:sleep_from_activity<-raw:com.google.activity.segment:com.heytap.wearable.health:stream_sleep",
"point": [
{
"startTimeNanos": "1607992860000000000",
"endTimeNanos": "1607994180000000000",
"dataTypeName": "com.google.sleep.segment",
"originDataSourceId": "raw:com.google.activity.segment:com.heytap.wearable.health:stream_sleep",
"value": [
{
"intVal": 4,
"mapVal": []
}
],
"modifiedTimeMillis": "1607996640613"
},
{
"startTimeNanos": "1607994180000000000",
"endTimeNanos": "1607994360000000000",
"dataTypeName": "com.google.sleep.segment",
"originDataSourceId": "raw:com.google.activity.segment:com.heytap.wearable.health:stream_sleep",
"value": [
{
"intVal": 5,
"mapVal": []
}
],
"modifiedTimeMillis": "1607996640613"
},

这些点包含包括"轻度睡眠"(intVal 4(和"深度睡眠"(int Val(5的片段。我计算出有多少个浅分段和深分段,以及每个分段的开始/结束时间。

使用这种方法检索到的所有片段都与Google Fit应用程序和Oppo应用程序(HeyTap Health(中显示的内容完全匹配。到目前为止,我没有遇到任何问题。

我不确定这是否有帮助,但我认为最好提一下,我不使用";会话";完全

最新更新