Google fit 在 Android 一小时内获取运动数据
Google fit get exercise data within one hour in Android
我目前正在开发一个与健身数据相关的 Android 应用程序,对于该应用程序,我需要获得 Step_Count、HEART_RATE_BPM、睡眠持续时间和锻炼 data.I需要每小时获取数据,所以我使用 bucketByTime 作为 1 小时,我使用 AGGREGATE_ACTIVITY_SUMMARY 获取 activity 所有活动的摘要数据 hour.I 也可以从中过滤运动数据但这并不实用,因为 API.I 中列出的练习类型太多,正在寻找替代解决方案。
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_STEP_COUNT_DELTA,
DataType.AGGREGATE_STEP_COUNT_DELTA)
.aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
.aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByTime(1, TimeUnit.HOURS)
.setTimeRange(starttime, endtime, TimeUnit.MILLISECONDS)
.build();
DataReadResult dataReadResult = Fitness.HistoryApi.readData(mClient, readRequest).await(1, TimeUnit.MINUTES);
//Used for aggregated data
if (dataReadResult.getBuckets().size() > 0) {
Log.i("History", "Number of buckets: " + dataReadResult.getBuckets().size());
for (Bucket bucket : dataReadResult.getBuckets()) {
List<DataSet> dataSets = bucket.getDataSets();
for (DataSet dataSet : dataSets) {
showDataSet(dataSet);
}
}
}
return null;
}
}
private void readData() {
new VerifyDataTask().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the main; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void showDataSet(DataSet dataSet) {
Log.e("History", "Data returned for Data type: " + dataSet.getDataType().getName());
DateFormat dateFormat = DateFormat.getDateInstance();
DateFormat timeFormat = DateFormat.getTimeInstance();
String sleepHours = "0";
for (DataPoint dp : dataSet.getDataPoints()) {
Log.i("History", "Data point:");
Log.i("History", "\tType: " + dp.getDataType().getName());
Log.i("History", "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
Log.i("History", "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
for(Field field : dp.getDataType().getFields()) {
if(dp.getOriginalDataSource().getAppPackageName().toString().contains("sleep") && field.getName().contains("duration")){
Value value = dp.getValue(field);
long h = TimeUnit.MILLISECONDS.toHours(value.asInt());
long m =TimeUnit.MILLISECONDS.toMinutes(value.asInt());
m = m - (h*60);
sleepHours =h +" h " + m + " m";
Log.i(TAG, "\tField: Sleep duration : " + sleepHours);
}
Log.i("History", "\tField: " + field.getName() +
" Value: " + dp.getValue(field));
}
}
}
可以参考这个documentation on how to read detailed and aggregate data. In the sample code, you need to set a start and end date using a range of 1 week before this moment. cal.add(Calendar.WEEK_OF_YEAR, -1);
. If you want to have only 1 hour, use cal.add(Calendar.HOUR_OF_DAY, -1);
. After you create a DataReadRequest
instance, use the [HistoryApi.readData()
](https://developer.android.com/reference/com/google/android/gms/fitness/HistoryApi.html#readData(com.google.android.gms.common.api.GoogleApiClient,com.google.android.gms.fitness.request.DataReadRequest))方法同步等待或者提供一个回调方法来处理健身历史数据
我目前正在开发一个与健身数据相关的 Android 应用程序,对于该应用程序,我需要获得 Step_Count、HEART_RATE_BPM、睡眠持续时间和锻炼 data.I需要每小时获取数据,所以我使用 bucketByTime 作为 1 小时,我使用 AGGREGATE_ACTIVITY_SUMMARY 获取 activity 所有活动的摘要数据 hour.I 也可以从中过滤运动数据但这并不实用,因为 API.I 中列出的练习类型太多,正在寻找替代解决方案。
DataReadRequest readRequest = new DataReadRequest.Builder()
.aggregate(DataType.TYPE_STEP_COUNT_DELTA,
DataType.AGGREGATE_STEP_COUNT_DELTA)
.aggregate(DataType.TYPE_HEART_RATE_BPM, DataType.AGGREGATE_HEART_RATE_SUMMARY)
.aggregate(DataType.TYPE_ACTIVITY_SEGMENT, DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByTime(1, TimeUnit.HOURS)
.setTimeRange(starttime, endtime, TimeUnit.MILLISECONDS)
.build();
DataReadResult dataReadResult = Fitness.HistoryApi.readData(mClient, readRequest).await(1, TimeUnit.MINUTES);
//Used for aggregated data
if (dataReadResult.getBuckets().size() > 0) {
Log.i("History", "Number of buckets: " + dataReadResult.getBuckets().size());
for (Bucket bucket : dataReadResult.getBuckets()) {
List<DataSet> dataSets = bucket.getDataSets();
for (DataSet dataSet : dataSets) {
showDataSet(dataSet);
}
}
}
return null;
}
}
private void readData() {
new VerifyDataTask().execute();
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
// Inflate the main; this adds items to the action bar if it is present.
getMenuInflater().inflate(R.menu.main, menu);
return true;
}
private void showDataSet(DataSet dataSet) {
Log.e("History", "Data returned for Data type: " + dataSet.getDataType().getName());
DateFormat dateFormat = DateFormat.getDateInstance();
DateFormat timeFormat = DateFormat.getTimeInstance();
String sleepHours = "0";
for (DataPoint dp : dataSet.getDataPoints()) {
Log.i("History", "Data point:");
Log.i("History", "\tType: " + dp.getDataType().getName());
Log.i("History", "\tStart: " + dateFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
Log.i("History", "\tEnd: " + dateFormat.format(dp.getEndTime(TimeUnit.MILLISECONDS)) + " " + timeFormat.format(dp.getStartTime(TimeUnit.MILLISECONDS)));
for(Field field : dp.getDataType().getFields()) {
if(dp.getOriginalDataSource().getAppPackageName().toString().contains("sleep") && field.getName().contains("duration")){
Value value = dp.getValue(field);
long h = TimeUnit.MILLISECONDS.toHours(value.asInt());
long m =TimeUnit.MILLISECONDS.toMinutes(value.asInt());
m = m - (h*60);
sleepHours =h +" h " + m + " m";
Log.i(TAG, "\tField: Sleep duration : " + sleepHours);
}
Log.i("History", "\tField: " + field.getName() +
" Value: " + dp.getValue(field));
}
}
}
可以参考这个documentation on how to read detailed and aggregate data. In the sample code, you need to set a start and end date using a range of 1 week before this moment. cal.add(Calendar.WEEK_OF_YEAR, -1);
. If you want to have only 1 hour, use cal.add(Calendar.HOUR_OF_DAY, -1);
. After you create a DataReadRequest
instance, use the [HistoryApi.readData()
](https://developer.android.com/reference/com/google/android/gms/fitness/HistoryApi.html#readData(com.google.android.gms.common.api.GoogleApiClient,com.google.android.gms.fitness.request.DataReadRequest))方法同步等待或者提供一个回调方法来处理健身历史数据