Google Fit REST API的Java客户端库示例(不是Android API!)

Google Fit REST API的Java客户端库示例(不是Android API!),java,google-fit,Java,Google Fit,我想用GoogleFit编写一个java程序。(它不是Android应用程序,所以我不能使用Android API。) 似乎有一个-所以我想这很容易 但是,我找不到任何示例/示例来解释如何使用客户机库(仅此示例) 我找到了一些关于如何使用Android API的例子——例如。但是完全不同,所以没用 对于我使用过的其他Google API,客户端库附带了一些示例。。。在这种情况下并非如此 有什么想法吗?谢谢。restapi=JSON格式的数据作为对您请求的响应发送 import org.jso

我想用GoogleFit编写一个java程序。(它不是Android应用程序,所以我不能使用Android API。)

似乎有一个-所以我想这很容易

但是,我找不到任何示例/示例来解释如何使用客户机库(仅此示例)

我找到了一些关于如何使用Android API的例子——例如。但是完全不同,所以没用

对于我使用过的其他Google API,客户端库附带了一些示例。。。在这种情况下并非如此


有什么想法吗?谢谢。

restapi=JSON格式的数据作为对您请求的响应发送

  import org.json.JSONArray;
  import org.json.JSONException;
  import org.json.JSONObject;

   /* this stuff above is maven stuff, so I assume if you use javax.json from https://docs.oracle.com/javaee/7/api/javax/json/package-summary.html
   it should do the same thing. */

  import java.io.BufferedReader;
  import java.io.InputStreamReader;
  import java.net.HttpURLConnection;
  import java.net.URL;

     final String url = "http://www.someURLThatTheServerWillReponseTo/?someParams";    
     Integer result = 0;
        HttpURLConnection urlConnection;
        try {
            URL url = new URL(params[0]);
            urlConnection = (HttpURLConnection) url.openConnection();
            int statusCode = urlConnection.getResponseCode();

            // 200 represents HTTP OK
            if (statusCode == 200) {
                BufferedReader r = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
                StringBuilder response = new StringBuilder();
                String line;
                while ((line = r.readLine()) != null) {
                    response.append(line);
                }
                parseResult(response.toString());
                result = 1; // Successful
            } else {
                result = 0; //"Failed to fetch data!";
            }
        } catch (Exception e) {
            Log.d(TAG, e.getLocalizedMessage());
        }
        return result; //"Failed to fetch data!";

 private void parseResult(String result) {
    try {
        JSONObject response = new JSONObject(result);
        JSONArray data = response.optJSONArray("dataReturned");

        //Here is where you decided on what to do with the data that is returned
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

通过拼凑RESTAPI中的一些信息,并使用我自己使用其他Google API Java客户端库的一些示例,我已经能够或多或少地使它工作。。。以下是一些代码片段:

import com.google.api.client.googleapis.auth.oauth2.GoogleCredential;
import com.google.api.services.fitness.Fitness;
import com.google.api.services.fitness.model.*;
获取谷歌认证-此库是

使用刚刚创建的
credential
创建作为所有呼叫基础的服务

Fitness service = new Fitness.Builder(
                           HTTP_TRANSPORT, 
                           JSON_FACTORY, 
                           credential)
                           .setApplicationName(APPLICATION_NAME)
                           .build();
为应用程序/设备创建一个或多个数据源

DataSource content = new DataSource()
                            .setApplication(YOUR_APPLICATION)
                            .setType(DATA_SOURCE_RAW)
                            .setName(name)
                            .setDataType(dataType);

Fitness.Users.DataSources.Create request = 
         service.users().dataSources().create("me", content);

DataSource ds = request.execute();
这是创建自己的
数据源时需要使用的
数据类型的一个示例。。。这是使用谷歌公开的标准公共度量(在本例中为steps)。。。看


您仍然需要创建一个
会话
和一个段活动
数据集
。。。但这些都遵循类似的结构。

我必须找到一种方法,使用您描述的库从Google Fit检索今天的步骤总数,或者更准确地说,我使用了:

<dependency>
    <groupId>com.google.apis</groupId>
    <artifactId>google-api-services-fitness</artifactId>
    <version>v1-rev22-1.22.0</version>
</dependency>
现在,为了获得步骤,我首先必须初始化健身服务:

Fitness fitness = new Fitness.Builder(
                Utils.getDefaultTransport(),
                Utils.getDefaultJsonFactory(),
                credential //prerequisite
        ).build();
之后,我需要获得一组聚合的数据。我希望这些步骤来自于在GoogleFit中同步步骤的所有来源,所以我使用了一个已经存在的数据源

下面是我如何创建数据集请求的

AggregateRequest aggregateRequest = new AggregateRequest();
        aggregateRequest.setAggregateBy(Collections.singletonList(
                new AggregateBy()
                        .setDataSourceId("derived:com.google.step_count.delta:com.google.android.gms:estimated_steps")));
        aggregateRequest.setStartTimeMillis(DateMidnight.now().getMillis());
        aggregateRequest.setEndTimeMillis(DateTime.now().getMillis());
我使用的数据源id将带来从连接到GoogleFit帐户的所有源同步的整个步骤。在给定的时间段内。(它将始终带来所有步骤-与以前的测量值没有增量)

您还可以创建自己的数据源,但这是一个完全不同的故事;检查一下

注:DateMidnightDateTime是joda图书馆提供的课程

创建AgegateRequest后,可以执行并解析它

贝娄是我如何计算步骤之和的一个例子

AggregateResponse response = request.execute();

for (AggregateBucket aggregateBucket : response.getBucket()) {
    for (Dataset dataset : aggregateBucket.getDataset()) {
        for (DataPoint dataPoint : dataset.getPoint()) {
            for (Value value : dataPoint.getValue()) {
                if (value.getIntVal() != null) {
                    sum += value.getIntVal(); //for steps you only receive int values
                }
            }
        }
    }
}
要访问此信息,您至少需要找到一个作用域


我用过

谢谢,但这根本不能回答问题。。。我问的是关于GoogleFitness API的具体问题,而不是关于如何发出HTTP请求和处理响应的一般问题。这很简单,让用户登录谷歌帐户。使用OAuth2.0进程进行授权。获得访问令牌后,您可以代表用户发出REST请求。
import com.google.api.services.fitness.Fitness;
import com.google.api.services.fitness.model.*;
import com.google.api.client.googleapis.util.Utils;
Fitness fitness = new Fitness.Builder(
                Utils.getDefaultTransport(),
                Utils.getDefaultJsonFactory(),
                credential //prerequisite
        ).build();
AggregateRequest aggregateRequest = new AggregateRequest();
        aggregateRequest.setAggregateBy(Collections.singletonList(
                new AggregateBy()
                        .setDataSourceId("derived:com.google.step_count.delta:com.google.android.gms:estimated_steps")));
        aggregateRequest.setStartTimeMillis(DateMidnight.now().getMillis());
        aggregateRequest.setEndTimeMillis(DateTime.now().getMillis());
AggregateResponse response = request.execute();

for (AggregateBucket aggregateBucket : response.getBucket()) {
    for (Dataset dataset : aggregateBucket.getDataset()) {
        for (DataPoint dataPoint : dataset.getPoint()) {
            for (Value value : dataPoint.getValue()) {
                if (value.getIntVal() != null) {
                    sum += value.getIntVal(); //for steps you only receive int values
                }
            }
        }
    }
}