【问题标题】:Issue with Google Calendar API AuthenticationGoogle Calendar API 身份验证问题
【发布时间】:2021-02-27 01:07:42
【问题描述】:

我正在尝试创建一个可以将活动插入 Google 日历的应用。根据https://developers.google.com/google-apps/calendar/quickstart/java 提供的信息,我添加了QuickStart 类并从我的MainActivty 调用它。下面是我的QuickStart 课程。由于我已经使用 OAuth 创建了一个项目,所以我使用了相同的。但是现在我在访问应用程序时遇到了错误。

快速入门类:

public class QuickStart {
    /**
     * Application name.
     */
    private static final String APPLICATION_NAME = "mycalapp";

    /**
     * Directory to store user credentials for this application.
     */
    private static final java.io.File DATA_STORE_DIR = new java.io.File(
            System.getProperty("user.home"),
            ".credentials/calendar-java-quickstart"
    );

    /**
     * Global instance of the {@link FileDataStoreFactory}.
     */
    private static FileDataStoreFactory DATA_STORE_FACTORY;

    /**
     * Global instance of the JSON factory.
     */
    private static final JsonFactory JSON_FACTORY =
            JacksonFactory.getDefaultInstance();

    /**
     * Global instance of the HTTP transport.
     */
    private static HttpTransport HTTP_TRANSPORT;

    /**
     * Global instance of the scopes required by this quickstart.
     * <p>
     * If modifying these scopes, delete your previously saved credentials
     * at ~/.credentials/calendar-java-quickstart
     */
    private static final List<String> SCOPES =
            Arrays.asList(CalendarScopes.CALENDAR_READONLY);

    static {
        try {
            HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
            DATA_STORE_FACTORY = new FileDataStoreFactory(DATA_STORE_DIR);
        } catch (Throwable t) {
            t.printStackTrace();
            System.exit(1);
        }
    }

    /**
     * Creates an authorized Credential object.
     *
     * @return an authorized Credential object.
     * @throws IOException
     */
    public static Credential authorize() throws IOException {
        // Load client secrets.
        InputStream in =
                QuickStart.class.getResourceAsStream("/google-services.json");
        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(DATA_STORE_FACTORY)
                        .setAccessType("offline")
                        .build();
        Credential credential = new AuthorizationCodeInstalledApp(
                flow, new LocalServerReceiver()).authorize("user");
        System.out.println(
                "Credentials saved to " + DATA_STORE_DIR.getAbsolutePath());
        return credential;
    }

    /**
     * Build and return an authorized Calendar client service.
     *
     * @return an authorized Calendar client service
     * @throws IOException
     */
    public static com.google.api.services.calendar.Calendar
    getCalendarService() throws IOException {
        Credential credential = authorize();
        return new com.google.api.services.calendar.Calendar.Builder(
                HTTP_TRANSPORT, JSON_FACTORY, credential)
                .setApplicationName(APPLICATION_NAME)
                .build();
    }

    public static void main(String[] args) throws IOException {
        // Build a new authorized API client service.
        // Note: Do not confuse this class with the
        //   com.google.api.services.calendar.model.Calendar class.
        com.google.api.services.calendar.Calendar service =
                getCalendarService();

        // 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.size() == 0) {
            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);
            }
        }
    }

}

QuickStart,我只是根据需要更改了应用程序的名称。

这就是我在MainActivity 中的称呼

try {
    QuickStart.authorize();
} catch (IOException e) {
    e.printStackTrace();
}

添加了所有权限,下面是错误日志:

W/System.err: java.security.KeyStoreException: JKS not found
W/System.err:     at java.security.KeyStore.getInstance(KeyStore.java:890)
W/System.err:     at com.google.api.client.util.SecurityUtils.getJavaKeyStore(SecurityUtils.java:53)
W/System.err:     at com.google.api.client.googleapis.GoogleUtils.getCertificateTrustStore(GoogleUtils.java:74)
W/System.err:     at com.google.api.client.googleapis.javanet.GoogleNetHttpTransport.newTrustedTransport(GoogleNetHttpTransport.java:55)
W/System.err:     at jss.smartapp.payremin.QuickStart.<clinit>(QuickStart.java:68)
W/System.err:     at jss.smartapp.payremin.QuickStart.authorize(QuickStart.java:0)

我不明白为什么它要求 JKS 以及在哪里定义它。请指导解决此问题

【问题讨论】:

    标签: java android google-calendar-api


    【解决方案1】:

    直接替换

    HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();
    

    HTTP_TRANSPORT = new NetHttpTransport();
    

    现在检查。

    【讨论】:

      【解决方案2】:

      终于在花了一周之后,得到了正确的工作代码。

      https://developers.google.com/google-apps/calendar/quickstart/android

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-01
        • 2014-04-14
        • 1970-01-01
        • 2021-11-22
        • 1970-01-01
        相关资源
        最近更新 更多