【问题标题】:My app can not create file in "appDataFolder" of google drive我的应用无法在谷歌驱动器的“appDataFolder”中创建文件
【发布时间】:2021-05-30 05:30:33
【问题描述】:

如何在谷歌驱动器“appDataFolder”中创建文件?

我创建了创建文件和访问“appDataFolder”所必需的谷歌开发者控制台设置。

google developer console

Android Studio 输出错误信息如下。

W/System.err: com.google.api.client.googleapis.json.GoogleJsonResponseException: 403 Forbidden
    {
      "code": 403,
      "errors": [
        {
          "domain": "global",
          "message": "The granted scopes do not allow use of the Application Data folder.",
          "reason": "insufficientScopes"
        }
      ],
      "message": "The granted scopes do not allow use of the Application Data folder."
    }
W/System.err:     at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:113)
        at com.google.api.client.googleapis.services.json.AbstractGoogleJsonClientRequest.newExceptionOnError(AbstractGoogleJsonClientRequest.java:40)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:432)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:352)
        at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:469)
        at com.example.test1.MainActivity$3.run(MainActivity.java:131)
        at java.lang.Thread.run(Thread.java:923)

源码是

                        File body = new File();
                        body.setName(FILE_TITLE);//fileContent.getName());
                        body.setMimeType("text/plain");
                        body.setParents(Collections.singletonList("appDataFolder"));

                        File file = service.files().create(body, content)
                                .setFields("id")
                                .execute();

如果在源代码中注释掉以下行,我的应用可以在 google drive 中创建文件 顶级文件夹不是“appDataFolder”。

body.setParents(Collections.singletonList("appDataFolder"));

Android Studio 4.1.2 enter image description here

最好的问候。 提前致谢。

【问题讨论】:

    标签: java android-studio google-drive-api google-oauth google-api-java-client


    【解决方案1】:

    从您的开发者控制台图像的外观来看,您似乎拥有大量范围。这里的问题不在于您在 google 开发者控制台中的设置,而在于您已授权用户使用的范围。

    当您运行应用程序时,系统会要求用户同意您访问他们的某些数据,这就是您的应用程序的授权范围。它定义了用户授予您的应用程序访问权限的内容。

    如果您的代码只请求只读访问,然后您尝试写入它,那么您将看到一个不足的Scopes 错误消息。

    您需要检查您正在使用的方法所需的范围,然后确保您在授权用户时请求该范围。

    我猜你有这样的东西

    private static final List<String> SCOPES = Collections.singletonList(DriveScopes.DRIVE_METADATA_READONLY);
    

    你需要包含这个范围https://www.googleapis.com/auth/drive.appdata,它可能类似于DriveScopes.DRIVE_APPDATA

    请记住,一旦在您的应用程序中更改了范围,您将需要重新授权用户。如果您存储了同意,则需要将其删除才能再次请求授权。

    【讨论】:

    • 感谢您的快速评论。请问为什么你认为我的代码只请求只读访问?我打算让我的应用尝试写入(创建文件)。
    • 我的 android 应用屏幕布局中有一个 EditText 和两个 Button。按下“保存”按钮后,如您所说,OAuth 同意屏幕会出现在我的 android 终端上。同意屏幕要求我显示、编辑、创建、删除谷歌驱动器上的所有文件。在我同意之后,我的应用程序请求在名为“appDataFolder”的特定文件夹中创建一个文件,该文件对谷歌驱动器数据的所有者不可见。
    • 但是,尽管将“.../auth/drive.appdata”范围包含在谷歌开发者控制台的同意屏幕设置中,还是发生了错误。
    • 我猜您只是请求只读访问权限,因为您没有包含您的授权代码,我们可以看到您请求的范围。更改范围后,请记住,您需要强制重新授权用户才能接受更改,否则您的代码将失去旧的同意。
    • 凭据 = GoogleAccountCredential.usingOAuth2(this, Arrays.asList(DriveScopes.DRIVE, DriveScopes.DRIVE_APPDATA));
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 1970-01-01
    • 1970-01-01
    • 2022-01-27
    相关资源
    最近更新 更多