将点保存到Google Fitness API(fitness.body.write)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了将点保存到Google Fitness API(fitness.body.write)相关的知识,希望对你有一定的参考价值。
我试图将浮点值的点保存到fitness.body
。获得价值不是问题,而保存新点导致403. No permission to modify data for this source.
我使用DataSetId derived:com.google.weight:com.google.android.gms:merge_weight
来查找点和读取值,并使用raw:com.google.weight:com.google.android.apps.fitness:user_input
来插入数据。
.
这是一个使用Ruby和google-api-ruby-client
的工作流程:
require 'google/api_client'
require 'google/api_client/client_secrets'
require 'google/api_client/auth/installed_app'
require 'pry'
# Initialize the client.
client = Google::APIClient.new(
:application_name => 'Example Ruby application',
:application_version => '1.0.0'
)
fitness = client.discovered_api('fitness')
# Load client secrets from your client_secrets.json.
client_secrets = Google::APIClient::ClientSecrets.load
flow = Google::APIClient::InstalledAppFlow.new(
:client_id => client_secrets.client_id,
:client_secret => client_secrets.client_secret,
:scope => ['https://www.googleapis.com/auth/fitness.body.write',
'https://www.googleapis.com/auth/fitness.activity.write',
'https://www.googleapis.com/auth/fitness.location.write']
)
client.authorization = flow.authorize
形成我的新数据点:
dataSourceId = 'raw:com.google.weight:com.google.android.apps.fitness:user_input'
startTime = (Time.now-1).to_i # 1 Second ago
endTime = (Time.now).to_i
metadata = {
dataSourceId: dataSourceId,
maxEndTimeNs: "#{startTime}000000000", # Faking nanoseconds with tailing zeros
minStartTimeNs: "#{endTime}000000000",
point: [
{
endTimeNanos: "#{endTime}000000000",
startTimeNanos: "#{startTime}000000000",
value: [
{ fpVal: 80 }
]
}
]
}
试图保存这一点:
result = client.execute(
:api_method => fitness.users.data_sources.datasets.patch,
:body_object => metadata,
:parameters => {
'userId' => "me",
'dataSourceId' => dataSourceId,
'datasetId' => "#{Time.now.to_i-1}000000000-#{(Time.now).to_i}000000000"
}
)
正如我之前所说,我得到了403. No permission to modify data for this source
#<Google::APIClient::Schema::Fitness::V1::Dataset:0x3fe78c258f60 DATA:{"error"=>{"er
rors"=>[{"domain"=>"global", "reason"=>"forbidden", "message"=>"No permission to modif
y data for this source."}], "code"=>403, "message"=>"No permission to modify data for
this source."}}>
我相信,我在范围内选择了所有必需的权限。我尝试将该点提交给fitness.body的可访问数据集。
如果我在这里做错了,请告诉我。
谢谢!
尝试添加Authorization标头:
result = client.execute(
:api_method => fitness.users.data_sources.datasets.patch,
:headers => {'Authorization' => 'Bearer YOUR_AUTH_TOKEN'},
:body_object => metadata,
:parameters => {
'userId' => "me",
'dataSourceId' => dataSourceId,
'datasetId' => "#{Time.now.to_i-1}000000000-#{(Time.now).to_i}000000000"
}
)
我遇到了同样的情况,事实证明你不能直接将数据点插入数据源“raw:com.google.weight:com.google.android.apps.fitness:user_input”。从名称中可以猜出这个数据源是保留的。因此,解决方法是添加您自己的数据源,请注意dataType.name =“com.google.weight”,如下所示:
{
"dataStreamName": "xxxx.body.weight",
"dataType": {
"field": [
{
"name": "weight",
"format": "floatPoint"
}
],
"name": "com.google.weight"
},
"dataQualityStandard": [],
"application": {
"version": "1",
"name": "Foo Example App",
"detailsUrl": "http://example.com"
},
"device": {
"model": "xxxmodel",
"version": "1",
"type": "scale",
"uid": "xxx@yyy",
"manufacturer": "xxxxManufacturer"
},
"type": "derived"
}
然后在成功创建之后,您可以使用此数据源(datastream id)插入您自己的数据点,然后插入的数据点也将包含在数据源“derived:com.google.weight:com.google.android”中。 gms:merge_weight“当您使用后缀”dataPointChanges“进行查询时。
以上是关于将点保存到Google Fitness API(fitness.body.write)的主要内容,如果未能解决你的问题,请参考以下文章
如何从Google Fitness REST API检索步数数据?