我正在尝试从 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)
}
}