我正在编写Android(版本ICS)应用。将数据上传到Google云端硬盘。该应用程序 使用oauth2获取访问令牌。
第一步:获取授权令牌。
String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/drive";
// Step 1
accountManager.getAuthToken(
account, // Account retrieved using getAccountsByType("com.google")
AUTH_TOKEN_TYPE, // Auth Token Type
options, // Authenticator-specific options
this, // Your activity
new OnTokenAcquired(), // Callback called when a token is successfully acquired
new Handler(new OnAuthTokenError())); // Callback called if an error occurs
}
private class OnTokenAcquired implements AccountManagerCallback<Bundle> {
@Override
public void run(AccountManagerFuture<Bundle> result) {
// Get the result of the operation from the AccountManagerFuture.
Bundle bundle;
try {
bundle = result.getResult();
authToken = bundle.getString(AccountManager.KEY_AUTHTOKEN);
Log.d(TAG,"authToken:" + authToken);
exchangeToken access = (exchangeToken) new exchangeToken().execute();
} catch (OperationCanceledException e) {
e.printStackTrace();
} catch (AuthenticatorException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
成功。获取授权令牌。
第2步:为访问令牌交换授权令牌。
private class exchangeToken extends AsyncTask<String, Void, Void> {
@Override
protected Void doInBackground(String... params) {
HttpTransport transport = new NetHttpTransport();
JsonFactory jsonFactory = new GsonFactory();
String CLIENT_ID = "999999999999.apps.googleusercontent.com";
String CLIENT_SECRET = "axXXXXXXXXXXXXXXX7";
try { // Step 2: Exchange for an access and refresh token
GoogleTokenResponse authResponse = new GoogleAuthorizationCodeTokenRequest(transport, jsonFactory, CLIENT_ID, CLIENT_SECRET, authToken, CALLBACK_URL).execute();
accessToken = authResponse.getAccessToken();
Log.d("Get Access","Token:" + accessToken);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
失败。 LogCat显示以下内容: com.google.api.client.auth.oauth2.TokenResponseException:400错误请求
{
"error":"unauthorized_client"
}
我可以使用“云端硬盘”应用在我的Android平板电脑上访问“Google云端硬盘”。所以 我的电子邮件帐户有效。可能是AUTH_TOKEN_TYPE不正确,但谷歌云端硬盘 SDK不清楚它必须是什么。我错过了什么?
答案 0 :(得分:1)
您无需执行交换令牌的第二步。 Android会直接向您授予访问令牌,但它不会授予您一个您必须交换令牌的身份验证码。
Android文档中的This page很好地解释了一切。
答案 1 :(得分:0)
您知道要使用Drive API,您的用户必须在Chrome(!)网上商店安装您的应用吗? 通常,Documents List API是Android的最佳选择。