본문 바로가기
Programming/Android

[Android Evernote API] 안드로이드 버전 1.1.2를 위한 에버노트 SDK

by NAMP 2014. 12. 7.

안드로이드 버전 1.1.2를 위한 에버노트 SDK

Evernote API version 1.25

개요

이 SDK는 Evernote Cloud API 를 포함하고 OAuth 인증 기능을 제공한다. 이 SDK 는 안드로이드 라이브러리 프로젝트처럼 당신의 어플리케이션에 포함될 수 있도록 제공된다. 

필수조건

이 SDK의 코드를 사용하기 위해서는 http://dev.evernote.com/documentation/cloud 에서 API키를 얻어야 한다. 그 페이지에서 전체 API 문서를 찾을 수 있다. 

샘플 코드를 실행하기 위해서는 당신이 당신의 개발을 할 수 있는 샌드박스 서비스의 사용자 계정이 필요하다. https://sandbox.evernote.com/Registration.action 에 계정을 등록하라. 

아래 있는 설명들은 당신이 최근의 Android SDK 와 API 17 이 설치되어 있다고 가정한 것이다. 이클립스를 위한 설명들은 Eclipse Juno 와 latest Android development tools 에 기반하였다. Intellij 를 위한 설명은 Intellij IDEA 12 Community Edition 와 우리가 추천하는 IDE에 기반하였다. 

샘플 앱

샘플 어플리케이션 ''HelloEDAM'' 은 안드로이드에서 OAuth를 사용하여 어떻게 에버노트 서비스를 인증하는지, 사용자계정에 접근하기 위해서 어떻게  SDK를 사용하는지를 보여준다.  샘플 코드는 일반노트 생성과 이미지 저장의 두가지 시나리오를 통해 노트북 나열, 노트 생성, 자원 생성의 다양할 활동들을 제공한다. 

이클립스에서 샘플 앱 실행하기 

이클립스에서 샘플 프로젝트를 빌드하고 실행하기:

  1. 이클립스 실행 Open Eclipse
  2. 파일 메뉴에서 프로젝트 생성 실행 From the File menu, choose New and then Project...
  3. 안드로이드 밑의 존재하는 코드에서 안드로이드 프로젝트 생성 클릭 Under Android, select "Android Project from Existing Code" and click Next
  4. 찾기 클릭 Click Browse
  5. SDK 루트 디렉토리 선택 그리고 확인 클릭 Select the SDK root directory (the directory containing this README) and click OK
  6. 완료 클릭 Click Finish
  7. Hello EDAM 우클릭후 속성 클릭. 자바 빌드 패스 클릭, 프로젝트 탭 클릭 Right click Hello EDAM, click properties, click Java Build Path, click the Projects tab,
  8. 추가 클릭, 라이브러리 선택, 완료를 클릭하여 변경 Click Add and select library, click ok to accept changes.
  9. 패키지창에서 HelloEDAM프로젝트의 src  디렉토리를 확장하여 com.evernote.android.sample.ParentActivity.java 파일을 연다. From the Package Explorer, expand the HelloEDAM project's src directory and opencom.evernote.android.sample.ParentActivity.java
  10. ParentActivity.java  상단에 에버노트 API 카와 비밀번호를 입력한다. At the top of ParentActivity.java, fill in your Evernote API consumer key and secret.
  11. 프로젝트를 빌드하고 실행한다. Build and run the project

앱에 SDK 사용하기 

당신의 프로젝트에 SDK를 추가하는데 2가지 방법이 있다. 당신의 IDE에 안드로이드 라이브러리 프로젝트를 추가하는 것과 Maven을 사용하는 것이다. 

이클립스 작업공간에 안드로이드 라이브러리 프로젝트 추가하기

  1. 안드로이드 라이브러리 프로젝트 불러오기 Import the Android Library Project
    1. 이클립스 실행 Open Eclipse
    2. 파일메뉴에서, 새로 생성, 프로젝트 선택, From the File menu, choose New and then Project...
    3. 안드로이드 밑에, 존재하는 코드에서 안드로이드 프로젝트 선택후 다음 클릭 Under Android, select "Android Project from Existing Code" and click Next
    4. 찾기 클릭 Click Browse
    5. 라이브러리 디렉토리 선택 후, 열기 클릭 Select the library directory and click Open
    6. 완료 클릭 Click Finish
  2. 당신의 어플리케이션에 안드로이드 라이브러리 프로젝트 연결하기 Add the Android Library Project as a dependency in your app
    1. 프로젝트에서 우클릭 후에, 속성 선택 Right-click on your project and choose "Properties"
    2. 안드로이드 섹션에서, 라이브러리 영역에서 추가 클릭. In the Android section, in the Library area, click Add...
    3. 리스트에서 라이브러리 선택 후 OK 클릭. Select library from the list and click OK
    4. 자바빌드패스 클릭, 후 프로젝트 탭 선택. Click Java Build Path and then select the Projects tab
    5. 추가 클릭. Click Add...
    6. 라이브러리 선택후 OK 클릭. Select Library and click OK
    7. OK 클릭 .Click OK

