这是我用来更新文件的代码。
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
(不是POST
或PUT
):
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 :(得分:4)
我在为Android应用程序(使用Android Studio / Gradle)编写Drive REST API集成时遇到了这个错误。由于我对Android的构建系统没有特别的经验,解决这个问题花了我几个小时。也许这可以帮助有同样问题的人:
google-api-java-client
个回购
brew install maven
)google-api-client
子目录mvn clean install
target
目录google-api-client
的子目录
google-api-client-1.22.0-SNAPSHOT.jar
,将其重命名为google-api-client-1.21.00.jar
(可能不需要重命名)libs
文件夹告诉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'
}
再次添加杰克逊依赖,以防您现在错过。如果您需要,可以使用其他google-api-java-client依赖项。
compile('com.google.http-client:google-http-client-jackson2:1.21.0'){
exclude group: 'org.apache.httpcomponents'
}
构建项目,update(...)
现在可以正常工作。
答案 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)