java - 浏览器无法在 gmail api 中打开

标签 java browser gmail-api

当我在未保存 StoredCredential 文件的情况下首次运行应用程序时,程序无法打开浏览器。然后,当我手动打开浏览器,转到打印的链接并单击“确定”以允许访问我的帐户时,程序不会继续运行。每次我运行该程序时,它实际上都会执行此操作。

程序每次都会打印出这样的内容(仅链接发生变化):

2016-08-31 22:15:53.250:INFO::Logging to STDERR via org.mortbay.log.StdErrLog
2016-08-31 22:15:53.250:INFO::jetty-6.1.26
2016-08-31 22:15:53.258:INFO::Started SocketConnector@localhost:35268
Please open the following address in your browser:
  https://accounts.google.com/o/oauth2/auth?access_type=offline&client_id=723296789344-l7b6jp5ffkmeteokur8qmi5fd8rkont5.apps.googleusercontent.com&redirect_uri=http://localhost:35268/Callback&response_type=code&scope=https://www.googleapis.com/auth/gmail.labels%20https://www.googleapis.com/auth/gmail.compose%20https://www.googleapis.com/auth/gmail.modify
Attempting to open that address in the default browser now...

正如我所说,给定的链接不会自动打开,当我手动打开并接受对我的帐户的访问时,程序不会继续运行。有什么想法可能会发生什么吗?另外,如果有帮助的话,我正在使用 Ubuntu 16.04,并且默认浏览​​器设置正确。

此外,有人知道从哪里开始在 OAuth 框架中实现帐户身份验证吗?

最佳答案

原因:

出现此问题的原因是 google api AuthorizationCodeInstalledApp.class 类。

该类用于检查 Desktop.isDesktopSupported()。它总是返回 false ,因此代码会抛出异常,因为它不适用于所有操作系统平台。

解决方案:

创建您自己的自定义,就像AuthorizationCodeInstalledApp.class一样。

保持所有代码相同,只需添加此else部分

if(Desktop.isDesktopSupported()) {

}
else {
    Runtime runtime = Runtime.getRuntime();
    runtime.exec("rundll32 url.dll,FileProtocolHandler " + url);
}

现在,要获取凭据,请使用

Credential credential= new YourClassName(flow, new LocalServerReceiver()).authorize("user");

而不是:

Credential credential= new AuthorizationCodeInstalledApp(flow, new LocalServerReceiver()).authorize("user"); 

它会工作得很好。

关于java - 浏览器无法在 gmail api 中打开,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39262288/

相关文章:

javascript - 如何测量大型数组的加载时间?

browser - 使用 XULRunner 的嵌入式浏览器

javascript - VS Code 调试控制台与任何 Web 浏览器有什么区别

gmail-api - GMAIL API : Get Label ID by Label Name

java - 在java swing中设置窗口的最小大小限制

java - 了解在鼠标监听器中编写的代码

java - 为什么我们必须从一个小部件更新多个小部件?

ios - 想要使用 gmail api 执行存档功能

java - 无法使用javax从android使用gmail帐户发送电子邮件

java - 使用 slf4j(和 log4j)传递日志事件特定数据