Java Google Fit REST API 的客户端库示例(不是 Android API!)
Examples for Java Client Library for Google Fit REST API (not Android API!)
我想使用 Google Fit REST API 编写一个 java 程序。 (它不是 Android 应用程序,所以我无法使用 Android API。)
似乎有一个 Java Client library for the REST API - 所以我认为这很容易。
但是,我找不到任何解释如何使用客户端库的 samples/examples(只有 javadoc)。
我找到了有关如何使用 Android API 的示例 - 例如this。但是完全不一样,所以没用。
对于我使用过的其他 Google API,客户端库附带示例...在这种情况下并非如此。
有什么想法吗?谢谢。
REST API = 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();
}
}
通过拼凑来自 javadoc, the REST API documentation 的一些信息,并使用我自己使用其他 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.*;
获取 Google 凭据 - 这个库是 well documented...
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
...
.build();
使用刚刚创建的 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();
这是您在创建自己的 DataSource
时需要使用的 dataType
示例...这是使用标准 public 指标(在本例中Google 公开的步骤)...请参阅 this。
private static final String DT_STEPS = "com.google.step_count.delta";
private static final DataTypeField FIELD_STEPS = new
DataTypeField().setName("steps").setFormat(FORMAT_INTEGER);
private static final List<DataTypeField> STEPS_FIELDS = Arrays.asList(
FIELD_STEPS);
public static final DataType DATA_TYPE_STEPS =
new DataType()
.setName(DT_STEPS)
.setField(STEPS_FIELDS);
现在创建 DataType
的实际数据点,使用 DataSource
- 在 DataSet
...
Value value = new Value().setIntVal(Integer.valueOf(steps));
List<Value> values = Arrays.asList(value);
DataPoint point = new DataPoint()
.setValue(values)
.setDataTypeName(DT_STEPS)
.setStartTimeNanos(startNS)
.setEndTimeNanos(endNS);
List<DataPoint> dataPoints = Arrays.asList(point);
String datasetId = startNS + "-" endNS;
Dataset content = new Dataset()
.setDataSourceId(dataSourceId)
.setPoint(dataPoints)
.setMinStartTimeNs(startNS)
.setMaxEndTimeNs(endNS);
Fitness.Users.DataSources.Datasets.Patch request =
service.users().dataSources().datasets().patch(
"me",
dataSourceId,
datasetId,
content);
Dataset ds = request.execute();
您仍然需要创建一个 Session
和一个段 Activity DataSet
...但它们遵循相似的结构。
我必须找到一种方法从 Google Fit 中检索今天的总步数,使用您描述的库,或者更准确地说,我使用了:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-fitness</artifactId>
<version>v1-rev22-1.22.0</version>
</dependency>
通过首先阅读官方 Google 数据集处理指南 here 和大量的尝试和错误,我终于设法创建了一个如何检索今天所有步骤的示例.
*注意:作为先决条件,您必须获得用户的访问权限。为此,您可以使用相同的库来获取 Credential 对象。这是描述 here *
您需要导入以下内容:
import com.google.api.services.fitness.Fitness;
import com.google.api.services.fitness.model.*;
import com.google.api.client.googleapis.util.Utils;
现在,要获取步数,我首先必须初始化 Fitness 服务:
Fitness fitness = new Fitness.Builder(
Utils.getDefaultTransport(),
Utils.getDefaultJsonFactory(),
credential //prerequisite
).build();
之后,我需要获取一组聚合数据。我希望这些步骤来自所有在 Google Fit 中同步步骤的来源,所以我为此使用了一个已经存在的数据源。
下面是我创建数据集请求的方式。
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 将带来从连接到 Google Fit 帐户的所有源同步的整个步骤。在给定的时间段内。 (它将始终带来所有步骤 - 与之前的测量没有差异)。
您也可以创建自己的数据源,但那是完全不同的事情;检查 。
注:DateMidnight和DateTime是joda库提供的类
创建 AgregateRequest 后,您可以执行并解析它。
下面是我如何计算步骤总和的一个例子。
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
}
}
}
}
}
为了访问此信息,您至少需要找到一个范围 here。
我想使用 Google Fit REST API 编写一个 java 程序。 (它不是 Android 应用程序,所以我无法使用 Android API。)
似乎有一个 Java Client library for the REST API - 所以我认为这很容易。
但是,我找不到任何解释如何使用客户端库的 samples/examples(只有 javadoc)。
我找到了有关如何使用 Android API 的示例 - 例如this。但是完全不一样,所以没用。
对于我使用过的其他 Google API,客户端库附带示例...在这种情况下并非如此。
有什么想法吗?谢谢。
REST API = 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();
}
}
通过拼凑来自 javadoc, the REST API documentation 的一些信息,并使用我自己使用其他 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.*;
获取 Google 凭据 - 这个库是 well documented...
GoogleCredential credential = new GoogleCredential.Builder()
.setTransport(HTTP_TRANSPORT)
.setJsonFactory(JSON_FACTORY)
...
.build();
使用刚刚创建的 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();
这是您在创建自己的 DataSource
时需要使用的 dataType
示例...这是使用标准 public 指标(在本例中Google 公开的步骤)...请参阅 this。
private static final String DT_STEPS = "com.google.step_count.delta";
private static final DataTypeField FIELD_STEPS = new
DataTypeField().setName("steps").setFormat(FORMAT_INTEGER);
private static final List<DataTypeField> STEPS_FIELDS = Arrays.asList(
FIELD_STEPS);
public static final DataType DATA_TYPE_STEPS =
new DataType()
.setName(DT_STEPS)
.setField(STEPS_FIELDS);
现在创建 DataType
的实际数据点,使用 DataSource
- 在 DataSet
...
Value value = new Value().setIntVal(Integer.valueOf(steps));
List<Value> values = Arrays.asList(value);
DataPoint point = new DataPoint()
.setValue(values)
.setDataTypeName(DT_STEPS)
.setStartTimeNanos(startNS)
.setEndTimeNanos(endNS);
List<DataPoint> dataPoints = Arrays.asList(point);
String datasetId = startNS + "-" endNS;
Dataset content = new Dataset()
.setDataSourceId(dataSourceId)
.setPoint(dataPoints)
.setMinStartTimeNs(startNS)
.setMaxEndTimeNs(endNS);
Fitness.Users.DataSources.Datasets.Patch request =
service.users().dataSources().datasets().patch(
"me",
dataSourceId,
datasetId,
content);
Dataset ds = request.execute();
您仍然需要创建一个 Session
和一个段 Activity DataSet
...但它们遵循相似的结构。
我必须找到一种方法从 Google Fit 中检索今天的总步数,使用您描述的库,或者更准确地说,我使用了:
<dependency>
<groupId>com.google.apis</groupId>
<artifactId>google-api-services-fitness</artifactId>
<version>v1-rev22-1.22.0</version>
</dependency>
通过首先阅读官方 Google 数据集处理指南 here 和大量的尝试和错误,我终于设法创建了一个如何检索今天所有步骤的示例.
*注意:作为先决条件,您必须获得用户的访问权限。为此,您可以使用相同的库来获取 Credential 对象。这是描述 here *
您需要导入以下内容:
import com.google.api.services.fitness.Fitness;
import com.google.api.services.fitness.model.*;
import com.google.api.client.googleapis.util.Utils;
现在,要获取步数,我首先必须初始化 Fitness 服务:
Fitness fitness = new Fitness.Builder(
Utils.getDefaultTransport(),
Utils.getDefaultJsonFactory(),
credential //prerequisite
).build();
之后,我需要获取一组聚合数据。我希望这些步骤来自所有在 Google Fit 中同步步骤的来源,所以我为此使用了一个已经存在的数据源。
下面是我创建数据集请求的方式。
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 将带来从连接到 Google Fit 帐户的所有源同步的整个步骤。在给定的时间段内。 (它将始终带来所有步骤 - 与之前的测量没有差异)。
您也可以创建自己的数据源,但那是完全不同的事情;检查
注:DateMidnight和DateTime是joda库提供的类
创建 AgregateRequest 后,您可以执行并解析它。
下面是我如何计算步骤总和的一个例子。
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
}
}
}
}
}
为了访问此信息,您至少需要找到一个范围 here。