Google云端硬盘SDK 2.0会抛出400错误请求错误

时间:2012-10-15 03:11:36

标签: android google-drive-api

我现在已经使用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"
}

1 个答案:

答案 0 :(得分:1)

如错误消息所示,您的错误位于查询参数q中。 q参数的正确语法是

files = drive.files().list().setQ("mimeType='text/plain'").execute();

而不是:

files = drive.files().list().setQ("mimeType=text/plain").execute();

查看您的代码,由于此语法错误,您已完全通过身份验证并且您的请求失败。