我想查询并将事件添加到已登录到应用程序的用户的主日历中(使用他/她/其“谷歌帐户”)。
我走到这一步:
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开发者控制台中为我的应用程序获取的客户端ID,但这也不起作用。
自然地,当令牌是Null
时,我得到一个例外,说明超过了非签名api calles的队伍。
在调用writeToCalendar()
之前访问Fitness API并不是该帐户的问题(因此它已登录)。
我查看了各种资源,但都没有证明有用。 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);