Google fit在Android上一小时内获取运动数据
我目前正在开发一个与健身数据相关的Android应用程序,对于该应用程序,我需要获得步数、心率、,睡眠时间和运动数据。我需要每小时获取数据,所以我使用bucketByTime作为1小时,使用AGGREGATE_ACTIVITY_SUMMARY获取1小时内所有活动的活动摘要数据。我也可以从中筛选运动数据,但这不实用,因为API中列出了太多的运动类型。我正在寻找替代解决方案Google fit在Android上一小时内获取运动数据,android,google-fit,google-fit-sdk,Android,Google Fit,Google Fit Sdk,我目前正在开发一个与健身数据相关的Android应用程序,对于该应用程序,我需要获得步数、心率、,睡眠时间和运动数据。我需要每小时获取数据,所以我使用bucketByTime作为1小时,使用AGGREGATE_ACTIVITY_SUMMARY获取1小时内所有活动的活动摘要数据。我也可以从中筛选运动数据,但这不实用,因为API中列出了太多的运动类型。我正在寻找替代解决方案 DataReadRequest readRequest = new DataReadRequest.Build
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));
}
}
}
DataReadRequest=newdatareadrequest.Builder()
.aggregate(数据类型.TYPE\u步骤\u计数\u增量,
数据类型。聚合(步骤计数增量)
.aggregate(数据类型.TYPE\u心率\u BPM,数据类型.aggregate\u心率\u摘要)
.aggregate(数据类型.TYPE\u活动\u段,数据类型.aggregate\u活动\u摘要)
.bucketByTime(1,时间单位:小时)
.setTimeRange(开始时间、结束时间、时间单位.毫秒)
.build();
DataReadResult DataReadResult=Fitness.HistoryApi.readData(mClient,readRequest).wait(1,TimeUnit.MINUTES);
//用于聚合数据
如果(dataReadResult.GetBucket().size()>0){
Log.i(“历史记录”,“存储桶数:”+dataReadResult.GetBucket().size());
for(Bucket:dataReadResult.getbucket()){
List dataSets=bucket.getDataSets();
用于(数据集:数据集){
showDataSet(数据集);
}
}
}
返回null;
}
}
私有void readData(){
新建VerifyDataTask().execute();
}
@凌驾
公共布尔onCreateOptions菜单(菜单){
//为主管道充气;如果存在,则会将项目添加到操作栏中。
getMenuInflater().充气(R.menu.main,menu);
返回true;
}
私有void showDataSet(数据集){
Log.e(“历史记录”,“为数据类型返回的数据:”+dataSet.getDataType().getName());
DateFormat DateFormat=DateFormat.getDateInstance();
DateFormat timeFormat=DateFormat.getTimeInstance();
字符串sleepHours=“0”;
对于(DataPoint dp:dataSet.getDataPoints()){
Log.i(“历史”,“数据点:”);
Log.i(“历史记录”,“\t类型:”+dp.getDataType().getName());
Log.i(“History”,“\t开始:”+dateFormat.format(dp.getStartTime(TimeUnit.ms))+“+timeFormat.format(dp.getStartTime(TimeUnit.ms)));
Log.i(“History”、“\trend:”+dateFormat.format(dp.getEndTime(TimeUnit.millides))+“+timeFormat.format(dp.getStartTime(TimeUnit.millides)));
for(字段:dp.getDataType().getFields()){
if(dp.getOriginalDataSource().getAppPackageName().toString()包含(“睡眠”)和&field.getName()包含(“持续时间”){
值=dp.getValue(字段);
long h=时间单位.millides.toHours(value.asInt());
long m=TimeUnit.millides.toMinutes(value.asInt());
m=m-(h*60);
睡眠时间=h+“h”+m+“m”;
Log.i(标记“\t字段:睡眠持续时间:”+睡眠时间);
}
Log.i(“历史记录”,“\t字段:”+field.getName()+
“值:”+dp.getValue(字段));
}
}
}
关于如何读取详细数据和聚合数据,您可以参考本手册。在示例代码中,您需要在此时刻之前使用1周的范围设置开始和结束日期<代码>计算添加(日历周,每年,-1)代码>。如果您希望只有1小时,请使用cal.add(Calendar.hour\u OF_DAY,-1)代码>。创建实例后,使用[HistoryApi.readData()
](,com.google.android.gms.fitness.request.DataReadRequest))方法并同步等待或提供回调方法来处理健身历史记录中的数据