2016-02-28 124 views
0

這是我用來更新文件的代碼。無法使用Android上的Google Drive REST API V3更新appDataFolder中的文件

File metadata = generateFileMetadata(fileId, thumbnail, properties); 
return mService.files().update(fileId, metadata, generateFileContents()) 
        .setFields("id, name, appProperties") 
        .execute(); 

此代碼生成一個

java.lang.IllegalArgumentException. 
at com.google.api.client.repackaged.com.google.common.base.Preconditions.checkArgument(Preconditions.java:111) 
at com.google.api.client.util.Preconditions.checkArgument(Preconditions.java:37) 
at com.google.api.client.googleapis.media.MediaHttpUploader.setInitiationRequestMethod(MediaHttpUploader.java:872) 
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.initializeMediaUpload(AbstractGoogleClientRequest.java:237) 
at com.google.api.services.drive.Drive$Files$Update.<init>(Drive.java:3163) 
at com.google.api.services.drive.Drive$Files.update(Drive.java:3113) 

使用斷點我看得出來,傳遞給setInitiationRequestMethod String爲PATCH(不POSTPUT):

public MediaHttpUploader setInitiationRequestMethod(String initiationRequestMethod) { 
    Preconditions.checkArgument(initiationRequestMethod.equals(HttpMethods.POST) 
    || initiationRequestMethod.equals(HttpMethods.PUT)); 
    this.initiationRequestMethod = initiationRequestMethod; 
    return this; 
    } 

這就是我在我的build.gradle

compile 'com.google.android.gms:play-services-identity:8.4.0' 
    compile('com.google.api-client:google-api-client-android:1.21.0') { 
    exclude group: 'org.apache.httpcomponents' 
    } 
    compile('com.google.apis:google-api-services-drive:v3-rev11-1.21.0') { 
    exclude group: 'org.apache.httpcomponents' 
    } 

如果我刪除文件內容(generateFileContents())我可以更新元數據就好了。

我該如何解決這個問題?

回答

0

查看google-api-java-client的current commit。 不幸的是,修復還沒有發佈(2015年11月21日修復,2015年11月19日發佈),因此您可能必須在本地構建項目(例如maven)

+0

你是對的。顯然這是一個錯誤。谷歌自己的API頁面鏈接到一個不同的問題跟蹤器,但GitHub上的一個有錯誤報告:[問題#994](https://github.com/google/google-api-java-client/issues/994) – HNS

0

MediaHttpUploader javadocs暗示它只會用於HttpMethods#POST和HttpMethods#UPDATE。使用update,基於Files資源,指示其使用PATCH方法 - 導致IllegalArgumentException

僅當您上傳媒體內容時才應使用覆蓋的update方法。

+0

我不確定我是否理解。這正是我試圖使用更新方法。文檔說更新方法「使用補丁**語義更新文件的元數據**和/或內容」。 它沒有對文件資源進行任何說明。它總是PATCH。 我沒有看到任何其他方式來更新文件的內容。 (除了刪除和重新創建文件)。 – HNS

0

我在桌面應用程序中有同樣的異常。 取而代之的是,使用Drive Api V2,更新進行得很順利。

4

我在寫驅動器時遇到了這個錯誤Android應用程序的REST API集成(使用Android Studio/Gradle)。由於我對Android的構建系統並不是很有經驗,解決這個問題花了我幾個小時。也許這可以幫助別人同樣的問題:

  1. 克隆從GitHub https://github.com/google/google-api-java-client
  2. google-api-java-client回購安裝Maven https://maven.apache.org/run-maven/(如brew install maven上OSX)
  3. 在命令行,改變成的的google-api-client子目錄回購你在上面
  4. 運行mvn clean install
  5. 這將產生一個子目錄克隆在google-api-client目錄
  6. 稱爲 target
  7. 在那裏,找到google-api-client-1.22.0-SNAPSHOT.jar,將其重命名爲google-api-client-1.21.00.jar(可能不需要重命名)
  8. 放下。罐子在你的Android項目
  9. libs文件夾告訴搖籃不理你使用的庫的谷歌的API客戶端的依賴性,於我而言,這是:

    compile('com.google.api-client:google-api-client-android:1.21.0') { 
        exclude group: 'org.apache.httpcomponents' 
        exclude module: 'google-api-client' 
    } 
    compile('com.google.apis:google-api-services-drive:v3-rev14-1.21.0') { 
        exclude group: 'org.apache.httpcomponents' 
        exclude module: 'google-api-client' 
    } 
    
  10. 再次添加傑克遜的依賴,如果你現在想念它。如果您需要它們,請和其他的google-api-java-client相關。

    compile('com.google.http-client:google-http-client-jackson2:1.21.0'){ 
        exclude group: 'org.apache.httpcomponents' 
    } 
    
  11. 建立你的項目,update(...)現在應該可以工作。

  12. 請記下這些更改,以便在Google更新庫時取消這些更改。
相關問題