0

我正在尝试从 Google Fit 读取睡眠数据。sessionClient 成功地从 Fit 读取,但是,即使 Fit 中记录了睡眠会话,它也不会在 response.sessions 中返回任何会话。由于 API 更新相对较新,我无法在线找到任何资源来解决此问题,因此我们将不胜感激。

响应返回:

SessionReadResult{status=Status{statusCode=SUCCESS, resolution=null}, session=[], sessionDataSets=[]}

我遵循了来自https://developers.google.com/fit/scenarios/read-sleep-data#android的更新文档

这是 Fit 中记录的睡眠数据:

在此处输入图像描述

并且使用的代码:

        //Sets the start time to the month previous so data is got from then
        val endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
        val startTime = endTime.minusMonths(1)

        //Sleep session request
        val request = SessionReadRequest.Builder()
            .readSessionsFromAllApps()
            .includeSleepSessions()
            .read(DataType.TYPE_SLEEP_SEGMENT)
            .enableServerQueries()
            .setTimeInterval(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.MILLISECONDS)
            .build()

        //Set fitnessOptions
        val fitnessOptions = FitnessOptions.builder()
            .accessSleepSessions(FitnessOptions.ACCESS_READ)
            .addDataType(DataType.TYPE_SLEEP_SEGMENT, FitnessOptions.ACCESS_READ)
            .build()

        //Get permissions from user
        if (!GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(this), fitnessOptions)) {
            GoogleSignIn.requestPermissions(
                this,
                RC_REQUEST_SLEEP_AND_CONTINUE_SUBSCRIPTION,
                GoogleSignIn.getLastSignedInAccount(this),
                fitnessOptions);
        }

        //Make read request and process response
        getSessionsClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
            .readSession(request)
            .addOnSuccessListener { response ->
                Log.i(TAG, "Read Success")

                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")
                        }
                    }
                }
                setBarChartValues(pTime)
            }
            .addOnFailureListener { e ->
                Log.i(TAG, "Failure Response: ", e)
            }
    }
4

2 回答 2

0

您以秒为单位传递日期时间,但您已指定以毫秒为单位。

代替

.setTimeInterval(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.MILLISECONDS)

.setTimeInterval(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
于 2021-07-18T15:12:00.523 回答
0

我已经通过使用来自谷歌的示例项目解决了这个问题:https ://github.com/android/fit-samples/blob/main/SleepKotlin/app/src/main/java/com/google/android/gms/适合/样本/basicsleepkotlin/MainActivity.kt

它的代码/步骤比文档中描述的要多得多,尤其是关于新的睡眠权限。

于 2021-04-23T12:52:18.060 回答