2

我们有一个连接到 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 应用程序中以某种方式区分这不是会话,而是数据集?为什么它没有在睡眠会话中被收集?是来自华为应用程序的东西吗?我们如何才能真正知道这些数据集是睡眠会话?

4

1 回答 1

0

我使用 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)和“深度睡眠”(intVal)5 在内的段。我计算有多少浅段和深段以及每个段的开始/结束时间。

使用此方法检索到的所有细分都与 Google Fit 应用和 Oppo 应用(HeyTap Health)中显示的完全匹配。到目前为止,我没有任何问题。

我不确定这是否有帮助,但我认为最好提一下我根本不使用“会话”。

于 2020-12-15T22:06:19.887 回答