2 years ago
#319758
changsun moon
google fit android api get sleep data
I'm going to use Google Fit's Android api to get the data.
I was able to get the data related to the number of steps I used for the first time, but I couldn't get the data when I tried to get the sleep data.
How can I get the fit sleep data normally?
I was wondering if it was a problem with Google oAuth, so I checked the settings of OAuth 2.0 Scopes again, but I couldn't confirm the problem.
Is there anyone who can tell me a good way?
Below is my current code.
'''
//init
val account = GoogleSignIn.getAccountForExtension(context, fitnessOptions)
if (GoogleSignIn.hasPermissions(account, fitnessOptions).not()) {
GoogleSignIn.requestPermissions(
this, // your activity
GOOGLE_FIT_PERMISSIONS_REQUEST_CODE, // e.g. 1
account,
fitnessOptions
)
} else {
accessGoogleFit(account)
}
//function
private fun accessGoogleFit(account: GoogleSignInAccount) {
val eT = java.util.Calendar.getInstance()
val sT = java.util.Calendar.getInstance()
eT.timeZone = TimeZone.getDefault()
sT.timeZone = TimeZone.getDefault()
sT.set(2021, 11, 22, 0, 0, 0)
eT.set(2021, 12, 22, 23, 59, 59)
if (Build.VERSION.SDK_INT >= 26) {
val startTime = LocalDate.now().atStartOfDay(ZoneId.systemDefault())
val endTime = LocalDateTime.now().atZone(ZoneId.systemDefault())
val endSeconds = eT.timeInMillis
val startSeconds = sT.timeInMillis
val datasource = DataSource.Builder()
.setAppPackageName("com.google.android.gms")
.setDataType(DataType.TYPE_STEP_COUNT_DELTA)
.setType(DataSource.TYPE_DERIVED)
.setStreamName("estimated_steps")
.build()
val request = DataReadRequest.Builder()
.aggregate(datasource)
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
.build()
val sleepingE = LocalDateTime.now().atZone(ZoneId.systemDefault())
val sleepingS = endTime.minusWeeks(1)
val readRequest = SessionReadRequest.Builder()
.setTimeInterval(
sleepingS.toEpochSecond(),
sleepingE.toEpochSecond(),
TimeUnit.SECONDS
)
.read(DataType.TYPE_SPEED)
.setSessionName("sleeping")
.build()
Fitness.getHistoryClient(
activity,
GoogleSignIn.getAccountForExtension(activity, fitnessOptions)
)
.readData(request)
.addOnSuccessListener { response ->
val totalSteps = response.buckets
.flatMap { it.dataSets }
.flatMap { it.dataPoints }
.sumBy { it.getValue(Field.FIELD_STEPS).asInt() }
vm.googleFitSteps.value = totalSteps
}
.addOnCanceledListener {
}
Fitness.getSessionsClient(activity,account).readSession(readRequest)
.addOnSuccessListener { response ->
for (session in response.sessions) {
val sessionStart = session.getStartTime(TimeUnit.MILLISECONDS)
val sessionEnd = session.getEndTime(TimeUnit.MILLISECONDS)
Log.e("googleFit", "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.e("googleFit", "\t* Type $sleepStage between $segmentStart and $segmentEnd")
}
}
}
}.addOnFailureListener { e ->
Log.e("googleFit", "Failed to read session error :$e", e)
}
} else {
showAlertDialog("지원되지 않는 휴대폰입니다.", {
vm.setSyncHealthApp(false)
vm.checkHealthAppSync.value = false
})
}
}
'''
android
kotlin
google-fit
0 Answers
Your Answer