Drive API中AppFolder的父文件夹错误无效

时间:2015-10-20 23:16:12

标签: android google-drive-api google-drive-android-api

我收到了无效的父文件夹错误,我看到使用资源ID而不是驱动器ID的解决方案,但这是一个不同的场景。

我正在尝试访问AppFolder,这只是像这样使用GoogleApiClient:

this.appFolder = Drive.DriveApi.getAppFolder(mGoogleApiClient);

当我稍后尝试在其中创建文件时,我收到上述错误。

DriveFolder.DriveFileResult fileResult = appFolder.createFile(mGoogleApiClient, changeSet, driveContentsResult.getDriveContents()).await();

然后fileResult.getStatus()给了我错误。

这曾经适合我。 不同的是,我在Google云端硬盘上手动清空了应用的数据(删除隐藏的应用数据)。 但我没有断开应用程序 - 所以我认为appFolder将继续以相同的方式工作......

到目前为止,唯一的解决方法是卸载应用,但这样我就会丢失数据。

这是可重复的。请帮忙。

4 个答案:

答案 0 :(得分:4)

更新:此问题#4483已于2017年1月修复。以下修复可能不再适用。

由于这仍然是一个悬而未决的问题,我已经采取措施建立可以使用代码完成的解决方法,而无需借助用户干预。

正如@seanpj所说,这个问题并不总是发生,似乎取决于Drive服务的同步状态。但是,如果问题确实发生,以下方法可以帮我解决问题。我在这里发布,以防它可能对其他人有帮助。 Javadoc有更多信息。

/**
 * Works around the Drive API for Android (GDAA) issue where the appDataFolder becomes
 * unavailable after hidden app data is deleted through the online Drive interface
 * (Settings->Manage Apps->Delete hidden app data) by using the REST v3 API to create an
 * empty file in appDataFolder. The file is immediately deleted after creation but leaves
 * the appDataFolder in working order.
 * See <a href="https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=4483"
 * target="_blank">apps-api-issues #4483</a>
 * <p>
 * Call this method after a call to the Drive API fails with error code 1502
 * (DriveStatusCodes.DRIVE_RESOURCE_NOT_AVAILABLE) when dealing with the appDataFolder then
 * try the failed operation again.
 * <p>
 * This method assumes that all appropriate permissions have been granted and authorizations
 * made prior to invocation.
 *
 * @param context - Context
 * @param account The account name that has been authorized, e.g., someone@gmail.com.
 * @throws IOException From the REST API.
 */
private void fixAppDataFolder(Context context, String account) throws IOException {
    final String[] SCOPES = {DriveScopes.DRIVE_APPDATA};
    GoogleAccountCredential credential = GoogleAccountCredential.usingOAuth2(
            context, Arrays.asList(SCOPES)).setBackOff(new ExponentialBackOff());
    HttpTransport transport = AndroidHttp.newCompatibleTransport();
    JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
    com.google.api.services.drive.Drive driveService;

    credential.setSelectedAccountName(account);
    driveService = new com.google.api.services.drive.Drive.Builder(
            transport, jsonFactory, credential)
            .setApplicationName("Your app name here")
            .build();

    File fileMetadata = new File();
    fileMetadata.setName("fixAppDataFolder")
            .setMimeType("text/plain")
            .setParents(Collections.singletonList("appDataFolder"));

    File appDataFile = driveService.files()
            .create(fileMetadata)
            .setFields("id")
            .execute();

    driveService.files().delete(appDataFile.getId()).execute();
} // fixAppDataFolder

答案 1 :(得分:3)

虽然这不能解决您的问题,但您的问题让我感兴趣,所以我使用此demo进行了一些测试(请点击此code中的“appfolder”)。这是我学到的东西:

首先,我可以使用以下序列重现您的问题

1/ getAppFolder(mGAC)  
2/ create folder DEMOROOT in app folder
3/ create folder 2015-10 in DEMOROOT  
4/ create file with content in 151022-075754 in 2015-10  

5/ list full tree ... result \DEMOROOT\2015-10\151022-075754  
6/ read content of 151022-075754 ... OK
到目前为止一切顺利。没有断开连接,我去了

drive.google.com > Settings > Manage Apps > Options > Delete hidden app data

现在,app文件夹中应该没有对象,我运行:

1/ getAppFolder(mGAC)  
2/ list full tree ... result \DEMOROOT\2015-10\151022-075754  
3/ read content of 151022-075754 ... FAIL

如您所见,在我的情况下, getAppFolder(mGAC)会返回可以使用的有效DriveFolder(DriveId)。甚至DriveId字符串看起来都一样。 文件夹/文件列表返回有效对象。 不应该,但我知道我必须依赖延迟,因此列表结果可能会稍后更改以反映删除。尝试读取文件内容失败。

几分钟后(GDAA可能已同步),同样的列表尝试失败,仍然可以理解的结果,但另一次尝试在app文件夹中创建任何对象(文件夹/文件)失败,并指出'无效的父文件夹'错误出。断开/重新连接没有帮助,因此应用程序被烘烤。

这指出了一个应该解决的严重错误。与SO 30172915中的相同,未受过教育的用户的操作可能会导致无法挽回的损失 - 数据丢失到Android应用程序而没有已知的补救措施。

答案 2 :(得分:1)

我遇到了同样的问题。我认为GoogleApiClient.ClearDefaultAccountAndReconnect()可能是一种解决方法,但它没有帮助。作为卸载/重新安装应用程序的替代方法,您可以尝试这些步骤,它们对我有用:

  1. 在浏览器中,转到管理您的Google帐户security settings
  2. 的页面
  3. 选择“已连接的应用和网站”,然后选择“管理应用”
  4. 从列表中选择您的应用。它会显示它可以访问Google云端硬盘和删除按钮。
  5. 点击删除
  6. 等待一两分钟让更改生效,然后运行您的应用。
  7. 当您的应用尝试连接到云端硬盘时,您应该会在同意屏幕上提示用户允许或拒绝访问。接受将重新授权应用程序,并应清除问题。它为我做了。

答案 3 :(得分:1)

5月4日谷歌报告了这个错误:

https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=4483

作为一种解决方法,您可以使用REST API