【问题标题】:(Android/Java) Google Sheets v4 isUserRecoverableError status: NEED_PERMISSION(Android/Java) Google Sheets v4 isUserRecoverableError 状态:NEED_PERMISSION
【发布时间】:2016-08-17 03:35:22
【问题描述】:

我目前正在尝试使用 Google Sheets v4 API 从我的 Google 电子表格中删除一行。

这是我正在使用的代码:

private void deleteRow()
{
    List<Request> requests = new ArrayList<>();

    DeleteDimensionRequest deleteDimensionRequest = new DeleteDimensionRequest();

    DimensionRange dimensionRange = new DimensionRange();
    dimensionRange.setStartIndex(14);
    dimensionRange.setEndIndex(15);

    deleteDimensionRequest.setRange(dimensionRange);

    requests.add(new Request()
            .setDeleteDimension(deleteDimensionRequest)
    );

    BatchUpdateSpreadsheetRequest batchUpdateRequest = new BatchUpdateSpreadsheetRequest()
            .setRequests(requests);

    try
    {
        mService.spreadsheets().batchUpdate("Spreadsheet_ID", batchUpdateRequest).execute();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }
}

这个函数给我的错误是:

08-14 15:47:10.818 26956-27285/com.xxx.xxxxx.xxxxxxxx         
W/GoogleAuthUtil: isUserRecoverableError status: NEED_PERMISSION

在我的其他类文件中,我已经指出了权限范围,包括驱动器和电子表格。

这是错误的图片:

在 java 快速入门中...

    public static Credential authorize() throws IOException {
    // Load client secrets.
    InputStream in =
        SheetsQuickstart.class.getResourceAsStream("/client_secret.json");
    GoogleClientSecrets clientSecrets =
        GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));

    // Build flow and trigger user authorization request.
    GoogleAuthorizationCodeFlow flow =
            new GoogleAuthorizationCodeFlow.Builder(
                    HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
            .setDataStoreFactory(DATA_STORE_FACTORY)
            .setAccessType("offline")
            .build();
    Credential credential = new AuthorizationCodeInstalledApp(
        flow, new LocalServerReceiver()).authorize("user");
    System.out.println(
            "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
    return credential;
}

除了我需要包含的 android 快速入门提供的证书之外,这是一种宣誓证书吗?

【问题讨论】:

  • 除了范围之外,您是否还包括有效的 oauth 凭据? (另外,通过,开始范围是包含的,结束范围是排除的。所以要求删除 [14,14) 最终不会删除任何内容。如果要删除第 14 行,则需要 [14,15)。)
  • 感谢山姆的回复。其余代码只是示例快速入门... mCredential = GoogleAccountCredential.usingOAuth2(getApplicationContext(), Arrays.asList(SCOPES)) .setBackOff(new ExponentialBackOff());我不确定如何包含另一个有效的宣誓证书...我需要某种 API 密钥吗?

标签: java android google-sheets-api


【解决方案1】:

根据给定的 JSON 响应,遇到的错误是由于身份验证范围不足。您可以尝试检查Authorizing requests with OAuth 2.0 中给出的 Google Sheets API 所需的 OAuth 2.0 范围信息。

请注意,向 Google Sheets API 请求非公开用户数据必须由经过身份验证的用户授权。同样,如果应用程序需要创建电子表格或以其他方式操作其元数据,则应用程序还必须请求 Google Drive API 范围。

此外,此 SO 帖子中给出的解决方案 - 403 Forbidden error when accessing Google Drive API downloadURL 关于错误代码 403 也可能有所帮助。

【讨论】:

    【解决方案2】:

    问题可能是您加载的存储凭据范围不足,您需要删除存储的凭据并再次授权访问。

    您的代码似乎改编自 Java quickstart,它请求只读范围。尝试使用该范围进行写入操作将失败并出现此错误。

    【讨论】:

      【解决方案3】:

      由于没有一个与使用 android 应用程序管理工作表相关的问题,因此这是从头开始请求额外 OATH 2.0 的方法,我花了几个小时才理解:

      获得正确附加授权的策略... https://developers.google.com/identity/protocols/OAuth2InstalledApp#libraries 图:

      所有这些请求都可以通过一些导入来处理,例如 AsyncTask 中的 HttpUrlConnection...。

      范围列表... https://developers.google.com/sheets/guides/authorizing

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-13
        • 2018-11-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多