Я создаю приложение javaFX, которое использует API Google Calendar.Я проверил его на двух ПК с Windows, и все работает нормально.Код от Google открывает браузер, где я могу подтвердить свою подлинность, а затем создает токен и загружает данные календаря.К сожалению, моей целевой платформой является Raspberry Pi 3, и она зависает при вызове аутентификации oauth.
Для тестирования я извлек только код из Google, где происходит аутентификация, и упаковал его как отдельный jar.Запуск этого jar на raspy не вызывает никаких проблем, он открывает браузер и позволяет мне аутентифицировать.Но заключенный в капсулу в остальной части моего кода, он зависает, хотя я ничего не делаю, кроме создания объекта и вызова метода getCredentials, точно так же, как я делал в извлеченном Jar.Так что я подумал, может быть, это вызвано javaFX, поэтому я связал код api google как javaFX Jar, но он отлично работает на скрипучем устройстве.Поэтому у меня нет идей и я хочу спросить, сталкивался ли кто-то с такими же проблемами.
Надеюсь, кто-то может мне помочь. Большое спасибо.
Код API Googles, который я только что скопировал:
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 введите описание изображения здесь