메이븐 사용

메이븐일 사용해서 당신의 앱을 빌드한다면, 간단히 당신의 pom.xml 에 안드로이드 에버노트 SDK를 추가하면 된다. 

의존성으로 안드로이드 에버노트 SDK를 추가한다. :

<dependency>
    <groupId>com.evernote</groupId>
    <artifactId>android-sdk</artifactId>
    <version>1.1.2</version>
    <type>apklib</type>
</dependency>

AndroidManifest.xml 파일 수정

SDK의 OAuth 기능은 안드로이드의 액티비티처럼 AndroidManifest.xml 파일에 선언되어야 실행이 된다. 어플리케이션의 AndroidManifest.xml 파일에 단순히 아래에 있는 코드 조각을 복사해서 붙여 넣으면 된다. 

<activity android:name="com.evernote.client.android.EvernoteOAuthActivity" android:configChanges="orientation|keyboardHidden" />

※ 추가적으로 인터넷 접근 권한이 필요하다. 

AndroidManifest.xml 파일에 

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

내용을 추가한다 .

EvernoteSession 설정하기

당신의 앱 인증을 정의하라. 키, 비밀번호, 호스트. 다음을 참고하라. http://dev.evernote.com/documentation/cloud/

private static final String CONSUMER_KEY = "Your consumer key";
private static final String CONSUMER_SECRET = "Your consumer secret";
private static final EvernoteSession.EvernoteService EVERNOTE_SERVICE = EvernoteSession.EvernoteService.SANDBOX;

앱이 시작되면, 에버노트 인증을 위해 필요한 모든것을 가지고 있는  EvernoteSession 싱글톤을 초기화 한다. 정적으로 저장된  EvernoteSession 객체는 액티비티들 간에 전달할 필요가 없다. 더 나은 방법으로 당신의 어플리케이션 오브젝트나 부모 액티비티 오브젝트에서 onCreate()함수 안에서 getInstance()를 호출하면 된다.  

mEvernoteSession = EvernoteSession.getInstance(this, CONSUMER_KEY, CONSUMER_SECRET, EVERNOTE_SERVICE);

사용자에게 초기 인증 방법 제공

우리의 샘플 앱에는 인증 처리를 초기화하는 "Sign in to Evernote" 버튼이 있다. 당신은 이와 비슷하게 처리하거나, 초기에 에버노트에 관련된 함수 접근을 위해서 초기화하는 것을 비슷하게 처리할 것이다. 

mEvernoteSession.authenticate(this);

Evernote and Yinxiang Biji Service Bootstrapping

OAuth 인증을 완료하는 그 액티비티는 자동적으로 사용자가 Evernote service 인지Yinxiang service 인지 결정하며 자동적으로 종점 설정을 한다. 

onActivityResult에서 인증 완료하기

onActivityResult 안의 OAuth 액티비티를 확인함으로서 당신은 인증이 성공적이였는지 확인할 수 있다. 인증이 성공햇다면, 당신은 에버노트 API를 시작할 수 있다. 

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
  super.onActivityResult(requestCode, resultCode, data);
  switch(requestCode) {
    // Update UI when oauth activity returns result
    case EvernoteSession.REQUEST_CODE_OAUTH:
      if (resultCode == Activity.RESULT_OK) {
        // Authentication was successful, do what you need to do in your app
      }
      break;
  }
}

ClientFactory를 사용하여 비동기 클라이언트 생성하기 

당신은 EvernoteSession.getClientFactory() 을 호출하여 createNoteStore()createUserStore(), 그리고 createBusinessNoteStore()에 접근할 수 있다. 이 오브젝트들은 OnClickCallback<T> 콜백 인터페이스를 통해서 에버노트 API와 상호작용할 수 있는 비동기적으로 감싸여진 Client 오브젝트들을 반환할 것이다.

