Google Cloud Calendar API 설정
Step 1. 구글 콘솔 사이트 들어가기
Step 2. 프로젝트 만들기
Google Cloud Platfrom 에서 프로젝트를 생성해야 해당 Project ID를 통해 Calendar API 등 여러 API를 사용할 수 있습니다.
Step 3. 프로젝트 이름을 입력하고 만들기를 눌러주세요.
Step 4.라이브러리에서 Google Calendar API 설정
Step 5. 인증정보 만들기
사용자 인증 정보 만들기 위해 OAuth에 대해 사용자에게 동의를 구할 때 나오는 화면을 설정해 주어야 합니다. Google Cloud Platform G Suite 계정이 아니면 내부 User Type 선택이 불가능 하므로 외부로 설정합시다.
동의화면은 외부만 선택이 가능합니다. 하지만 외부를 선택하게 되면 앱의 확인절차가 필요하다고 합니다. ( API를 사용하려고 하는 앱을 확인 하는 절차를 의미하는 듯 합니다.)
동의화면 이름 설정과 범위를 설정해줍니다. 기본 범위에는 Calendar가 추가가 안되어 있기 때문에 잘 보고 선택해야 합니다.
Note. OAuth 사용시 앱의 확인 절차 없이 사용 가능한 것 같다. 필자도 테스트 용으로 확인 절차 없이 성공하였으나 프로덕션을 테스트 하지못해서 확실한 정보는 아니다.
서명 인증서와 Android 패키지를 등록합니다. 예시로 제시해주는 코드는 디버그 KEY
이므로 이후 프로덕션 릴리즈 하기위해선 App Release key
로 인증서를 다시 추가해주어야 합니다.
C : keytool -keystore "%USERPROFILE%\.android\debug.keystore" -list -v
C : 키 저장소 비밀번호 입력: android
keytool 명령어가없다면 Java 환경변수 등록이 필요합니다.
Android 설정
Android 환경 설정
Google Calendar API를 사용하기 위해서는 아래와 같은 퍼미션이 필요합니다.
- 인터넷 상태 접근을 위한 퍼미션
- 인터넷 연결 퍼미션
- 핸드폰에 저장되어 있는 구글 계정을 불러오기 위한 퍼미션
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />
build.gradle 추가
pub.devrel:easypermissions 라이브러리는 사용자에게 퍼미션 권한을 얻는 라이브러리이므로, 필수는 아닙니다.
개발자 본인에 맞는 권한 라이브러리를 사용하면 됩니다.
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.google.android.gms:play-services-auth:18.0.0'
implementation 'pub.devrel:easypermissions:0.3.0'
implementation('com.google.api-client:google-api-client-android:1.22.0') {
exclude group: 'org.apache.httpcomponents'
}
implementation('com.google.apis:google-api-services-calendar:v3-rev235-1.22.0') {
exclude group: 'org.apache.httpcomponents'
}
Google Calendar API 사용
Calendar 추가
/*
* 선택되어 있는 Google 계정에 새 캘린더를 추가한다.
*/
private String createCalendar() throws IOException {
String ids = getCalendarID("CalendarTitle");
if ( ids != null ){
return "이미 캘린더가 생성되어 있습니다. ";
}
// 새로운 캘린더 생성
com.google.api.services.calendar.model.Calendar calendar = new Calendar();
// 캘린더의 제목 설정
calendar.setSummary("CalendarTitle");
// 캘린더의 시간대 설정
calendar.setTimeZone("Asia/Seoul");
// 구글 캘린더에 새로 만든 캘린더를 추가
Calendar createdCalendar = mService.calendars().insert(calendar).execute();
// 추가한 캘린더의 ID를 가져옴.
String calendarId = createdCalendar.getId();
// 구글 캘린더의 캘린더 목록에서 새로 만든 캘린더를 검색
CalendarListEntry calendarListEntry = mService.calendarList().get(calendarId).execute();
// 캘린더의 배경색을 파란색으로 표시 RGB
calendarListEntry.setBackgroundColor("#0000ff");
// 변경한 내용을 구글 캘린더에 반영
CalendarListEntry updatedCalendarListEntry =
mService.calendarList()
.update(calendarListEntry.getId(), calendarListEntry)
.setColorRgbFormat(true)
.execute();
// 새로 추가한 캘린더의 ID를 리턴
return "캘린더가 생성되었습니다.";
}
이벤트(일정) 추가
private String addEvent() {
String calendarID = getCalendarID("CalendarTitle");
if ( calendarID == null ){
return "캘린더를 먼저 생성하세요.";
}
Event event = new Event()
.setSummary("구글 캘린더 테스트")
.setLocation("서울시")
.setDescription("캘린더에 이벤트 추가하는 것을 테스트합니다.");
java.util.Calendar calender;
calender = java.util.Calendar.getInstance();
SimpleDateFormat simpledateformat;
//simpledateformat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ssZ", Locale.KOREA);
// Z에 대응하여 +0900이 입력되어 문제 생겨 수작업으로 입력
simpledateformat = new SimpleDateFormat( "yyyy-MM-dd'T'HH:mm:ss+09:00", Locale.KOREA);
String datetime = simpledateformat.format(calender.getTime());
DateTime startDateTime = new DateTime(datetime);
EventDateTime start = new EventDateTime()
.setDateTime(startDateTime)
.setTimeZone("Asia/Seoul");
event.setStart(start);
Log.d( "@@@", datetime );
DateTime endDateTime = new DateTime(datetime);
EventDateTime end = new EventDateTime()
.setDateTime(endDateTime)
.setTimeZone("Asia/Seoul");
event.setEnd(end);
//String[] recurrence = new String[]{"RRULE:FREQ=DAILY;COUNT=2"};
//event.setRecurrence(Arrays.asList(recurrence));
try {
event = mService.events().insert(calendarID, event).execute();
} catch (Exception e) {
e.printStackTrace();
Log.e("Exception", "Exception : " + e.toString());
}
System.out.printf("Event created: %s\n", event.getHtmlLink());
Log.e("Event", "created : " + event.getHtmlLink());
String eventStrings = "created : " + event.getHtmlLink();
return eventStrings;
}
이벤트 가져오기
/*
* CalendarTitle 이름의 캘린더에서 10개의 이벤트를 가져와 리턴
*/
private String getEvent() throws IOException {
DateTime now = new DateTime(System.currentTimeMillis());
String calendarID = getCalendarID("CalendarTitle");
if ( calendarID == null ){
return "캘린더를 먼저 생성하세요.";
}
Events events = mService.events().list(calendarID)//"primary")
.setMaxResults(10)
//.setTimeMin(now)
.setOrderBy("startTime")
.setSingleEvents(true)
.execute();
List<Event> items = events.getItems();
for (Event event : items) {
DateTime start = event.getStart().getDateTime();
if (start == null) {
// 모든 이벤트가 시작 시간을 갖고 있지는 않다. 그런 경우 시작 날짜만 사용
start = event.getStart().getDate();
}
eventStrings.add(String.format("%s \n (%s)", event.getSummary(), start));
}
return eventStrings.size() + "개의 데이터를 가져왔습니다.";
}
'Android > Common' 카테고리의 다른 글
[Android] MVC 적용하기 (0) | 2020.07.07 |
---|---|
[Android] 내부 DB - Room (0) | 2020.06.03 |
[Android] 바인딩 서비스로 음악 재생 (0) | 2020.04.29 |
[Android] DataBinding 정리 (0) | 2020.04.25 |
[Android] 로또 정보 크롤링해보기 by Kotlin (4) | 2020.04.08 |