2015-10-20 63 views
7

我收到無效的父文件夾錯誤,並且我已經看到使用資源ID而不是驅動器ID的解決方案,但這是另一種場景。驅動器API中AppFolder的父文件夾錯誤無效

我試圖訪問AppFolder,這只是使用GoogleApiClient像這樣:

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

當我後來嘗試創建中有一個文件,我得到上述錯誤。

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

然後fileResult.getStatus()給我的錯誤。

這以前用於我的工作。 不同之處在於我手動清空了Google雲端硬盤上的應用數據(刪除隱藏的應用數據)。 但我沒有斷開應用程序 - 所以我會假設應用程序文件夾將繼續以相同的方式工作...

到目前爲止唯一的解決方法是卸載應用程序,但這種方式我失去了我的數據。

這是可重現的。請幫忙。

+0

你是不是遇到了類似[這]東西(http://stackoverflow.com/questions/30172915/user-disconnecting-app-in-drive-causes-loss-of-data-under -file-範圍)? – seanpj

+0

我不這麼認爲。首先,我不'撤銷授權,我只是刪除隱藏的應用程序數據 - 應用程序仍然連接。其次,我不擔心舊文件丟失(我不希望它們在斷開應用程序後仍然在那裏),而是關於創建新文件。由於「無效的父文件夾」錯誤,我無法在appFolder中創建文件。 – MMagician

+0

我的WILD猜測是,在「清空」你的應用數據後,你可以嘗試斷開/連接(我在onPause/onResume中確保GooPlaySvcs仍然在運行)並嘗試再次獲取'appFolder'的值。您可以嘗試在「清空」操作之前和之後查看appFolder的DriveId值(getAppFolder(mGAC).getDriveId())。但正如我所說這是一個長鏡頭。 – seanpj

回答

2

雖然這並不能解決您的問題,但您的問題讓我感興趣,所以我使用此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 

現在,應該在應用程序文件夾中沒有對象,我跑:

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可能同步),列出的同一嘗試失敗,結果仍然可以理解,但另一個嘗試在應用程序文件夾中創建任何對象(文件夾/文件)失敗,並顯示'無效父文件夾'錯誤指出。斷開/重新連接並沒有幫助,所以應用程序已烤焦。

這指出了一個應該解決的嚴重錯誤。與SO 30172915一樣,未受過教育的用戶的行爲可能會造成無法挽回的損失 - 數據丟失到Android應用程序,而沒有已知的補救措施。

+0

因爲您參與了許多關於GDAA錯誤的討論,所以我想問您:是否有跟蹤GDAA或Google Play服務的網站的問題?我已經看到跡象表明Play服務錯誤報告不受AOSP問題跟蹤器網站的歡迎。我發現報告問題的唯一地方是[幫助論壇](https://productforums.google.com/forum/#!topicsearchin/drive/category$3Areport-a-problem%7Csort:relevance%7Cspell:false )。 –

+1

前段時間我已遇到[this](https://code.google.com/a/google.com/p/apps-api-issues/issues/list?q=label:API-DriveAndroid),但我從未在那裏活躍過。我依靠StockOverflow作爲我的主要來源。它看起來像谷歌使用SO作爲一個方便的地方挑選他們想要處理的問題,並忽略[其他](http://stackoverflow.com/questions/23073474/google-drive-android-api-changeevent-偵聽器運作)。雖然許多'問題'只是建築(內置)問題的嚴重記錄。只需花時間瞭解GDAA和REST Apis的侷限性。 – seanpj

+0

嗨seanpj,我可以證實你的發現。你打算提交官方錯誤報告嗎? –

1

我遇到了同樣的問題。我認爲GoogleApiClient.ClearDefaultAccountAndReconnect()可能是一種解決方法,但它沒有幫助。作爲替代卸載/重新安裝應用程序,你可以嘗試這些步驟,他們的工作對我來說:

  1. 在瀏覽器中打開的頁面管理您的谷歌帳戶的security settings
  2. 選擇「連接的應用程序&網站」,然後「管理應用程序」
  3. 從列表中選擇您的應用程序。它將顯示它可以訪問Google Drive和刪除按鈕。
  4. 點擊刪除
  5. 等一兩分鐘讓更改生效,然後運行您的應用程序。
  6. 當您的應用程序嘗試連接到雲端硬盤時,您應該獲得允許用戶允許或拒絕訪問的同意屏幕。接受將重新授權應用程序,並應清除問題。它爲我做了。
3

更新:此問題#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., [email protected] 
* @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 
相關問題