Tyl*_*eat 6 java android google-calendar-api google-api-java-client
我几天都在努力解决这个问题.我正在尝试通过Android进行身份验证来调用Google日历AccountManager
.我使用通常的方法检索身份验证令牌:
AccountManager manager = AccountManager.get(this);
String authToken = manager.getAuthToken(account, AUTH_TOKEN_TYPE, true, null, null).getResult().getString(AccountManager.KEY_AUTHTOKEN);
Run Code Online (Sandbox Code Playgroud)
然后,使用该令牌,我创建一个Calendar
这样的实例:
HttpTransport transport = AndroidHttp.newCompatibleTransport();
JacksonFactory jsonFactory = new JacksonFactory();
GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
Calendar calendar = Calendar.builder(transport, jsonFactory).setApplicationName("MyApp/1.0").setJsonHttpRequestInitializer(new JsonHttpRequestInitializer() {
@Override
public void initialize(JsonHttpRequest request) {
CalendarRequest calendarRequest = (CalendarRequest) request;
calendarRequest.setKey(API_KEY);
}
}).setHttpRequestInitializer(accessProtectedResource).build();
Run Code Online (Sandbox Code Playgroud)
但是,当我使用它进行API调用时,我收到401 Unauthorized
下面看到的错误.请注意,我已经包含了使过期的auth令牌无效的代码,因此我不认为这是问题所在.
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"
}
Run Code Online (Sandbox Code Playgroud)
关于我可能做错什么的任何想法?
小智 11
是的,这是可能的.一旦掌握了Google帐户(如您所述),您只需要从AccountManager请求GData服务的身份验证令牌.
如果Android设备已经有一个身份验证令牌(对于您尝试访问的特定GData服务),它将返回给您.如果没有,AccountManager将请求一个并将其返回给您.无论哪种方式,您都不需要担心这一点,因为AccountManager会处理它.
在以下示例中,我使用的是Google Spreadsheets API:
ArrayList<Account> googleAccounts = new ArrayList<Account>();
// Get all accounts
Account[] accounts = accountManager.getAccounts();
for(Account account : accounts) {
// Filter out the Google accounts
if(account.type.compareToIgnoreCase("com.google")) {
googleAccounts.add(account);
}
}
AccountManager accountManager = AccountManager.get(activity);
// Just for the example, I am using the first google account returned.
Account account = googleAccounts.get(0);
// "wise" = Google Spreadheets
AccountManagerFuture<Bundle> amf = accountManager.getAuthToken(account, "wise", null, activity, null, null);
try {
Bundle authTokenBundle = amf.getResult();
String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
// do something with the token
InputStream response = sgc.getFeedAsStream(feedUrl, authToken, null, "2.1");
}
Run Code Online (Sandbox Code Playgroud)
和
请查看google data api 中的示例代码.身份验证后要做的重要事情是调用GoogleHeaders.setGoogleLogin(String).
我希望这有帮助.
归档时间: |
|
查看次数: |
3926 次 |
最近记录: |