无法在Android上使用Google Drive REST API V3更新appDataFolder中的文件

时间:2016-02-28 18:09:20

标签: google-drive-api

这是我用来更新文件的代码。

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的字符串是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())我可以很好地更新元数据。

我该如何解决这个问题?

4 个答案:

答案 0 :(得分:4)

我在为Android应用程序(使用Android Studio / Gradle)编写Drive REST API集成时遇到了这个错误。由于我对Android的构建系统没有特别的经验,解决这个问题花了我几个小时。也许这可以帮助有同样问题的人:

  1. 从GitHub https://github.com/google/google-api-java-client
  2. 克隆google-api-java-client个回购
  3. 安装Maven https://maven.apache.org/run-maven/(例如OSX上的brew install maven
  4. 在命令行中,切换到上面克隆的repo的google-api-client子目录
  5. 运行mvn clean install
  6. 这将在target目录
  7. 中生成一个名为google-api-client的子目录
  8. 在那里,找到google-api-client-1.22.0-SNAPSHOT.jar,将其重命名为google-api-client-1.21.00.jar(可能不需要重命名)
  9. 将.jar放入Android项目的libs文件夹
  10. 告诉Gradle忽略您使用的库的google-api-client依赖关系,在我的情况下,这是:

    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'
    }
    
  11. 再次添加杰克逊依赖,以防您现在错过。如果您需要,可以使用其他google-api-java-client依赖项。

    compile('com.google.http-client:google-http-client-jackson2:1.21.0'){
        exclude group: 'org.apache.httpcomponents'
    }
    
  12. 构建项目,update(...)现在可以正常工作。

  13. 请注意在Google更新库后废弃这些更改。

答案 1 :(得分:0)

MediaHttpUploader javadocs表明它只会用于HttpMethods#POST和HttpMethods#UPDATE。根据{{​​3}}资源,使用update表示其使用PATCH方法 - 导致IllegalArgumentException

只有在您上传媒体内容时,才能使用被覆盖的update方法。

答案 2 :(得分:0)

我在桌面应用程序中有相同的异常。 相反,使用Drive Api V2,更新进展顺利。

答案 3 :(得分:0)

查看google-api-java-client的current commit。 不幸的是,修复程序尚未发布(修复于2015年11月21日vs 2015年11月19日发布),因此您可能必须在本地构建项目(例如maven)