使用Google Fitness PHP客户端获取跑步总距离及分段详情的技术问询
解决方案
一、获取跑步总距离
要拿到跑步总距离,你需要在聚合请求里新增**com.google.distance.delta**类型的聚合规则,同时通过过滤器限定只统计跑步(活动类型8)相关的距离数据。
修改聚合请求代码,添加距离聚合规则:
// 原有活动分段聚合配置 $aggBySegment = new Google_Service_Fitness_AggregateBy(); $aggBySegment->setDataTypeName("com.google.activity.segment"); // 新增距离聚合配置 $aggByDistance = new Google_Service_Fitness_AggregateBy(); $aggByDistance->setDataTypeName("com.google.distance.delta"); // 添加过滤器,仅保留跑步(活动类型8)的数据 $filter = new Google_Service_Fitness_Filter(); $filter->setDataTypeName("com.google.activity.segment"); $filter->setActivitySegmentFilter(new Google_Service_Fitness_ActivitySegmentFilter([ "activityType" => 8 ])); // 构建完整聚合请求 $aggReq = new Google_Service_Fitness_AggregateRequest(); $aggReq->setAggregateBy([$aggBySegment, $aggByDistance]); $aggReq->setFilter($filter); // 设置当日时间范围(单位:微秒) $aggReq->setStartTimeMillis(strtotime("today") * 1000 * 1000); $aggReq->setEndTimeMillis(strtotime("tomorrow") * 1000 * 1000); // 按天聚合时间桶 $bucketByTime = new Google_Service_Fitness_BucketByTime(); $bucketByTime->setDurationMillis(86400000000); // 1天的微秒数 $aggReq->setBucketByTime($bucketByTime); // 执行请求 $aggregates = $dataSets->aggregate('me', $aggReq);
解析响应计算总距离(单位:米):
$totalDistance = 0; foreach ($aggregates->getBucket() as $bucket) { foreach ($bucket->getDataset() as $dataset) { if ($dataset->getDataType()->getName() === "com.google.distance.delta") { foreach ($dataset->getPoint() as $point) { $totalDistance += $point->getValue()[0]->getFpVal(); } } } } echo "总跑步距离:{$totalDistance} 米";
二、获取跑步分段的详细信息
aggregate接口返回的是聚合后的数据,无法拿到单个分段的起止时间、单段距离等细节。你需要调用**users.dataset.get**接口获取原始活动分段数据:
- 指定活动分段的衍生数据源ID:
$dataSourceId = "derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments";
- 设置当日时间范围(格式为
起始时间-结束时间,单位微秒):
$startTime = strtotime("today") * 1000 * 1000; $endTime = strtotime("tomorrow") * 1000 * 1000; $datasetId = "{$startTime}-{$endTime}";
- 调用接口获取原始数据:
$rawDataset = $service->users_dataset->get('me', "{$dataSourceId}:{$datasetId}");
- 解析每个跑步分段的详细信息:
foreach ($rawDataset->getPoint() as $point) { $activityType = $point->getValue()[0]->getIntVal(); if ($activityType !== 8) continue; // 只处理跑步分段 // 转换时间格式(微秒转可读时间) $segmentStart = date("Y-m-d H:i:s", ($point->getStartTimeNanos() / 1000000000)); $segmentEnd = date("Y-m-d H:i:s", ($point->getEndTimeNanos() / 1000000000)); // 计算分段时长(秒) $duration = ($point->getEndTimeNanos() - $point->getStartTimeNanos()) / 1000000000; echo "跑步分段详情:\n"; echo "起始时间:{$segmentStart}\n"; echo "结束时间:{$segmentEnd}\n"; echo "时长:{$duration} 秒\n"; }
补充说明
- 若上述数据源ID无效,可通过
users.dataSources.list接口获取用户实际可用的数据源列表。 - 若要获取单段跑步的距离,需单独请求距离数据源(
derived:com.google.distance.delta:com.google.android.gms:merge_distance_delta),并根据当前分段的时间范围过滤数据。
内容的提问来源于stack exchange,提问作者Game
相关产品推荐
相关产品推荐

