티스토리 뷰


참고

구글 캘린더 API 문서 - https://developers.google.com/google-apps/calendar/

구글 캘린더 API 안드로이드 샘플 - https://developers.google.com/google-apps/calendar/quickstart/android

샘플 따라하기 - http://solokim.tistory.com/6


샘플을 간단하게 따라한 지난 번 글에 이어서 이 글에서는 샘플을 간단히 분석하고 어떻게 동작하는지 알아보겠습니다.



샘플 구경하기


샘플의 내용은 간단히 말해 선택된 계정의 캘린더 이벤트를 불러와 화면에 띄워주는 어플리케이션이었습니다.


그럼 이 샘플이 어떻게 작동되는지 봅시다.


1. build.gradle

dependencies {
    compile fileTree
(dir: 'libs', include: ['*.jar'])
    compile
'com.android.support:appcompat-v7:23.4.0'
    compile
'com.google.android.gms:play-services-auth:9.0.2'
    compile
'pub.devrel:easypermissions:0.1.5'
    compile
('com.google.api-client:google-api-client-android:1.22.0') {
        exclude
group: 'org.apache.httpcomponents'
   
}
    compile
('com.google.apis:google-api-services-calendar:v3-rev202-1.22.0') {
        exclude
group: 'org.apache.httpcomponents'
   
}
   
}

우선 안드로이드 어플리케이션을 개발할 때 API를 사용하려면 gradle에 무슨 API 사용할 것인지 적어줘야 합니다.


play-services-auth:9.0.2 은 사용자 인증정보를 얻기 위한 API입니다.

어플리케이션 사용자의 Google 계정에 접속하기 위해 필요한 API죠.


easypermissions:0.1.5 은 이지퍼미션입니다.

인터넷으로 찾아보니 어플리케이션에서 퍼미션을 요청할 때 좀 더 간단히 만들 수 있게 도와주는 API라고 하네요.


google-api-client-android:1.22.0 과 google-api-services-calendar:v3-rev202-1.22.0 은 우리가 원하는 캘린더를 사용하기 위한 API입니다.


이렇게 다 넣었다면 gradle에서 API 사용준비가 끝났습니다.


2. AndroidManifest.xml

어플리케이션의 기본적인 정보가 들어있는 xml파일입니다.

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.GET_ACCOUNTS" />

어플리케이션에 권한을 얻어야 합니다.

필요한 권한은 'INTERNET', 'ACCESS_NETWORK_STATE', 'GET_ACCOUNT'입니다.

인터넷, 네트워크 정보, 계정 권한이 필요하네요.


3. Source

소스를 하나하나 다 설명하면 좋겠지만 너무 길어지기 때문에 간단히 어떻게 돌아가는지와 중요한 부분만 쓰겠습니다.

샘플 어플리케이션은 XML로 된 레이아웃이 따로 필요없이 onCreate에서 직접 만들어집니다.
그리고 나서 Google Calendar API를 사용하기 위한 작업이 시작됩니다.

3-1. Credential

// Initialize credentials and service object.
        mCredential
= GoogleAccountCredential.usingOAuth2(
                getApplicationContext
(), Arrays.asList(SCOPES))
               
.setBackOff(new ExponentialBackOff());

이 부분에서 mCredential에 GoogleAccountCredential을 이용해 사용자 인증을 얻습니다.


GoogleAccountCredential은 Google API를 사용할 때 필요한 인증서로 보시면 됩니다.

SCOPES부분에 필요한 API의 권한을 넣어주시면 됩니다.


이 샘플 어플리케이션은 읽기만 필요하기 때문에 

private static final String[] SCOPES = { CalendarScopes.CALENDAR_READONLY };

READONLY로 SCOPES가 들어가 있습니다.

만약 캘린더에 쓰는 것도 필요하다면 SCOPES에 

private static final String[] SCOPES = { CalendarScopes.CALENDAR };

를 집어 넣어야 겠죠?

자세한 부분은 https://developers.google.com/google-apps/calendar/auth 에서 확인해 주세요.


3-2. 조건

