android / fit-samples

Multiple samples showing the best practices using the Fit APIs on Android.
Apache License 2.0
151 stars 113 forks source link

Always returns empty dataset #30

Open codingjeremy opened 5 years ago

codingjeremy commented 5 years ago

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() }


2. 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) }


3. 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) }

piotrkst commented 3 years ago

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.