如何在php中使用Google Fit api获取步骤计数? [英] How to get steps count with Google Fit api in php ?

查看:81
本文介绍了如何在php中使用Google Fit api获取步骤计数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我遇到了 Google Api Php客户端 Google Fit 的问题.

我想获得一天完成的步骤总数.

我找到了回应,但它不起作用(请看要点).

I found a response but it doesn't work (look at the gist).

我的php代码:

// Retrive oauth data
$clientData = json_decode(file_get_contents("../Devbook-87e2bafd84e6.json")); 
$client_email = $clientData->client_email;
$private_key = $clientData->private_key;
$scopes = array(Google_Service_Fitness::FITNESS_ACTIVITY_READ);
$credentials = new Google_Auth_AssertionCredentials(
     $client_email,
     $scopes,
     $private_key
);

$client = new Google_Client();
$client->setState('offline');
$client->setRedirectUri('urn:ietf:wg:oauth:2.0:oob');  // Used in hybrid flows
$client->setAssertionCredentials($credentials);
if ($client->getAuth()->isAccessTokenExpired()) {
     $client->getAuth()->refreshTokenWithAssertion();
}

$fitness_service = new Google_Service_Fitness($client);

$dataSources = $fitness_service->users_dataSources;
$dataSets = $fitness_service->users_dataSources_datasets;

$listDataSources = $dataSources->listUsersDataSources("me");

$timezone = "GMT+0100";
$today = date("Y-m-d");
$endTime = strtotime($today.' 00:00:00 '.$timezone);
$startTime = strtotime('-1 day', $endTime);

while($listDataSources->valid()) {
     $dataSourceItem = $listDataSources->next();
     if ($dataSourceItem['dataType']['name'] == "com.google.step_count.delta") {
            $dataStreamId = $dataSourceItem['dataStreamId'];
            $listDatasets = $dataSets->get("me", $dataStreamId, $startTime.'000000000'.'-'.$endTime.'000000000');

            $step_count = 0;
            while($listDatasets->valid()) {
                $dataSet = $listDatasets->next();
                $dataSetValues = $dataSet['value'];

                if ($dataSetValues && is_array($dataSetValues)) {
                   foreach($dataSetValues as $dataSetValue) {
                       $step_count += $dataSetValue['intVal'];
                   }
                }
            }
            print("STEP: ".$step_count."<br />");
     };
 }

这里的问题是它没有在第一个while循环中输入: $ listDataSources-> valid() 返回总是 false

The problem here is it didn't enter in the first while loop : $listDataSources->valid() returns always false.

我的问题:为什么它返回false?以及如何获取步骤?

