You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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**接口获取原始活动分段数据:

  1. 指定活动分段的衍生数据源ID:
$dataSourceId = "derived:com.google.activity.segment:com.google.android.gms:merge_activity_segments";
  1. 设置当日时间范围(格式为起始时间-结束时间,单位微秒):
$startTime = strtotime("today") * 1000 * 1000;
$endTime = strtotime("tomorrow") * 1000 * 1000;
$datasetId = "{$startTime}-{$endTime}";
  1. 调用接口获取原始数据:
$rawDataset = $service->users_dataset->get('me', "{$dataSourceId}:{$datasetId}");
  1. 解析每个跑步分段的详细信息:
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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 22:05:42