Raspberry挂在Google日历API的OAuth身份验证上

时间:2018-09-19 19:05:54

标签: javafx oauth-2.0 google-oauth raspberry-pi3 google-calendar-api

我正在创建一个使用google calendar API的javaFX应用。我在两台Windows PC上对其进行了测试,并且一切正常。谷歌的代码打开了浏览器,我可以在其中进行身份验证,然后它会创建令牌并加载日历数据。不幸的是,我的目标平台是Raspberry Pi 3,在调用oauth身份验证时,它将冻结系统。

为了进行测试,我仅从进行身份验证的Google提取了代码,并将其捆绑为一个单独的jar。在狂躁中运行此jar不会造成任何问题,它会打开浏览器并让我进行身份验证。但是封装在我的其余代码中,它冻结了,尽管我只创建了一个对象并调用getCredentials方法,但实际上与在提取的Jar中所做的相同。 所以我想,也许是由javaFX引起的,所以我将google api的代码捆绑为javaFX Jar,但是它可以完美地运行在raspy上。 所以我没主意,想问一问,是否有人遇到过类似的问题。

希望有人可以帮助我 非常感谢。

我刚刚复制的Googles API代码:

private static final String APPLICATION_NAME = "test";
private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();
private static final String TOKENS_DIRECTORY_PATH = "tokens";

private static final List<String> SCOPES = Collections.singletonList(CalendarScopes.CALENDAR_READONLY);
private static final String CREDENTIALS_FILE_PATH = "/credentials.json";

private static Credential getCredentials(final NetHttpTransport HTTP_TRANSPORT) throws IOException {
    // Load client secrets.
    try {
        InputStream in = GoogleCalendar.class.getResourceAsStream(CREDENTIALS_FILE_PATH);
        GoogleClientSecrets clientSecrets = GoogleClientSecrets.load(JSON_FACTORY, new InputStreamReader(in));
        // Build flow and trigger user authorization request.
        GoogleAuthorizationCodeFlow flow = new GoogleAuthorizationCodeFlow.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, clientSecrets, SCOPES)
                .setDataStoreFactory(new FileDataStoreFactory(new java.io.File(TOKENS_DIRECTORY_PATH)))
                .setAccessType("offline")
                .build();
        return new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user");
    }catch (Exception e) {
        e.printStackTrace();
    }
    return null;
}

public List<Event> getCalendarData(int maxResults) throws IOException, GeneralSecurityException {
    final NetHttpTransport HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials(HTTP_TRANSPORT))
            .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(maxResults)
            .setTimeMin(now)
            .setOrderBy("startTime")
            .setSingleEvents(true)
            .execute();
    List<Event> items = events.getItems();
    return items;
}

这是我调用API代码的地方:

    public void update() {
    vbox_main.getChildren().clear();
    label_head.setText(gCalObj.getName() + "'s Google Calender");
    label_head_date.setText(getActualDate());
    GoogleCalendar gCal = new GoogleCalendar();
    try {
        List<Event> items = gCal.getCalendarData(gCalObj.getMaxResult());
        if(items != null) {
            System.out.println("size: " + items.size());
            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);
                    createDateRow(event.getSummary(), start);
                }
            }
        } else {
            System.out.println("no data arrived");
        }
    } catch (IOException e) {
        e.printStackTrace();
    } catch (GeneralSecurityException e) {
        e.printStackTrace();
    }
}

在Raspberry Pi 3上冻结时的输出 enter image description here

0 个答案:

没有答案