我正在尝试从 google fit API 检索用户的每周步数数据,但我从官方 google fit App 数据中获得了不同的步数结果。例如:星期四通过 google fit api 检索的步数为5244,而在官方 google fit 应用程序中,星期四的步数为5134。一周中每一天的步数略有不同,但我想要准确的结果。我正在使用 google fit History API 来检索每周步数并显示在条形图中。我的代码如下所示:
fitnessOptions = FitnessOptions.builder()
.addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.AGGREGATE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
.addDataType(DataType.TYPE_LOCATION_SAMPLE, FitnessOptions.ACCESS_READ)
.build();
@RequiresApi(api = Build.VERSION_CODES.O)
private void invokeHistoryApiForWeeklySteps() {
// Read the data that's been collected throughout the past week.
ZonedDateTime endTime = null;
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
endTime = LocalDateTime.now().atZone(ZoneId.systemDefault());
}
ZonedDateTime startTime = endTime.minusWeeks(1);
Log.i(TAG, "Range Start: $startTime");
Log.i(TAG, "Range End: $endTime");
DataSource ESTIMATED_STEP_DELTAS = new DataSource.Builder()
.setDataType(DataType.TYPE_STEP_COUNT_DELTA)
.setType(DataSource.TYPE_DERIVED)
.setStreamName("estimated_steps")
.setAppPackageName("com.google.android.gms")
.build();
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(ESTIMATED_STEP_DELTAS, DataType.AGGREGATE_STEP_COUNT_DELTA)
.bucketByTime(1, TimeUnit.DAYS)
.setTimeRange(startTime.toEpochSecond(), endTime.toEpochSecond(), TimeUnit.SECONDS)
.enableServerQueries()
.build();
Fitness.getHistoryClient(this, GoogleSignIn.getAccountForExtension(this, fitnessOptions))
.readData(readRequest)
.addOnSuccessListener(response -> {
// The aggregate query puts datasets into buckets, so convert to a
// single list of datasets
for (Bucket bucket : response.getBuckets()) {
//convert days in bucket to milliseconds
long days = bucket.getStartTime(TimeUnit.MILLISECONDS);
//convert milliseconds to date
Date stepsDate = new Date(days);
//convert date to day of the week eg: monday, tuesday etc
@SuppressLint("SimpleDateFormat")
DateFormat df = new SimpleDateFormat("EEE");
String weekday = df.format(stepsDate);
Log.i(TAG, stepsDate.toString());
theDates.add(weekday);
for (DataSet dataSet : bucket.getDataSets()) {
totalAvgSteps.add(dumpDataSet(dataSet));
}
}
Log.i(TAG, theDates.toString());
Log.i(TAG, totalAvgSteps.toString());
displayBarChart();
})
.addOnFailureListener(e ->
Log.w(TAG, "There was an error reading data from Google Fit", e));
}
private int dumpDataSet(DataSet dataSet) {
Log.i(TAG, "Data returned for Data type: ${dataSet.dataType.name}");
int totalSteps = 0;
for (DataPoint dp : dataSet.getDataPoints()) {
Log.i(TAG, "Data point:");
Log.i(TAG, "\tType: ${dp.dataType.name}");
Log.i(TAG, "\tStart: ${dp.getStartTimeString()}");
Log.i(TAG, "\tEnd: ${dp.getEndTimeString()}");
for (Field field : dp.getDataType().getFields()) {
String fieldName = field.getName();
totalSteps += dp.getValue(field).asInt();
Log.i(TAG, "\tfield: " + fieldName + "value: " + dp.getValue(field));
}
}
return totalSteps;
}
这是我通过这段代码得到的结果:
我的代码结果:
这就是 google Fit Official App 中的数据
Google Fit 应用程序中的步数计数:
Google Fit 应用程序中的步数: