Я хочу запросить и добавить события в основной календарь пользователя, который уже вошел в приложение (с его / ее / его 'учетной записью 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);