将数据插入 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。该应用程序还需要卸载并重新安装才能将新范围添加到帐户。