使用Google Play服务进行身份验证时,一切正常:
String token = GoogleAuthUtil.getToken(mActivity, mEmail, "oauth2:" + DriveScopes.Drive);
使用该令牌,我现在可以创建我的云端硬盘实例并访问Google云端硬盘。但我意识到这仅支持Android 2.2及更高版本。我需要支持android 2.1。
我尝试使用此代码获取令牌:
AccountManager am = AccountManager.get(this);
Bundle options = new Bundle();
am.getAuthToken (
account,
"oauth2:" + DriveScopes.Drive,
options,
this,
new OnTokenAcquired(this),
null);
使用此代码时,我会获得一个令牌,但在使用它创建我的云端硬盘实例时,我将无法访问Google云端硬盘。例如,当执行此代码时:
drive.files().list().setQ(trashed=false and title="'someTitle'").execute();
我会收到此错误:
com.google.api.client.googleapis.json.GoogleJsonResponseException: 401 Unauthorized
{
"code" : 401,
"errors" : [ {
"domain" : "global",
"location" : "Authorization",
"locationType" : "header",
"message" : "Invalid Credentials",
"reason" : "authError"
} ],
"message" : "Invalid Credentials"
}
这就是创建我的云端硬盘实例的方法:
HttpTransport httpTransport = new NetHttpTransport();
JacksonFactory jsonFactory = new JacksonFactory();
Drive.Builder b = new Drive.Builder(httpTransport, jsonFactory, null);
b.setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
public void initialize(JsonHttpRequest request) throws IOException {
DriveRequest driveRequest = (DriveRequest) request;
driveRequest.setPrettyPrint(true);
driveRequest.setKey(CLIENT_ID);
driveRequest.setOauthToken(token);
driveRequest.setEnableGZipContent(true);
}
});
drive = b.build();
答案 0 :(得分:0)
这似乎是正确的,但AccountManager OAuth2支持的问题取决于平台版本(Google Services库等)。它可能适用于某些设备,但可能不适用于库中略有不同的其他设备。确保它在2.1上一致工作的唯一方法是使用WebView获取令牌。如果AccountManager在某些设备上损坏或有问题,您无法真正做任何事情。
答案 1 :(得分:0)
好的,我已经解决了。问题实际上是我使用了错误的客户端ID。使用Google Play服务时,我将客户端ID用于Google API控制台中的已安装应用程序。使用AccountManager时,此ID无法正常工作,而是必须使用API密钥进行简单API访问。
修改强>
发现这不完全正确。对于不同的设备,使用的客户端ID似乎不同。