将数据插入 google 适合失败:UNKNOWN_AUTH_ERROR/NEEDS_OAUTH_PERMISSIONS
Insert data into google fit failing: UNKNOWN_AUTH_ERROR/NEEDS_OAUTH_PERMISSIONS
我有以下使用历史插入水化数据的代码 Api,
public void addHydrationData(int waterVolume){
Calendar cal = Calendar.getInstance();
long endTime = cal.getTimeInMillis();
cal.add(Calendar.MINUTE, -1);
long startTime = cal.getTimeInMillis();
float volume = (float)waterVolume/1000f;
S.L("V F: " + volume + "wv: " + waterVolume);
final DataSet hydrationDataSet = createDataForRequest(DataType.TYPE_HYDRATION, DataSource.TYPE_RAW,
volume, startTime, endTime, TimeUnit.MINUTES);
Thread thread = new Thread(new Runnable() {
public void run() {
S.L("gac isconn: " + googleApiClient.isConnected());
S.L("gac gcr: " + googleApiClient.getConnectionResult(Fitness.HISTORY_API));
Status waterInsertStatus = Fitness.HistoryApi.insertData(googleApiClient, hydrationDataSet).await(1, TimeUnit.MINUTES);
if(!waterInsertStatus.isSuccess()){
S.L("There was a problem inserting the dataset.");
S.L("WIS: " + waterInsertStatus.getStatusCode());
if (waterInsertStatus.getStatusCode() == FitnessStatusCodes.NEEDS_OAUTH_PERMISSIONS ||
waterInsertStatus.getStatusCode() == FitnessStatusCodes.UNKNOWN_AUTH_ERROR) {
try {
S.L("Need oauth");
waterInsertStatus.startResolutionForResult(MainActivity.this, S.REQUEST_OAUTH);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
S.L("SIE");
}
} else{
}
} else {
S.L("Successfully added data");
}
}
});
thread.start();
}
这是我得到的输出:
08-19 14:51:36.423 4594-4594/in.jiyofit.gfit D/CCC: V F: 0.25wv: 250
08-19 14:51:36.454 4594-5585/in.jiyofit.gfit D/CCC: gac isconn: true
08-19 14:51:36.454 4594-5585/in.jiyofit.gfit D/CCC: gac gcr: ConnectionResult{statusCode=SUCCESS, resolution=null, message=null}
08-19 14:51:36.928 4594-5585/in.jiyofit.gfit D/CCC: There was a problem inserting the dataset.
08-19 14:51:36.928 4594-5585/in.jiyofit.gfit D/CCC: WIS: 5005
08-19 14:51:36.929 4594-5585/in.jiyofit.gfit D/CCC: Need oauth
之前我得到的状态代码是 5000,现在我得到的是 5005。两者都必须按照 Google
所建议的以下方式解决
Status code denotes that the request is missing desired OAuth permissions.
If an app does not have the required OAuth access for a specific API request, the request will fail with this status code. When this occurs, apps can use the pending intent inside the status object to request the necessary access before retrying the request.
Sample usage when access is missing for a request:
PendingResult<Result> pendingResult = FitnessApi.readData(fitnessRequest);
Result result = pendingResult.await(3L, TimeUnit.SECONDS);
Status = result.getStatus();
if (!status.isSuccess()) {
if (status.getStatusCode() == FitnessStatusCodes.NEEDS_OAUTH_PERMISSIONS) {
status.startResolutionForResult(
myActivity,
MY_ACTIVITYS_AUTH_REQUEST_CODE);
}
}
但是调用 startResolutionForResult
时什么也没有发生。
需要在GoogleSignInOptions.Builder
中的requestScopes
中添加new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE)
。数据类型 TYPE_HYDRATION
属于范围 FITNESS_NUTRITION。该应用程序还需要卸载并重新安装才能将新范围添加到帐户。
我有以下使用历史插入水化数据的代码 Api,
public void addHydrationData(int waterVolume){
Calendar cal = Calendar.getInstance();
long endTime = cal.getTimeInMillis();
cal.add(Calendar.MINUTE, -1);
long startTime = cal.getTimeInMillis();
float volume = (float)waterVolume/1000f;
S.L("V F: " + volume + "wv: " + waterVolume);
final DataSet hydrationDataSet = createDataForRequest(DataType.TYPE_HYDRATION, DataSource.TYPE_RAW,
volume, startTime, endTime, TimeUnit.MINUTES);
Thread thread = new Thread(new Runnable() {
public void run() {
S.L("gac isconn: " + googleApiClient.isConnected());
S.L("gac gcr: " + googleApiClient.getConnectionResult(Fitness.HISTORY_API));
Status waterInsertStatus = Fitness.HistoryApi.insertData(googleApiClient, hydrationDataSet).await(1, TimeUnit.MINUTES);
if(!waterInsertStatus.isSuccess()){
S.L("There was a problem inserting the dataset.");
S.L("WIS: " + waterInsertStatus.getStatusCode());
if (waterInsertStatus.getStatusCode() == FitnessStatusCodes.NEEDS_OAUTH_PERMISSIONS ||
waterInsertStatus.getStatusCode() == FitnessStatusCodes.UNKNOWN_AUTH_ERROR) {
try {
S.L("Need oauth");
waterInsertStatus.startResolutionForResult(MainActivity.this, S.REQUEST_OAUTH);
} catch (IntentSender.SendIntentException e) {
e.printStackTrace();
S.L("SIE");
}
} else{
}
} else {
S.L("Successfully added data");
}
}
});
thread.start();
}
这是我得到的输出:
08-19 14:51:36.423 4594-4594/in.jiyofit.gfit D/CCC: V F: 0.25wv: 250
08-19 14:51:36.454 4594-5585/in.jiyofit.gfit D/CCC: gac isconn: true
08-19 14:51:36.454 4594-5585/in.jiyofit.gfit D/CCC: gac gcr: ConnectionResult{statusCode=SUCCESS, resolution=null, message=null}
08-19 14:51:36.928 4594-5585/in.jiyofit.gfit D/CCC: There was a problem inserting the dataset.
08-19 14:51:36.928 4594-5585/in.jiyofit.gfit D/CCC: WIS: 5005
08-19 14:51:36.929 4594-5585/in.jiyofit.gfit D/CCC: Need oauth
之前我得到的状态代码是 5000,现在我得到的是 5005。两者都必须按照 Google
所建议的以下方式解决Status code denotes that the request is missing desired OAuth permissions.
If an app does not have the required OAuth access for a specific API request, the request will fail with this status code. When this occurs, apps can use the pending intent inside the status object to request the necessary access before retrying the request.
Sample usage when access is missing for a request:
PendingResult<Result> pendingResult = FitnessApi.readData(fitnessRequest);
Result result = pendingResult.await(3L, TimeUnit.SECONDS);
Status = result.getStatus();
if (!status.isSuccess()) {
if (status.getStatusCode() == FitnessStatusCodes.NEEDS_OAUTH_PERMISSIONS) {
status.startResolutionForResult(
myActivity,
MY_ACTIVITYS_AUTH_REQUEST_CODE);
}
}
但是调用 startResolutionForResult
时什么也没有发生。
需要在GoogleSignInOptions.Builder
中的requestScopes
中添加new Scope(Scopes.FITNESS_NUTRITION_READ_WRITE)
。数据类型 TYPE_HYDRATION
属于范围 FITNESS_NUTRITION。该应用程序还需要卸载并重新安装才能将新范围添加到帐户。