Odczytuj dane dotyczące snu

Sen jest reprezentowany przez sesje typu sleep. Sesje mogą opcjonalnie zawierać fazy snu, które zawierają bardziej szczegółowe informacje o danych o śnie. Na przykład czy był to sen płytki, głęboki czy REM:

Wartości faz snu
Rodzaj fazy snu Wartość
Wybudzenie (podczas cyklu snu) 1
Sen 2
Poza łóżkiem 3
Lekki sen 4
Głęboki sen 5
REM 6

W przewodniku Zapisywanie danych o śnie znajdziesz informacje o tym, jak w Fit są reprezentowane szczegółowe i mniej szczegółowe dane o śnie.

Android

W obu przypadkach w przykładach poniżej używany jest obiekt SessionClient do pobierania danych z Fit.

val SLEEP_STAGE_NAMES = arrayOf(
    "Unused",
    "Awake (during sleep)",
    "Sleep",
    "Out-of-bed",
    "Light sleep",
    "Deep sleep",
    "REM sleep"
)

val request = SessionReadRequest.Builder()
    .readSessionsFromAllApps()
    // By default, only activity sessions are included, so it is necessary to explicitly
    // request sleep sessions. This will cause activity sessions to be *excluded*.
    .includeSleepSessions()
    // Sleep segment data is required for details of the fine-granularity sleep, if it is present.
    .read(DataType.TYPE_SLEEP_SEGMENT)
    .setTimeInterval(startTime, endTime, TimeUnit.MILLISECONDS)
    .build()

sessionsClient.readSession(request)
    .addOnSuccessListener { response ->
        for (session in response.sessions) {
            val sessionStart = session.getStartTime(TimeUnit.MILLISECONDS)
            val sessionEnd = session.getEndTime(TimeUnit.MILLISECONDS)
            Log.i(TAG, "Sleep between $sessionStart and $sessionEnd")

            // If the sleep session has finer granularity sub-components, extract them:
            val dataSets = response.getDataSet(session)
            for (dataSet in dataSets) {
                for (point in dataSet.dataPoints) {
                    val sleepStageVal = point.getValue(Field.FIELD_SLEEP_SEGMENT_TYPE).asInt()
                    val sleepStage = SLEEP_STAGE_NAMES[sleepStageVal]
                    val segmentStart = point.getStartTime(TimeUnit.MILLISECONDS)
                    val segmentEnd = point.getEndTime(TimeUnit.MILLISECONDS)
                    Log.i(TAG, "\t* Type $sleepStage between $segmentStart and $segmentEnd")
                }
            }
        }
    }

REST

Pobieranie sesji snu za pomocą interfejsu REST API to proces dwuetapowy:

  1. Pobierz listę sesji, ustawiając parametr activityType na 72 (SLEEP). Uwaga: możesz użyć parametrów startTimeendTime lub parametru pageToken do pobrania nowych sesji od czasu poprzedniego żądania.

    Metoda HTTP

    GET
    

    Adres URL żądania

    https://www.googleapis.com/fitness/v1/users/me/sessions?startTime=2019-12-05T00:00.000Z&endTime=2019-12-17T23:59:59.999Z&activityType=72
    

    Odpowiedź

    Przykładowa odpowiedź Session może wyglądać tak:

    {
     "session": [
        {
         "id": "Sleep1575505620000",
         "name": "Sleep",
         "description": "",
         "startTimeMillis": "1575505620000",
         "endTimeMillis": "1575526800000",
         "modifiedTimeMillis": "1575590432413",
         "application": {
          "packageName": "com.example.sleep_tracker"
         },
         "activityType": 72  // Sleep
        },
        {
         "id": "Run2939075083",
         "name": "Mud",
         "description": "",
         "startTimeMillis": "1576594403000",
         "endTimeMillis": "1576598754000",
         "modifiedTimeMillis": "1576616010143",
         "application": {
          "packageName": "com.example.run_tracker"
         },
         "activityType": 8  // Running
        }
      ],
     "deletedSession": [],
     "nextPageToken": "1576598754001"
    }
    
  2. Aby uzyskać szczegółowe informacje o fazach snu w każdej sesji (jeśli są dostępne), użyj tego żądania w przypadku każdej sesji na przefiltrowanej liście:

    Metoda HTTP

    POST
    

    Adres URL żądania

    https://www.googleapis.com/fitness/v1/users/userId/dataset:aggregate
    

    Treść żądania

    {
      "aggregateBy": [
        {
          "dataTypeName": "com.google.sleep.segment"
        }
      ],
      "endTimeMillis": 1575609060000,
      "startTimeMillis": 1575591360000
    }
    

    Odpowiedź

    Jeśli Twoje żądanie zostało zrealizowane, otrzymasz kod stanu odpowiedzi HTTP 200 OK. Treść odpowiedzi zawiera reprezentację JSON segmentów aktywności, które składają się na sesję snu. Każdy symbol intVal oznacza typ aktywności związanej ze snem.

    {
     "bucket": [
      {
       "startTimeMillis": "1575591360000",
       "endTimeMillis": "1575609060000",
       "dataset": [
        {
         "point": [
          {
           "startTimeNanos": "1575591360000000000",
           "endTimeNanos": "1575595020000000000",
           "dataTypeName": "com.google.sleep.segment",
           "originDataSourceId": "...",
           "value": [
            {
             "intVal": 4, // Light sleep
             "mapVal": []
            }
           ]
          },
          {
           "startTimeNanos": "1575595020000000000",
           "endTimeNanos": "1575596220000000000",
           "dataTypeName": "com.google.sleep.segment",
           "originDataSourceId": "...",
           "value": [
            {
             "intVal": 1, // Sleep
             "mapVal": []
            }
           ]
          },
    
          // .... more datapoints
    
          {
           "startTimeNanos": "1575605940000000000",
           "endTimeNanos": "1575609060000000000",
           "dataTypeName": "com.google.sleep.segment",
           "originDataSourceId": "...",
           "value": [
            {
             "intVal": 4, // Light sleep
             "mapVal": []
            }
           ]
          }
         ]
        }
       ]
      }
     ]
    }