API Календаря Google на токене доступа Android - PullRequest
0 голосов
/ 12 апреля 2019

Я хочу запросить и добавить события в основной календарь пользователя, который уже вошел в приложение (с его / ее / его 'учетной записью Google).

Я зашел так далеко:

class CalendarClient {
    private static final String APPLICATION_NAME = "TrackTransfer";
    private static final JsonFactory JSON_FACTORY = JacksonFactory.getDefaultInstance();

    private final String token;

    CalendarClient (String token){
        this.token = token;
    }

    private Credential getCredentials() {
        return new GoogleCredential().setAccessToken(token);
    }

    void print() throws IOException {
        // Build a new authorized API client service.
        final NetHttpTransport HTTP_TRANSPORT = new com.google.api.client.http.javanet.NetHttpTransport();
        Calendar service = new Calendar.Builder(HTTP_TRANSPORT, JSON_FACTORY, getCredentials())
                .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(10)
                .setTimeMin(now)
                .setOrderBy("startTime")
                .setSingleEvents(true)
                .execute();
        List<Event> items = events.getItems();
        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);
            }
        }
    }

}

, и я называю это так из действия, когда пользователь уже вошел в систему, а зарегистрированный аккаунт представлен как account.

private void writeToCalendar()  {
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Log.d("CAL", "token: " + account.getIdToken());
                CalendarClient c = new CalendarClient(account.getIdToken());
                c.print();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }).start();

}

Однако account.getIdToken() равно Null, даже если пользователь выполнил вход. Я также попытался установить токен для идентификатора клиента, который я получаю для своего приложения, в консоли разработчика Google, что также не работает.

Естественно, когда токен Null, я получаю исключение, сообщающее, что контингент для неподписанных в api-calles превышен.

Доступ к Fitness API непосредственно перед вызовом writeToCalendar() не был проблемой сэта учетная запись (поэтому он вошел в систему).

Я просмотрел различные ресурсы, но ни один из них не оказался полезным.Документация Google API была о Java и использовала учетные данные, полученные из консоли разработчика;однако, поскольку я хочу аутентифицироваться с использованием OAuth, это не правильно (я полагаю?).Затем я обнаружил, что можно использовать GoogleCredential().setAccessToken(token), но я не мог понять, какой токен используется.

Как получить правильный токен?

Обновление

При запросе областей для входа в учетную запись, это просто с фитнес-API:

FitnessOptions fitnessOptions = FitnessOptions.builder()
                .addDataType(DataType.TYPE_DISTANCE_DELTA, FitnessOptions.ACCESS_READ)
                .addDataType(DataType.TYPE_STEP_COUNT_DELTA, FitnessOptions.ACCESS_READ)
                .build();
GoogleSignInAccount gsa = GoogleSignIn.getAccountForExtension(this, fitnessOptions);

с обратным вызовом, который выглядит примерно так:

account = completedTask.getResult(ApiException.class);

Тем не менее, при запросе области действия для api календаря правильно ли указано следующее:

GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
                .requestEmail()
                .requestScopes(new Scope("https://www.googleapis.com/auth/calendar"))
                .build();
GoogleSignInClient tempClient = GoogleSignIn.getClient(this, gso);

Ответы [ 2 ]

1 голос
/ 13 апреля 2019

Войти

вход

Я также обнаружил, что вам может понадобиться использовать oauth, прежде чем API даст вам токен доступа:

auth

Тогда я бы проверил, нужен ли ему один из API, для которого нужно включить платежную учетную запись. Это может быть. Это не означает, что вам нужно платить ... в зависимости от API Google делает вам «включить» биллинг. Не уверен, является ли этот API одним из таких.

информация

0 голосов
/ 13 апреля 2019

С высокой вероятностью, что существующий логин не имеет требуемых oAuth2 областей .

Запрос этих ранее уже должен предоставить области для доступа кAPI.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...