我试图在Oauth游乐场( https://www.googleapis.com/fitness/v1/users/me/dataSources/derived:com.google.step_count.delta:com.google.android.gms:estimated_steps ),但我没有任何数据.

I tried to retrieve data with the Oauth Playground (https://www.googleapis.com/fitness/v1/users/me/dataSources/derived:com.google.step_count.delta:com.google.android.gms:estimated_steps) but I didn't get any data.

我明白了:

{
    "dataType": {
         "field": [{
               "name": "steps", 
               "format": "integer"
         }], 
         "name": "com.google.step_count.delta"
    }, 
    "application": {
         "packageName": "com.google.android.gms", 
         "version": ""
    }, 
    "dataStreamId": "derived:com.google.step_count.delta:com.google.android.gms:estimated_steps", 
    "type": "derived", 
    "dataStreamName": "estimated_steps"
}

推荐答案

第一件事:您正在使用的设备上是否有任何数据?我犯了一个错误:尝试从完全没有Google Fit数据的帐户中获取数据.请不要重复我的错误.

First things first: Do you have any data at all on the device that you're using? I've made that mistake: try to get data from an account with no Google Fit data at all. Don't repeat my mistake, please.

我使用了与您相同的示例,它对我有用.唯一的区别是我对客户端API进行了硬编码,如下所示:

I used the same example as you and it worked for me. The only difference is that I hard coded my client API, like this:

$APIKey = '1231231231231231231231231231123123';
$client_id = '12312312312-dkoasodiajsdaosdjh12h1kjakdahs.apps.googleusercontent.com';
$client_secret = '123123123-1231231-123123123';
$redirect_uri = 'http://localhost/fit/code.php';

也许您的凭证有问题.您开始会议了吗?在上面的代码之后添加 session_start().

Maybe you're having problems with your credentials. Did you start your session? Add a session_start() after the code above.

以下代码对我有用.对其进行调整,希望对您有所帮助.

The code below is working for me. Adapt it and I hope it helps you.

<?php
/*
 * This code is an adaptation of Google API URL Shortener example from Google PHP API github.
 * This was modified to work with Google Fit.
 * This example will count steps from a logged in user.
 */

// I created an Autoloader to load Google API classes
require_once(__DIR__ . '/Autoloader.php');

$APIKey = '1231231231231231231231231231123123';
$client_id = '12312312312-dkoasodiajsdaosdjh12h1kjakdahs.apps.googleusercontent.com';
$client_secret = '123123123-1231231-123123123';
$redirect_uri = 'http://localhost/fit/code.php';

//This template is nothing but some HTML. You can find it on github Google API example. 
include_once "templates/base.php";

//Start your session.
session_start();

$client = new Google_Client();
$client->setApplicationName('google-fit');
$client->setAccessType('online');
$client->setApprovalPrompt("auto");
$client->setClientId($client_id);
$client->setClientSecret($client_secret);
$client->setRedirectUri($redirect_uri);

$client->addScope(Google_Service_Fitness::FITNESS_ACTIVITY_READ);
$service = new Google_Service_Fitness($client);

/************************************************
If we're logging out we just need to clear our
local access token in this case
 ************************************************/
if (isset($_REQUEST['logout'])) {
    unset($_SESSION['access_token']);
}
/************************************************
If we have a code back from the OAuth 2.0 flow,
we need to exchange that with the authenticate()
function. We store the resultant access token
bundle in the session, and redirect to ourself.
 ************************************************/
if (isset($_GET['code'])) {
    $client->authenticate($_GET['code']);
    $_SESSION['access_token'] = $client->getAccessToken();
    $redirect = 'http://' . $_SERVER['HTTP_HOST'] . $_SERVER['PHP_SELF'];
    header('Location: ' . filter_var($redirect, FILTER_SANITIZE_URL));
    echo "EXCHANGE";
}
/************************************************
If we have an access token, we can make
requests, else we generate an authentication URL.
 ************************************************/
if (isset($_SESSION['access_token']) && $_SESSION['access_token']) {
    $client->setAccessToken($_SESSION['access_token']);
    echo "GOT IT";
    echo "<pre>";

    // Same code as yours
    $dataSources = $service->users_dataSources;
    $dataSets = $service->users_dataSources_datasets;

    $listDataSources = $dataSources->listUsersDataSources("me");

    $timezone = "GMT+0100";
    $today = date("Y-m-d");
    $endTime = strtotime($today.' 00:00:00 '.$timezone);
    $startTime = strtotime('-1 day', $endTime);

    while($listDataSources->valid()) {
        $dataSourceItem = $listDataSources->next();
        if ($dataSourceItem['dataType']['name'] == "com.google.step_count.delta") {
            $dataStreamId = $dataSourceItem['dataStreamId'];
            $listDatasets = $dataSets->get("me", $dataStreamId, $startTime.'000000000'.'-'.$endTime.'000000000');

            $step_count = 0;
            while($listDatasets->valid()) {
                $dataSet = $listDatasets->next();
                $dataSetValues = $dataSet['value'];

                if ($dataSetValues && is_array($dataSetValues)) {
                    foreach($dataSetValues as $dataSetValue) {
                        $step_count += $dataSetValue['intVal'];
                    }
                }
            }
            print("STEP: ".$step_count."<br />");
        };
    }
    echo "</pre>";
} else {
    $authUrl = $client->createAuthUrl();
}

/************************************************
If we're signed in and have a request to shorten
a URL, then we create a new URL object, set the
unshortened URL, and call the 'insert' method on
the 'url' resource. Note that we re-store the
access_token bundle, just in case anything
changed during the request - the main thing that
might happen here is the access token itself is
refreshed if the application has offline access.
 ************************************************/
if ($client->getAccessToken() && isset($_GET['url'])) {
    $_SESSION['access_token'] = $client->getAccessToken();
}

//Dumb example. You don't have to use the code below.
echo pageHeader("User Query - URL Shortener");
if (strpos($client_id, "googleusercontent") == false) {
    echo missingClientSecretsWarning();
    exit;
}
?>
<div class="box">
    <div class="request">
        <?php
        if (isset($authUrl)) {
            echo "<a class='login' href='" . $authUrl . "'>Connect Me!</a>";
        } else {
            echo <<<END
    <form id="url" method="GET" action="{$_SERVER['PHP_SELF']}">
      <input name="url" class="url" type="text">
      <input type="submit" value="Shorten">
    </form>
    <a class='logout' href='?logout'>Logout</a>
END;
        }
        ?>
    </div>

    <div class="shortened">
        <?php
        if (isset($short)) {
            var_dump($short);
        }
        ?>
    </div>
</div>

这篇关于如何在php中使用Google Fit api获取步骤计数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