인증서를 얻었다면 인증서를 이용하여 Calendar API Service를 불러와야 합니다.

하지만 서비스를 동작시키기 전에 

인터넷이 연결되어 있어야하고, Google Play Service도 작동되고 있어야 하고 Service를 사용할 계정도 선택해야 합니다.


private void getResultsFromApi() {
       
if (! isGooglePlayServicesAvailable()) {
            acquireGooglePlayServices
();
       
} else if (mCredential.getSelectedAccountName() == null) {
            chooseAccount
();
       
} else if (! isDeviceOnline()) {
            mOutputText
.setText("No network connection available.");
       
} else {
           
new MakeRequestTask(mCredential).execute();
       
}
   
}

getResultsFromApi메서드는 이러한 경우들을 if문으로 분기를 두었습니다.

그리고 모든 것이 충족되었을 때 MakeRequestTask클래스를 이용하여 서비스를 실행시킵니다.


간단히 알아보자면,

첫번째.

isGooglePlayServieceAvailable는 Play Service가 실행되고 있는지 알려주는 메서드입니다.

Boolean값으로 리턴되기 때문에 충족시키지 못하면 acquireGooglePlayServices메서드를 실행시킵니다.


acquireGooglePlayServices는 Play Service를 실행시켜주는 메서드입니다.

Play Service를 얻지못하면 에러메세지가 나오게 되어있습니다.

두번째.

Play Service가 잘 실행되고 있으면 mCredential(인증)에 계정 정보를 넣어주어야 합니다.

안드로이드에서는 Google 계정을 하나만 사용할 수 있는 게 아니라 여러 개 사용할 수 있기 때문에 사용자에게 어떤 계정을 사용할 지 물어보아야 합니다.

계정정보가 없다면 chooseAccount메서드를 통해 계정을 선택해줍니다.


chooseAccount메서드는 위에서 본 EasyPermission API를 이용하여 계정을 선택해주네요.

EasyPermission API의 정보는 https://github.com/googlesamples/easypermissions 에서 확인해 주세요.

세번째.

다음은 기기가 인터넷에 연결되어 있는지 확인하고 있네요.

isDeviceOnline메서드는 기기가 온라인 상태인지를 알려주는 메서드입니다. 

Boolean값으로 리턴해 기기가 인터넷에 연결되어 있지 않다면 TextView에 'No network connection available.' 라고 사용자에게 보여주게 됩니다.



이렇게 각각 분기들을 잘 통과했으면 MakeRequestTask클래스를 불러옵니다.


3-3. Service

이제 MakeRequestTask 클래스를 알아보죠.


MakeRequestTask는 AsyncTask로 동작됩니다. 자바의 쓰레드로 보시면 되는데요.


AsyncTask는 어플리케이션이 동작 중에 동시에 다른 일도 동작시키려고 하기 위한 클래스입니다.

이 클래스를 상속시키면 해당 클래스는 동시에 일 할 준비가 되는 것이죠.


AsyncTask클래스에 대한 정보는

https://developer.android.com/reference/android/os/AsyncTask.html 이 곳에 있습니다.



MakeRequsetTask의 중요한 부분을 살펴봅시다.


첫번째. Service 생성

public MakeRequestTask(GoogleAccountCredential credential) {
           
HttpTransport transport = AndroidHttp.newCompatibleTransport();
           
JsonFactory jsonFactory = JacksonFactory.getDefaultInstance();
            mService
= new com.google.api.services.calendar.Calendar.Builder(
                    transport
, jsonFactory, credential)
                   
.setApplicationName("Google Calendar API Android Quickstart")
                   
.build();
       
}

MakeRequsetTask의 첫부분입니다. Calendar Service를 가져오기 위해 초기화를 시키는 부분인데요.


mService는 Calendar의 Builder를 이용해 Service를 만들었습니다.

Service를 실행시키기 위해 HttpTransport와 JsonFactory, GoogleAccountCredential이 필요하네요.


HttpTransport는 Service에 필요한 인터넷 규칙이라 생각하시면 될 것 같네요.

