History APIを使ってデータを取得する

ツイート このエントリーをはてなブックマークに追加
1つ上へ / ブログトップへ

バックグラウンドで計測したデータや、他のアプリによって追加されたデータは、Fitness.HistoryApi.readData()メソッドで取得できます。

private void readData(final DataType dataType) {
  // 取得の開始と終了時刻を決める
  long WEEK_IN_MS = 1000 * 60 * 60 * 24 * 7;
  Date now = new Date();
  long endTime = now.getTime();
  long startTime = endTime - (WEEK_IN_MS);

  // リクエストオブジェクトの作成
  DataReadRequest readreq = new DataReadRequest.Builder()
    .addAggregatedDefaultDataSource(DataTypes.STEP_COUNT_DELTA)
    .bucketByTime(1, TimeUnit.DAYS)
    .setTimeRange(startTime, endTime)
    .build();

  // APIの呼び出し
  PendingResult<DataReadResult> pendingResult =
    Fitness.HistoryApi.readData(mApiClient, readreq);

  // 結果を非同期で受け取るためにCallbackを設定
  pendingResult.setResultCallback(new ResultCallback<DataReadResult>() {
    @Override
    public void onResult(DataReadResult readDataResult) {
      // If the request specified aggregated data, the data is returned as buckets
      // that contain lists of DataSet objects
      if (readDataResult.getBuckets().size() > 0) {
        for (Bucket bucket : readDataResult.getBuckets()) {
          List<DataSet> dataSets = bucket.getDataSets();
          for (DataSet dataSet : dataSets) {
            // Show the data points (see next example)
            dumpDataSet(dataSet);
          }
        }
      // Otherwise, the data is returned as a list of DataSet objects
      } else if (readDataResult.getDataSets().size() > 0) {
        for (DataSet dataSet : readDataResult.getDataSets()) {
          // Show the data points (see next example)
          dumpDataSet(dataSet);
        }
      }
    }
  });
}

// 表示用メソッド
private void dumpDataSet(DataSet dataSet) {
  addMessage("Data type: " + dataSet.getDataType().getName());
  SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy.MM.dd HH:mm:ss");

  for (DataPoint dp : dataSet.getDataPoints()) {
    // Obtain human-readable start and end times
    long dpStart = dp.getStartTimeNanos() / 1000000;
    long dpEnd = dp.getEndTimeNanos() / 1000000;
    addMessage("Data point:");
    addMessage("\tType: " + dp.getDataType().getName());
    addMessage("\tStart: " + dateFormat.format(dpStart));
    addMessage("\tEnd: " + dateFormat.format(dpEnd));
    for(DataType.Field field : dp.getDataType().getFields()) {
      String fieldName = field.getName();
      addMessage("\tField: " + fieldName + " Value: " + dp.getValue(field));
    }
  }
}

リクエストオブジェクトの作成から見てみましょう。

// リクエストオブジェクトの作成
DataReadRequest readreq = new DataReadRequest.Builder()
  .addAggregatedDefaultDataSource(DataTypes.STEP_COUNT_DELTA)
  .bucketByTime(1, TimeUnit.DAYS)
  .setTimeRange(startTime, endTime)
  .build();

addAggregatedDefaultDataSource()メソッドで、どの種類のデータを取得するか指定します。bucketByTime()は1日単位で集計する例です(多分。。。)

APIの呼び出しはそのままなので省略し、結果を受け取る部分を見てみます。

// 結果を非同期で受け取るためにCallbackを設定
pendingResult.setResultCallback(new ResultCallback<DataReadResult>() {
  @Override
  public void onResult(DataReadResult readDataResult) {
    // If the request specified aggregated data, the data is returned as buckets
    // that contain lists of DataSet objects
    if (readDataResult.getBuckets().size() > 0) {
      for (Bucket bucket : readDataResult.getBuckets()) {
        List<DataSet> dataSets = bucket.getDataSets();
        for (DataSet dataSet : dataSets) {
          // Show the data points (see next example)
          dumpDataSet(dataSet);
        }
      }
    // Otherwise, the data is returned as a list of DataSet objects
    } else if (readDataResult.getDataSets().size() > 0) {
      for (DataSet dataSet : readDataResult.getDataSets()) {
        // Show the data points (see next example)
        dumpDataSet(dataSet);
      }
    }
  }
});

結果はバケツという単位か、生のDataSetの列で返ってくるかのどちらかのようです。

1つ上へ / ブログトップへ