我开发了一个需要显示每日步数的应用程序。 为此,我使用了Google Fit SDK中提供的API。
似乎一切正常,但我得到的步数与Google Fit官方应用中显示的步数不匹配。
例如,当Google Fit App显示2367步时,我会获得2308步。
这有什么理由吗?有没有人有同样的问题? 任何人都有线索?
答案 0 :(得分:25)
我找到了解决方案。
Fit应用程序会在这些步骤之上执行一些额外的处理。当没有记录时,它会根据活动估算步骤。
如果可以帮助某人: 您需要使用com.google.android.gms包的自定义DataSource
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, endTime, TimeUnit.MILLISECONDS)
.build();
答案 1 :(得分:4)
Google Play Services 7.3(2015年4月28日发布)为HistoryApi.readDailyTotal添加了一种新方法,该方法与Google Fit官方应用上的步数相匹配,并且更易于使用。
PendingResult<DailyTotalResult> result = Fitness.HistoryApi.readDailyTotal(fitnessApiClient, DataType.AGGREGATE_STEP_COUNT_DELTA);
DailyTotalResult totalResult = result.await(30, TimeUnit.SECONDS);
if (totalResult.getStatus().isSuccess()) {
DataSet totalSet = totalResult.getTotal();
steps = totalSet.isEmpty() ? -1 : totalSet.getDataPoints().get(0).getValue(Field.FIELD_STEPS).asInt();
}
答案 2 :(得分:1)
由于Sameer Z.要求我发布完整代码以获取值。
DataSource estimatedSteps = 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(estimatedSteps, DataType.AGGREGATE_STEP_COUNT_DELTA)
.setTimeRange(startTimeSeconds, endTimeSeconds, TimeUnit.SECONDS)
.bucketByTime(1, TimeUnit.DAYS)
.enableServerQueries()
.build();
PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi.readData(client, readRequest);
pendingResult.setResultCallback(new ResultCallback<DataReadResult>() {
@Override
public void onResult(@NonNull DataReadResult dataReadResult) {
List<Bucket> allBuckets = dataReadResult.getBuckets();
for (Bucket bucket : allBuckets) {
long startAtSeconds = bucket.getStartTime(TimeUnit.SECONDS);
Value stepsValue = getValue(bucket, DataType.TYPE_STEP_COUNT_DELTA, Field.FIELD_STEPS);
int steps = stepsValue != null ? stepsValue.asInt() : 0;
Log.d(TAG, String.format("startAtSeconds %s, steps %s", startAtSeconds, steps));
}
}
});
答案 3 :(得分:0)
Google Fit sdk是Google Play服务的一部分..官方Google Fit应用程序也从Google Play服务sdk收集相同数据,但Google可能已在Google Fit应用中添加了一些代码以使数据更多准确。它也可能是Google Fit应用中的错误。