JsonFactory는 Service가 Json이라는 포맷으로 저장되기 때문에 필요합니다.

Credential은 인증서라 보시면 되는데요. 위에서 저장한 mCredential를 가져와 넣어주고 있습니다.


이렇게 bulid를 해서 Service가 생성되었습니다.


두번째. Events 생성

이제 이 Service를 사용해서 Google Calendar의 데이터들을 가져오게 됩니다.

getDataFromApi메서드를 사용하여 원하는 데이터를 가져오게 되죠.

private List<String> getDataFromApi() throws IOException {
           
// List the next 10 events from the primary calendar.
           
DateTime now = new DateTime(System.currentTimeMillis());
           
List<String> eventStrings = new ArrayList<String>();
           
Events events = mService.events().list("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) {
                   
// All-day events don't have start times, so just use
                   
// the start date.
                    start
= event.getStart().getDate();
               
}
                eventStrings
.add(
                       
String.format("%s (%s)", event.getSummary(), start));
           
}
           
return eventStrings;
       
}

Events는 Calendar의 Event들을 모아놓은 클래스입니다.

이 클래스를 생성하려면 Service에 list를 사용하여 가져와야 합니다.

Events events = mService.events().list("primary")
                   
.setMaxResults(10)
                   
.setTimeMin(now)
                   
.setOrderBy("startTime")
                   
.setSingleEvents(true)
                   
.execute();

list("primary")는 선택된 계정의 Google Calendar에서 대표인 달력을 선택합니다.

사용자가 주달력으로 설정해 놓은 달력을 이름을 모르더라도 'primary'로 주달력을 불러 올 수 있습니다.

Google Calendar는 여러 개의 Event를 구분할 수 있게 달력을 여러 개 만들 수 있습니다.

여러 개의 달력 중 어느 달력을 가져올 지 선택하는 것이죠.

제 달력에서는 main이 주달력으로 설정되어 있기 때문에 main의 Events를 가져오게 됩니다.


선택했다면 어떤 events들을 가져올 지 조건을 정해야 합니다.


차례대로

결과는 10개만 (setMaxResults)

지금 시간부터 (setTimeMin)

'startTime'으로 정렬하고 (setOrderBy)

SingleEvents도 보여줘 (setSingleEvents)

라고 조건이 정해져 있네요.


이렇게 Events안에 원하는 조건으로 데이터가 저장되게 됩니다.


4. 정리

Events안에는 가져온 Event정보들이 있고
Event들은 Json포맷으로 저장되어 있기 때문에 그 안의 정보들을 꺼내서 화면에 띄워야 합니다.
{
 
"kind": "calendar#events",
 
"etag": etag,
 
"summary": string,
 
"description": string,
 
"updated": datetime,
 
"timeZone": string,
 
"accessRole": string,
 
"defaultReminders": [
   
{
     
"method": string,
     
"minutes": integer
   
}
 
],
 
"nextPageToken": string,
 
"nextSyncToken": string,
 
"items": [
   
events Resource
 
]
}
Json포맷으로 위와 같이 저장됩니다.
Event를 String으로 변환하면 위의 포맷으로 쭈욱 나열된 String을 보게 될 것입니다.

Google Calendar API문서를 보시면 어떠한 정보들이 들어가 있는지 볼 수 있습니다.

샘플 어플리케이션은 Google Calendar API의 Events의 list를 이용해 Event를 얻고 이 Event데이터를 화면에 보여주고 있습니다.
개발자는 이 Event의 정보를 이용해서 자신이 만든 달력 레이아웃에 배치하면 되는 것이죠.



여기까지 Google Calendar API에 대해서 알아보았습니다.
저도 API를 공부하면서 쓴 글이어서 어색하네요.
이런 글을 처음 써보았고 API를 처음 써봤기 때문에 글이 많이 부족해 보이네요.
수정할 부분이나 빈약한 부분을 지적해주시면 감사하겠습니다.

부족한 글을 봐주신 분들 고맙습니다.

댓글
«   2024/04   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30
Total
Today
Yesterday