バックグラウンドで計測したデータや、他のアプリによって追加されたデータは、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の列で返ってくるかのどちらかのようです。