Я объединяю эти источники данных:
$steps = static::getDataByAggregate('derived:com.google.step_count.delta:com.google.android.gms:estimated_steps', 'com.google.step_count.delta', $period['Start'], $period['End']);
$distance = static::getDataByAggregate('derived:com.google.distance.delta:com.google.android.gms:merge_distance_delta', 'com.google.distance.delta', $period['Start'], $period['End']);
$calories = static::getDataByAggregate('derived:com.google.calories.expended:com.google.android.gms:merge_calories_expended', 'com.google.calories.expended', $period['Start'], $period['End']);
$activeMinutes = static::getDataByAggregate('derived:com.google.active_minutes:com.google.android.gms:merge_active_minutes', 'com.google.active_minutes', $period['Start'], $period['End']);
$aggregates = array_merge($aggregates, static::mergeAggregates([
'steps' => $steps,
'distance' => $distance,
'calories' => $calories,
'activeMinutes' => $activeMinutes,
]));
Таким образом, эта функция запускает фактическое статистическое извлечение.
/**
* Gets aggregated data by date for a given timerange.
*
* @see https://developers.google.com/fit/rest/v1/data-types#data_types_for_aggregate_data
*
* @param string $sourceId
* @param string $dataType
* @param int $start UTC unix timestamp
* @param int $end UTC unix timestamp
* @return array Array with values by data type, the date is the key.
*/
public static function getDataByAggregate($sourceId, $dataType, $start, $end)
{
if (!in_array($sourceId, static::$availableSources)) {
return;
}
$time = new \Google_Service_Fitness_BucketByTime();
$aggregateBy = new \Google_Service_Fitness_AggregateBy();
$bucketByTimePeriod = new \Google_Service_Fitness_BucketByTimePeriod();
$bucketByTimePeriod->setValue(1);
$bucketByTimePeriod->setType('day');
$bucketByTimePeriod->setTimeZoneId(static::$aggregateTimezone);
$time->setPeriod($bucketByTimePeriod);
//$time->setDurationMillis("86400000");
$aggregateBy->setDataTypeName($dataType);
$aggregateBy->setDataSourceId($sourceId);
$rx = new \Google_Service_Fitness_AggregateRequest();
$rx->startTimeMillis = $start / 1000000;
$rx->endTimeMillis = $end / 1000000;
$rx->setAggregateBy([$aggregateBy]);
$rx->setBucketByTime($time);
$aggr = static::users_dataset_aggregate('me', $rx);
$data = [];
$buckets = $aggr->getBucket();
foreach ($buckets as $bucket) {
$dataset = $bucket->getDataset();
foreach ($dataset[0]->getPoint() as $point) {
$value = $point->getValue()[0]->getIntVal();
if ($value === null) {
$value = $point->getValue()[0]->getFpVal();
}
$Segment = [
'Data'=> $value,
'StartTime' => intval($point->startTimeNanos / 1000000 / 1000),
'EndTime' => intval($point->endTimeNanos / 1000000 / 1000),
];
/**
* Apparently the step, distance, and calorie count in the app is pegged to UTC no matter what timezone.
*/
$Start = new DateTime('now', new DateTimeZone('UTC'));
$End = new DateTime('now', new DateTimeZone('UTC'));
$Start->setTimestamp($Segment['StartTime']);
$End->setTimestamp($Segment['EndTime']);
$data[$Start->format('Y-m-d')] = $Segment['Data'];
}
}
return $data;
}
Независимо от того, в какой часовой пояс я положил $bucketByTimePeriod->setTimeZoneId(static::$aggregateTimezone);
Я все ещезастрял, получая те же точные данные.
Данные никогда не совпадают точно, что они показаны на устройстве.Кто-нибудь был в состоянии соответствовать этому отлично?Я думал о том, чтобы собрать эти данные из сегментов деятельности, но я не уверен, что это будет работать правильно.