我收到了无效的父文件夹错误,我看到使用资源ID而不是驱动器ID的解决方案,但这是一个不同的场景。
我正在尝试访问AppFolder,这只是像这样使用GoogleApiClient:
this.appFolder = Drive.DriveApi.getAppFolder(mGoogleApiClient);
当我稍后尝试在其中创建文件时,我收到上述错误。
DriveFolder.DriveFileResult fileResult = appFolder.createFile(mGoogleApiClient, changeSet, driveContentsResult.getDriveContents()).await();
然后fileResult.getStatus()给了我错误。
这曾经适合我。 不同的是,我在Google云端硬盘上手动清空了应用的数据(删除隐藏的应用数据)。 但我没有断开应用程序 - 所以我认为appFolder将继续以相同的方式工作......
到目前为止,唯一的解决方法是卸载应用,但这样我就会丢失数据。
这是可重复的。请帮忙。
答案 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()可能是一种解决方法,但它没有帮助。作为卸载/重新安装应用程序的替代方法,您可以尝试这些步骤,它们对我有用:
答案 3 :(得分:1)
5月4日谷歌报告了这个错误:
https://code.google.com/a/google.com/p/apps-api-issues/issues/detail?id=4483
作为一种解决方法,您可以使用REST API。