javafx - 树莓派挂在谷歌日历 api 的 oauth 身份验证中
问题描述
我正在创建一个使用 google calendar api 的 javaFX 应用程序。我在两台 Windows PC 上对其进行了测试,一切正常。来自谷歌的代码打开浏览器,我可以在其中对我进行身份验证,而不是创建一个令牌并加载日历数据。不幸的是,我的目标平台是 Raspberry Pi 3,它在调用 oauth 身份验证时会冻结系统。
为了测试,我只从谷歌提取了验证发生的代码,并将其捆绑为一个单独的 jar。在 raspy 上运行这个 jar 不会导致任何问题,它会打开浏览器并让我进行身份验证。但是封装在我的其余代码中,它冻结了,尽管我只是创建一个对象并调用 getCredentials 方法,这与我在提取的 Jar 中所做的完全一样。所以我想,可能是javaFX引起的,所以我把api谷歌代码捆绑为javaFX Jar,但是在raspy上运行完美。所以我没有想法,想问一下,是否有人遇到过同样的问题。
希望有人可以帮助我非常感谢。
我刚刚复制的 Google 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 上冻结时的输出 在 此处输入图像描述
解决方案
推荐阅读
- terraform - 通过 Terraform 传递文件夹中的所有文件
- c# - HttpClientHandler NetworkCredential 与 DefaultCredentials
- android - Android 应用程序找不到共享对象
- python - 下载 udemy 视频时如何绕过此正则表达式错误
- azure - 使用 Azure DevOps CI/CD 管道自动部署 ADF 管道
- android - 如何在android中以矩形形状制作弯曲边缘
- angular - Angular 中的 Post 方法返回 400 状态码
- animation - 在同一屏幕上为多个小部件设置动画
- ruby - 如何修复损坏的 Ruby 配置
- mysql - 有什么方法可以连接 MySql 和 PostgreSQL 的表?