fit-samples icon indicating copy to clipboard operation
fit-samples copied to clipboard

Always returns empty dataset

Open codingjeremy opened this issue 6 years ago • 1 comments

Issue by ilyasdirin Tuesday May 14, 2019 at 08:11 GMT Originally opened as https://github.com/googlesamples/android-fit/issues/50


I'm developing a step counter with Google Fit. I tried to implement as it is defined in Google Fit docs. But the problem is that when I query step count it always returns empty dataset but when I query with readDailyTotal function it returns a dataset. I am not able to find what is the cause.

  1. I get the required permission for required step count permission
val fitnessOptions = FitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)  
.addDataType(DataType.TYPE_STEP_COUNT_CUMULATIVE, FitnessOptions.ACCESS_READ)  
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)  
.build()

if (! GoogleSignIn.hasPermissions(GoogleSignIn.getLastSignedInAccount(activity),  
fitnessOptions)) {
    GoogleSignIn.requestPermissions(
        activity, // your activity
        REQUEST_CODE_GOOGLE_FIT_PERMISSIONS,
        GoogleSignIn.getLastSignedInAccount(activity),
        fitnessOptions
    )
} else {
    onSuccess.invoke()
}
  1. I subscribe to the application for recording step counts.
Fitness.getRecordingClient(context, client!!)
.subscribe(DataType.TYPE_STEP_COUNT_DELTA)
.addOnSuccessListener {
    onSuccess.invoke()
}
.addOnFailureListener { e ->
    onFail.invoke(e)
}
  1. I query 1 week period with history API but it always returns an empty dataset.
// Setting a start and end date using a range of 1 week before this moment.  
val cal = Calendar.getInstance()  
val now = Date()  
cal.time = now  
val endTime = cal.timeInMillis  
cal.add(Calendar.WEEK_OF_YEAR, -1)  
val startTime = cal.timeInMillis  

val dateFormat = DateFormat.getDateInstance()
Log.i(TAG, "Range Start: " + dateFormat.format(startTime))
Log.i(TAG, "Range End: " + dateFormat.format(endTime))

val readRequest = DataReadRequest.Builder()
// The data request can specify multiple data types to return, effectively
// combining multiple data queries into one call.
// In this example, it's very unlikely that the request is for several hundred
// datapoints each consisting of a few steps and a timestamp.  The more likely
// scenario is wanting to see how many steps were walked per day, for 7 days.
.aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA)
// Analogous to a "Group By" in SQL, defines how data should be aggregated.
// bucketByTime allows for a time span, whereas bucketBySession would allow
// bucketing by "sessions", which would need to be defined in code.
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
.enableServerQueries()
.build()
Fitness.getHistoryClient(context, client)
    .readData(readRequest)
    .addOnSuccessListener { dataReadResponse ->
        dumpDataSets(dataReadResponse.dataSets)
        onSuccess.invoke(dataReadResponse)
    }
    .addOnFailureListener { e ->
        onFail.invoke(e)
    }
    .addOnCompleteListener { task ->
        dumpDataSets(task.result!!.dataSets)
        onComplete.invoke(task)
    }

codingjeremy avatar Sep 10 '19 20:09 codingjeremy

Hey, I have run into the same problem.

I have managed to overcome it by using deprecated methods from historical API sample: return DataReadRequest.Builder() .aggregate(DataType.TYPE_STEP_COUNT_DELTA, DataType.AGGREGATE_STEP_COUNT_DELTA) .bucketByTime(1, TimeUnit.DAYS) .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS) .build()

Hope this will save someone's day.

piotrkst avatar Nov 16 '20 18:11 piotrkst