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

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

我试图访问AppFolder,这只是像这样使用GoogleApiClient:

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

当我后来尝试在其中创build一个文件,我得到上述错误。

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

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

这个曾经为我工作过。 不同的是,我手动清空了Google云端硬盘上的应用数据(删除隐藏的应用数据)。 但我没有断开应用程序 – 所以我会认为,应用程序文件夹将继续以同样的方式工作…

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

这是可重复的。 请帮忙。

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

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

正如@seanpj所说,这个问题并不总是会发生,似乎取决于云服务的同步状态。 但是,如果问题确实发生,下面的方法可以解决这个问题。 我把它张贴在这里以防别人帮忙。 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, eg, 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 

虽然这不能解决你的问题,但是你的问题让我感兴趣,所以我使用这个演示程序进行了一些testing(按照这个代码中的 “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 

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

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

正如你所看到的,在我的情况下, getAppFolder(mGAC)返回可用的有效DriveFolder(DriveId)。 即使DriveIdstring看起来一样。 文件夹/文件列表返回有效的对象。 这是不应该的 ,但我知道有一个延迟,我不得不依靠,所以列表结果可能会改变,以反映删除。 尝试读取文件内容失败。

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

这指出了一个应该解决的严重错误。 与SO 30172915一样 ,未受过教育的用户的行为可能会造成不可挽回的损失 – 数据丢失到Android应用程序,而没有已知的补救措施。

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

  1. 在浏览器中,转至pipe理您Google帐户安全设置的页面 。
  2. select“关联的应用和网站”,然后select“pipe理应用”
  3. 从列表中select您的应用程序。 它将显示它可以访问Google云端硬盘和移除button。
  4. 点击删除
  5. 等待一两分钟让更改生效,然后运行您的应用程序。
  6. 当您的应用尝试连接到云端硬盘时,您应该获得允许或拒绝访问的同意屏幕。 接受将重新授权应用程序,并应清除问题。 它为我做了。

5月4日,这个bug报告给谷歌:

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

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