如何在给定oAuth令牌的情况下实例化com.google.api.services.calendar.Calendar对象?

时间:2013-08-25 00:49:27

标签: android oauth google-calendar-api

我已经使用此代码为我的Android应用中使用的每个日历获得了oAuth令牌

private HashMap<String, String> getAuthrizedCalendarsOnPhone() {
    HashMap<String, String> authorized_calendars = new HashMap<String, String>();

    AccountManager acctmgr = AccountManager.get(app_context);
    Account[] accounts = acctmgr.getAccountsByType("com.google");

    for (Account account : accounts) {
        String auth_token_type = "oauth2:https://www.googleapis.com/auth/calendar";
        AccountManagerFuture<Bundle> amf = acctmgr.getAuthToken(account, auth_token_type, null, this, null, null);

        String authToken;
        try {
            Bundle authTokenBundle = amf.getResult();
            authToken = authTokenBundle.getString(AccountManager.KEY_AUTHTOKEN);
        } catch(Exception e) {
            authToken = "";
        }
        authorized_calendars.put(account.name, authToken);
    }

    return authorized_calendars;
}

现在如何使用该oAuth令牌实例化com.google.api.services.calendar.Calendar对象,以便代表该用户访问日历api?

即。所以我可以做这样的事情

private HashMap<String, HCEvent> getCalendarEvents(String calendar_name) {
    HashMap<String, HCEvent> return_map = new HashMap<String, HCEvent>();
    com.google.api.services.calendar.Calendar service = null; //create a Calendar object using the oauth token for associated with calendar_name
    com.google.api.services.calendar.model.Events events = service.events().list(calendar_name).setPageToken(pageToken).execute();

    /*
     * do something with the events
     */

    return return_map;
}

1 个答案:

答案 0 :(得分:3)

在查看了一些Google Calendar API和示例后,看起来将标记分配给日历的最佳方法是初始化它。这需要一些设置,看看这个链接:

https://developers.google.com/google-apps/calendar/instantiate

如果您已经通过它,我很抱歉,但看起来您可以对该示例进行一些调整。

在初始化Calendar之前,执行了这段代码:

    GoogleAccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(
    response.accessToken, httpTransport, jsonFactory, clientId, clientSecret,
    response.refreshToken);

反过来用作日历初始化的一部分。

查看GoogleAccessProtectedResource的文档,看起来存在一个只接受访问令牌的构造函数。

http://javadoc.google-api-java-client.googlecode.com/hg/1.4.1-beta/com/google/api/client/googleapis/auth/oauth2/draft10/GoogleAccessProtectedResource.html#GoogleAccessProtectedResource(java.lang.String)

您之前可以使用您在方法中已经请求过的令牌,然后使用上面谷歌日历实例化链接中描述的其他几个对象,您应该能够使用给定的访问令牌正确地实例化日历。

希望这有帮助,

修改

看起来GoogleAccessProtectedResource实际上将被弃用,或者已经弃用。

javadoc声明:

&#34;已过时。 (计划在1.8中删除)使用GoogleCredential&#34;

http://javadoc.google-api-java-client.googlecode.com/hg/1.7.0-beta/com/google/api/client/googleapis/auth/oauth2/draft10/GoogleAccessProtectedResource.html

所以看起来你需要的是GoogleCredential来取代GoogleAccessProtectedResource。我发现您可以使用访问令牌设置凭证,如下所示:

GoogleCredential credential = new GoogleCredential().setAccessToken(accessToken);

然后您可以通过以下方式创建新日历:

Calendar service = new Calendar.Builder(httpTransport, jsonFactory,
            credential).build();

httpTransport和jsonFactory与其他示例的相似。

祝你好运!