如何解决以与Google Fit应用相同的方式获取Google Fit历史记录Google Fit自动记录的活动
我正在努力显示与Google Fit应用程序相同的活动历史记录。我的会议做得很好,但是我无法正确掌握自动录制的活动。就像示例中的这两个最重要的步骤一样。
我认为一切都取决于DataReadRequest
的构建方式。我最接近的是:
DataReadRequest.Builder()
.aggregate(DataType.TYPE_ACTIVITY_SEGMENT,DataType.AGGREGATE_ACTIVITY_SUMMARY)
.bucketByActivitySegment(5,TimeUnit.MINUTES)
.setTimeRange(dateFrom.millis,dateTo.millis,TimeUnit.MILLISECONDS)
.build()
有意排除少于5个步行路程。结果相似,但结果略有不同。持续时间和大卡减少约20%。有时候,它真的会变成香蕉,将活动切成小块。我在Google Fit中进行了2次散步,最终在我的应用程序中进行了4次散步,但与Google Fit中的2条步行次数相加了。我试图反编译Google Fit应用程序以“借用”请求安装程序,但该应用程序混淆得很好。 :)
有人做到了吗?
解决方法
我现在在Google Fit服务中没有任何数据可以达到 您需要。
但是,我这样做是为了每次锻炼恢复bpm。
/**
* Returns a List of exercise with time period and their heart rate via callback
*/
public void getHeartRatePerExercise(Date date,ExerciseHeartRateListener exerciseHeartRateListener) {
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
calendar.set(Calendar.MILLISECOND,1);
calendar.set(Calendar.SECOND,1);
calendar.set(Calendar.MINUTE,0);
calendar.set(Calendar.HOUR_OF_DAY,0);
long startTime = calendar.getTimeInMillis();
calendar.set(Calendar.MILLISECOND,0);
calendar.set(Calendar.SECOND,59);
calendar.set(Calendar.MINUTE,59);
calendar.set(Calendar.HOUR_OF_DAY,23);
long endTime = calendar.getTimeInMillis();
DataReadRequest readRequest =
new DataReadRequest.Builder()
.aggregate(DataType.TYPE_HEART_RATE_BPM,DataType.AGGREGATE_HEART_RATE_SUMMARY)
.bucketByActivityType(1,TimeUnit.MINUTES)
.setTimeRange(startTime,endTime,TimeUnit.MILLISECONDS)
.build();
Task<DataReadResponse> readResponse = getHistoryClient(activity,googleSignIn).readData(readRequest);
readResponse.addOnSuccessListener(response -> {
List<Bucket> buckets = response.getBuckets();
List<Workout> workouts = new ArrayList<>();
for (Bucket bucket : buckets) {
String activityName = bucket.getActivity();
Timestamp start = new Timestamp(bucket.getStartTime(TimeUnit.MILLISECONDS));
Timestamp end = new Timestamp(bucket.getEndTime(TimeUnit.MILLISECONDS));
if (!(activityName.equals("still") || activityName.equals("unknown"))) {
List<DataSet> dataSets = bucket.getDataSets();
for (DataSet dataSet : dataSets) {
for (DataPoint dataPoint : dataSet.getDataPoints()) {
float min = dataPoint.getValue(Field.FIELD_MIN).asFloat();
float max = dataPoint.getValue(Field.FIELD_MAX).asFloat();
float avg = dataPoint.getValue(Field.FIELD_AVERAGE).asFloat();
HeartRate hr = new HeartRate(min,max,avg);
Workout workout = new Workout(activityName,start,end,hr);
workouts.add(workout);
}
}
}
}
exerciseHeartRateListener.getHR(workouts);
}).addOnFailureListener(response -> {
exerciseHeartRateListener.getHR(new ArrayList<>());
});
}
HeartRate
public class HeartRate {
private float min;
private float max;
private float avg;
public HeartRate(float min,float max,float avg) {
this.min = min;
this.max = max;
this.avg = avg;
}
public float getMin() {
return min;
}
public float getMax() {
return max;
}
public float getAvg() {
return avg;
}
}
锻炼
public class Workout {
private String name;
private Timestamp start;
private Timestamp end;
private HeartRate heartRate;
public Workout(String name,Timestamp start,Timestamp end,HeartRate heartRate) {
this.name = name;
this.start = start;
this.end = end;
this.heartRate = heartRate;
}
public String getName() {
return name;
}
public Timestamp getStart() {
return start;
}
public Timestamp getEnd() {
return end;
}
public HeartRate getHeartRate() {
return heartRate;
}
}
接口:
public interface ExerciseHeartRateListener {
void getHR(List<Workout> workouts);
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。