如何使用googlefit历史记录api获得与googlefit app步骤相同的步骤?

时间:2016-09-25 21:35:41

标签: android google-fit google-fit-sdk

使用以下代码,我可以获得响应,但使用空数据集。在googlefit应用程序中,显示了步骤。如何通过历史记录api获取googlefit app中显示的确切步骤?我尝试了体重,卡路里......每次,响应都是作为空数据集而来的!我已经浪费了最近3天的时间。

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(DataType.TYPE_STEP_COUNT_DELTA,DataType.AGGREGATE_STEP_COUNT_DELTA)
      .bucketByTime(1, TimeUnit.DAYS)
      .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
      .build();

PendingResult<DataReadResult> pendingResult = Fitness.HistoryApi.readData(mClient, readRequest);
  pendingResult.setResultCallback(new ResultCallback<DataReadResult>(){
    @Override
    public void onResult(@NonNull DataReadResult dataReadResult) {
      parseData(dataReadResult);
    }
  });

private static void parseData(DataReadResult dataReadResult) {
if (dataReadResult.getBuckets().size() > 0) {
  Log.i(TAG,
      "Number of returned buckets of DataSets is: " + dataReadResult.getBuckets().size());
  for (Bucket bucket : dataReadResult.getBuckets()) {
    List<DataSet> dataSets = bucket.getDataSets();
    for (DataSet dataSet : dataSets) {
      dumpDataSet(dataSet);
    }
  }
} else if (dataReadResult.getDataSets().size() > 0) {
  Log.i(TAG, "Number of returned DataSets is: " + dataReadResult.getDataSets().size());
  for (DataSet dataSet : dataReadResult.getDataSets()) {
    dumpDataSet(dataSet);
  }
}
  }

2 个答案:

答案 0 :(得分:0)

相关SO thread

在使用History API检索数据之前,您必须先使用Recording API

进行记录

您的应用可以使用Recording API创建对DataType.TYPE_STEP_COUNT_CUMULATIVE数据类型的订阅来记录用户的步数,如以下示例所示:

public void subscribe() {
    // To create a subscription, invoke the Recording API. As soon as the subscription is
    // active, fitness data will start recording.
    Fitness.RecordingApi.subscribe(mClient, DataType.TYPE_STEP_COUNT_CUMULATIVE)
            .setResultCallback(new ResultCallback<Status>() {
                @Override
                public void onResult(Status status) {
                    if (status.isSuccess()) {
                        if (status.getStatusCode()
                                == FitnessStatusCodes.SUCCESS_ALREADY_SUBSCRIBED) {
                            Log.i(TAG, "Existing subscription for activity detected.");
                        } else {
                            Log.i(TAG, "Successfully subscribed!");
                        }
                    } else {
                        Log.w(TAG, "There was a problem subscribing.");
                    }
                }
            });
}
  

即使应用,Google Fit也会存储订阅中的步骤数据   没有运行,并在系统恢复订阅   重新启动。您的应用可以读取用户的每日步骤总数   健身史。

     

T 他的完全相同的问题在Google Fit常见问题解答中得到解决   找到了   here

     

Fit应用程序使用特定数据源执行步骤。它补充说   以下功能位于默认合并步骤流之上:

     

在骑车,驾驶和其他一些非移动时记录的步骤   活动被删除。当涉及步骤的活动(例如   步行或跑步)没有合理的步骤数   与之相关的,估计活动的步骤。您可以   访问“估计”步骤流,如下所示:

     

通过REST API:

     

派生:com.google.step_count.delta:com.google.android.gms:estimated_step&gt; s通过Android API:

new DataSource.Builder()
      .setAppPackageName(“com.google.android.gms”)
      .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
      .setType(DataSource.TYPE_DERIVED)
      .setStreamName("estimated_steps")
      .build();
  

请注意,即使使用正确的数据源,您的步数也可以   仍然与Google Fit应用不同。这可能是应该的   出于以下原因之一:

     

在磨损时,Fit MicroApp在连接时将显示步数   通过电话查询并通过可穿戴API传输。其他   访问仅限本地数据的MicroApp只会获得监视步骤。我们是   致力于让开发人员更轻松。有时候这一步   Google Fit应用的计算代码已更新,其中包含错误修复程序   在我们能够向开发人员发布修复程序之前(需要   Google Play服务版本)。我们也在努力创造它   开发人员可以同时访问修复程序。

答案 1 :(得分:0)

我的方式:案例DataStepCounterRequest:

            final DataSource ds = new DataSource.Builder()
                    .setAppPackageName("com.google.android.gms")
                    .setDataType(DataType.TYPE_STEP_COUNT_DELTA)
                    .setType(DataSource.TYPE_DERIVED)
                    .setStreamName("estimated_steps")
                    .build();


            return new DataReadRequest.Builder()
                    .aggregate(ds, DataType.AGGREGATE_STEP_COUNT_DELTA)
                    .bucketByTime(1, TimeUnit.DAYS)
                    .setTimeRange(startTime, endTime, TimeUnit.MILLISECONDS)
                    .enableServerQueries()
                    .build();