我几天都在努力解决这个问题.我正试图通过
Android的AccountManager使用身份验证拨打Google日历.我使用通常的方法检索身份验证令牌:
AccountManager manager = AccountManager.get(this); String authToken = manager.getAuthToken(account,AUTH_TOKEN_TYPE,true,null,null).getResult().getString(AccountManager.KEY_AUTHTOKEN);
然后,使用该令牌,我创建一个这样的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();
但是,当我使用它进行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" }
关于我可能做错什么的任何想法?
解决方法
是的,这是可能的.一旦掌握了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",activity,null); try { Bundle authTokenBundle = amf.getResult(); String authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN); // do something with the token InputStream response = sgc.getFeedAsStream(FeedUrl,authToken,"2.1"); }
和
请查看google data api中的sample code.身份验证后要做的重要事情是调用GoogleHeaders.setGoogleLogin(String).
我希望这有帮助.