2 years ago

#319758

test-img

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

Accepted video resources