我现在已经使用Google Drive API for Android进行了50多个小时的战斗,并且还没有走近一英寸。根据我的理解,有100种方法可以访问Google云端硬盘(Google Docs API,REST和Google Drive SDK v2)。我正在使用Google Drive SDK v2。我想要访问Google云端硬盘以上传jpeg文件。平台,Android 2.2 +。
我尝试了什么:
使用最近发布的SDK: http://code.google.com/p/google-api-java-client/wiki/APIs#Drive_API
我看过Google I / O会议,但最重要的部分(如何使用您的客户端ID和客户端密钥创建Drive对象)被忽略了: https://developers.google.com/events/io/sessions/gooio2012/705/
我在https://code.google.com/apis/console创建了多个密钥。我创建的最后一个(并经过测试)是使用“创建另一个客户端ID ...”创建的 - > “已安装的应用程序” - > “机器人”。我已经在〜/ .android / debug.keystore中使用了密钥。
我还尝试为“其他”(而不是Android / iOS)安装的应用创建密钥,但这给了我一个客户端ID和客户端密钥。似乎Drive对象不接受客户端密钥。
如果代码中写着“1234567890-abcdefghij123klmnop.apps.googleusercontent.com”,我试图同时使用“API密钥”和“客户端ID”,两者都给出了同样的错误。
我的代码:
Account account = AccountManager.get(context).getAccountsByType(
"com.google")[0];
String token;
try {
token = GoogleAuthUtil.getToken(context, account.name, "oauth2:"
+ DriveScopes.DRIVE_FILE);
} catch (UserRecoverableAuthException e) {
context.startActivityForResult(e.getIntent(), ASK_PERMISSION);
return;
} catch (IOException e) {
return;
} catch (GoogleAuthException e) {
return;
}
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
Drive.Builder b = new Drive.Builder(httpTransport, jsonFactory, null);
final String tokenCopy = token;
b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
public void initialize(JsonHttpRequest request) throws IOException {
DriveRequest driveRequest = (DriveRequest) request;
driveRequest.setPrettyPrint(true);
driveRequest
.setKey("1234567890-abcdefghij123klmnop.apps.googleusercontent.com");
driveRequest.setOauthToken(tokenCopy);
}
});
final Drive drive = b.build();
FileList files;
try {
files = drive.files().list().setQ("mimeType=text/plain").execute();
} catch (IOException e) {
e.printStackTrace(); // throws HTTP 400
}
我得到的错误是:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 400 Bad Request
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"location" : "q",
"locationType" : "parameter",
"message" : "Invalid Value",
"reason" : "invalid"
} ],
"message" : "Invalid Value"
}
答案 0 :(得分:1)
如错误消息所示,您的错误位于查询参数q
中。 q
参数的正确语法是
files = drive.files().list().setQ("mimeType='text/plain'").execute();
而不是:
files = drive.files().list().setQ("mimeType=text/plain").execute();
查看您的代码,由于此语法错误,您已完全通过身份验证并且您的请求失败。