Google Calendar API身份验证问题

时间:2017-12-24 13:57:09

标签: java android google-calendar-api

我试图创建一个应用程序,我可以将事件插入谷歌日历。根据{{​​3}}提供的信息,我添加了Quickstart类并从我的mainactivty中调用它。下面是我的快速入门课程。由于我已经使用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以及在哪里定义它。请修复此

指南

2 个答案:

答案 0 :(得分:0)

最后花了一周后,得到了正确的工作代码。

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

答案 1 :(得分:0)

只需替换

HTTP_TRANSPORT = GoogleNetHttpTransport.newTrustedTransport();

使用

HTTP_TRANSPORT = new NetHttpTransport();

现在检查。