NoteStore.Client 또는 UserStore.Client 가 필요해서 밑줄이 그어진다면 getClient() 메소드를 통해서 접근할 수 있습니다. API 자바독스는 여기서 확인할 수 있습니다. http://dev.evernote.com/documentation/reference/javadoc/

개인 노트 정보 접근을 위한 주요 메소드 사용을 위하여 AsyncNoteStore 생성

mEvernoteSession.getClientFactory().createNoteStore();

사용자 관련 메소드 접근을 위해 AsyncUserStore 생성

mEvernoteSession.getClientFactory().createUserStore();

비즈니스 노트북에 접근하기 위해 AsyncBusinessNoteStoreClient 생성

mEvernoteSession.getClientFactory().createBusinessNoteStore();

공유 노트북에 접근하기 위해 AsyncLinkedNoteStoreClient 생성

mEvernoteSession.getClientFactory().createLinkedNoteStore(linkedNotebook);

비동기 API 호출을 위해 AsyncNoteStoreClient 를 사용합니다. 

비동기적으로 노트북 목록 얻기

public void listNotebooks() throws TTransportException {
  if (mEvernoteSession.isLoggedIn()) {
    mEvernoteSession.getClientFactory().createNoteStoreClient().listNotebooks(new OnClientCallback<List<Notebook>>() {
      @Override
      public void onSuccess(final List<Notebook> notebooks) {
        List<String> namesList = new ArrayList<String>(notebooks.size());
        for (Notebook notebook : notebooks) {
          namesList.add(notebook.getName());
        }
        String notebookNames = TextUtils.join(", ", namesList);
        Toast.makeText(getApplicationContext(), notebookNames + " notebooks have been retrieved", Toast.LENGTH_LONG).show();
      }

      @Override
      public void onException(Exception exception) {
        Log.e(LOGTAG, "Error retrieving notebooks", exception);
      }
    });
  }
}

비동기적으로 노트 생성하기 

public void createNote(String title, String content) throws TTransportException {
  if (mEvernoteSession.isLoggedIn()) {
    Note note = new Note();
    note.setTitle(title);
    note.setContent(EvernoteUtil.NOTE_PREFIX + content + EvernoteUtil.NOTE_SUFFIX);
    mEvernoteSession.getClientFactory().createNoteStoreClient().createNote(note, new OnClientCallback<Note>() {
      @Override
      public void onSuccess(final Note data) {
        Toast.makeText(getApplicationContext(), data.getTitle() + " has been created", Toast.LENGTH_LONG).show();
      }

      @Override
      public void onException(Exception exception) {
        Log.e(LOGTAG, "Error creating note", exception);
      }
    });
  }
}

에버노트 비즈니스 데이터 접근을 위해 AsyncBusinessNoteStoreClient 사용하기

  1. 사용자가 비즈니스 멤버인지 확인
  2. AsyncBusinessNoteStore 생성
  3. 백그라운드 스레드에서 동기적 메소드 호출 도는 UI 스레드에서 비동기적 메소드 호출

비즈니스 인증 토근은 자주 소멸되며, createBusinessNoteStore() 메소드에서 필요하다면 리프레쉬 됩니다. 

백그라운드 스레드로 비즈니스 계정에 노트을 생성을 하는 동기적 비즈니스 메소드를 사용한 예제

new Thread(new Runnable() {
  @Override
  public void run() {
    try {
      // Is the User member of a business
      if(mEvernoteSession.getClientFactory().createUserStoreClient().isBusinessUser()) {
        //Create an AsyncBusinessNoteStoreClient, gets valid auth token
        AsyncBusinessNoteStoreClient client = mEvernoteSession.getClientFactory().createBusinessNoteStoreClient();
        List<LinkedNotebook> notebooks = client.listNotebooks();
        //If the user has any business notebooks
        if(notebooks.size() > 0) {
          //Create a note in the first one
          Note note = new Note();
          note.setTitle("New Note");
          note.setContent(EvernoteUtil.NOTE_PREFIX + "Content of Note" + EvernoteUtil.NOTE_SUFFIX);
          final Note createdNote = client.createNote(note, notebooks.get(0));
          //Update user on UI thread
          runOnUiThread(new Runnable() {
            @Override
            public void run() {
              Toast.makeText(getApplicationContext(), createdNote.getTitle() + " has been created.", Toast.LENGTH_LONG).show();
            }
          });

        }
      } else {
        Log.d(LOGTAG, "Not a business User");
      }
    } catch(Exception exception) {
      Log.e(LOGTAG, "Error received::", exception);
    }
  }
}).start();


댓글