Android上的Google Calendar API访问令牌

问题描述 投票:0回答:2

我想查询并将事件添加到已登录到应用程序的用户的主日历中(使用他/她/其“谷歌帐户”)。

我走到这一步:

class CalendarClient {
    private static final String APPLICATION_NAME = "TrackTransfer";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private final String token;

    CalendarClient (String token){
        this.token = token;
    }

    private Credential getCredentials() {
        return new GoogleCredential().setAccessToken(token);
    }

    void print() throws IOException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = new com.google.api.client.http.javanet.NetHttpTransport();
        Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials())
                .setApplicationName(APPLICATION_NAME)
                .build();

        // List the next 10 events from the primary calendar.
        DateTime now = new DateTime(System.currentTimeMillis());
        Events events = service.events().list("primary")
                .setMaxResults(10)
                .setTimeMin(now)
                .setOrderBy("startTime")
                .setSingleEvents(true)
                .execute();
        List<Event> items = events.getItems();
        if (items.isEmpty()) {
            System.out.println("No upcoming events found.");
        } else {
            System.out.println("Upcoming events");
            for (Event event : items) {
                DateTime start = event.getStart().getDateTime();
                if (start == null) {
                    start = event.getStart().getDate();
                }
                System.out.printf("%s (%s)\n", event.getSummary(), start);
            }
        }
    }

}

我在用户已登录的活动中将其称为此类,并且登录帐户由account表示。

private void writeToCalendar()  {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Log.d("CAL", "token: " + account.getIdToken());
                CalendarClient c = new CalendarClient(account.getIdToken());
                c.print();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

}

但是,即使用户已登录,account.getIdToken()也是Null。我还尝试将令牌设置为我在google开发者控制台中为我的应用程序获取的客户端ID,但这也不起作用。

自然地,当令牌是Null时,我得到一个例外,说明超过了非签名api calles的队伍。

在调用writeToCalendar()之前访问Fitness API并不是该帐户的问题(因此它已登录)。

我查看了各种资源,但都没有证明有用。 Google API文档是关于Java的,并使用从开发人员控制台获得的凭据;但是,由于我想使用OAuth进行身份验证,这不是正确的做法(我猜?)。然后我发现可以使用GoogleCredential().setAccessToken(token),但我无法弄清楚使用了什么令牌。

我如何获得正确的令牌?

更新

在请求登录帐户的范围时,可以直接使用健身API:

FitnessOptions fitnessOptions = FitnessOptions.builder()
                .addDataType(DataType.TYPE_DISTANCE_DELTA, FitnessOptions.ACCESS_READ)
                .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
                .build();
GoogleSignInAccount gsa = GoogleSignIn.getAccountForExtension(this, fitnessOptions);

回调看起来像这样:

account = completedTask.getResult(ApiException.class);

但是,在请求日历api的范围时,以下是正确的吗?

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .requestScopes(new Scope("https://www.googleapis.com/auth/calendar"))
                .build();
GoogleSignInClient tempClient = GoogleSignIn.getClient(this, gso);
android google-calendar-api google-oauth
2个回答
1
投票

登入

sign in

我也发现了这一点,你可能需要在api为你提供访问令牌之前使用oauth:

auth

然后我会查看是否需要启用结算帐户的api之一。有可能。这并不意味着您需要付费...取决于api google让您“启用”结算。不确定这个api是否是其中之一。

info


0
投票

概率很高,现有登录不具备所需的oAuth2 scopes

之前请求这些应该提供能够访问API的范围。

© www.soinside.com 2019 - 2024. All rights reserved.