Android에서 Tasks API 사용하기

경고: 이 문서는 지원 중단되었습니다. OAuth 2.0을 사용하여 Android 앱을 승인하는 방법에 관한 자세한 내용은 Android Play 서비스 승인 문서를 참고하세요.

이 문서에서는 Android에서 OAuth 2.0과 함께 Tasks API를 사용하는 방법을 설명합니다. 이 가이드에서는 사용자의 Google Tasks에 액세스하는 승인 메커니즘과 Android 애플리케이션에서 바로 사용할 수 있는 Tasks API 서비스 객체를 만드는 방법을 설명합니다.

Android 애플리케이션에서 Tasks API를 사용하려면 다음과 같은 몇 가지 단계가 필요합니다.

  1. 사용자의 Google 계정 선택
  2. Task API의 AccountManager에서 OAuth 2.0 액세스 토큰 가져오기
  3. 프로젝트를 식별하고 Tasks 서비스 객체를 설정합니다.
  4. Tasks API 호출

Google 클라이언트 라이브러리 가져오기

이 문서에 있는 샘플은 Java용 Google API 클라이언트 라이브러리를 사용합니다. Android 애플리케이션에 다음 jar를 추가해야 합니다. 이렇게 하려면 아래 나열된 jar를 Android 애플리케이션 루트의 /assets 폴더에 배치합니다. 이 문서가 오래될수록 새 버전이 있는지 확인하세요.

Google API 클라이언트 라이브러리 jar 및 Android 확장 프로그램을 가져옵니다 (모두 google-api-java-client-1.4.1-beta.zip의 일부).

  • google-api-client-1.4.1-beta.jar
  • google-api-client-extensions-android2-1.4.1-beta.jar
  • google-api-client-googleapis-1.4.1-beta.jar
  • google-api-client-googleapis-extensions-android2-1.4.1-beta.jar

Tasks 관련 jar를 가져옵니다.

종속 항목 가져오기 (google-api-java-client-1.4.1-beta.zip의 모든 부분):

  • commons-codec-1.3.jar
  • gson-1.6.jar
  • guava-r09.jar
  • httpclient-4.0.3.jar
  • httpcore-4.0.1.jar
  • jackson-core-asl-1.6.7.jar
  • jsr305-1.3.9.jar

Android의 Google 계정

Android 2.0부터 AccountManager는 개발자가 환경에 등록한 계정(설정 > 계정 및 동기화에 나열된 계정)을 관리합니다. 특히 승인 흐름을 처리하고 API를 사용하여 데이터에 액세스하는 데 필요한 승인 토큰을 생성할 수 있습니다.

Android 환경에 등록된 계정
Android 환경에 등록된 계정

AccountManager를 사용하여 계정을 가져오고 승인 토큰을 요청하려면 Android 애플리케이션 매니페스트에 다음 권한을 추가해야 합니다.

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

AccountManager를 사용하여 Tasks에 액세스하려는 Google 계정을 가져올 수 있습니다. AccountManager는 Google 계정뿐만 아니라 다른 공급업체의 계정도 관리합니다. 따라서 아래 코드를 사용하여 Google 계정을 구체적으로 요청해야 합니다.

AccountManager accountManager = AccountManager.get(activity);
Account[] accounts = accountManager.getAccountsByType("com.google");

또는 자바용 Google API 클라이언트 라이브러리에는 Google 계정만 처리하는 GoogleAccountManager가 제공됩니다.

GoogleAccountManager googleAccountManager = new GoogleAccountManager(activity);
Account[] accounts = googleAccountManager.getAccounts();

Android 기기에서 사용할 수 있는 Google 계정이 두 개 이상인 경우 다음과 같은 대화상자를 사용하여 사용자에게 사용할 계정을 묻는 메시지를 표시해야 합니다.

계정 선택 대화상자
계정 선택 대화상자

활동의 onCreateDialog 메서드에서 다음과 같은 switch/case 코드를 사용하여 이러한 대화상자를 빌드할 수 있습니다.

@Override
protected Dialog onCreateDialog(int id) {
  switch (id) {
    case DIALOG_ACCOUNTS:
      AlertDialog.Builder builder = new AlertDialog.Builder(this);
      builder.setTitle("Select a Google account");
      final Account[] accounts = accountManager.getAccountsByType("com.google");
      final int size = accounts.length;
      String[] names = new String[[]size];
      for (int i = 0; i < size; i++) {
        names[[]i] = accounts[[]i].name;
      }
      builder.setItems(names, new DialogInterface.OnClickListener() {
        public void onClick(DialogInterface dialog, int which) {
          // Stuff to do when the account is selected by the user
          gotAccount(accounts[[]which]);
        }
      });
      return builder.create();
  }
  return null;
}

showDialog(DIALOG_ACCOUNTS)를 호출하면 계정 선택기 대화상자가 표시됩니다.

Android의 Google API 승인 흐름

이제 사용자가 계정을 선택했으므로 AccountManager에 Task API의 OAuth 2.0 액세스 토큰을 발급해 달라고 요청할 수 있습니다. AccountManager.getAuthToken() 메서드를 호출하면 됩니다. AccountManager.getAuthToken() 호출 중에 AccountManager가 Google API 승인 엔드포인트에 문의합니다. AccountManager가 승인 토큰을 가져오면 메서드 호출에서 정의한 AccountManagerCallback이 실행됩니다.

manager.getAuthToken(account, AUTH_TOKEN_TYPE, null, activity, new AccountManagerCallback<Bundle>() {
    public void run(AccountManagerFuture<Bundle> future) {
      try {
        // If the user has authorized your application to use the tasks API
        // a token is available.
        String token = future.getResult().getString(AccountManager.KEY_AUTHTOKEN);
        // Now you can use the Tasks API...
        useTasksAPI(token);
      } catch (OperationCanceledException e) {
        // TODO: The user has denied you access to the API, you should handle that
      } catch (Exception e) {
        handleException(e);
      }
    }
  }, null);

알고 계시겠지만 Android AccountManager는 OAuth 2.0을 실험적으로 지원합니다. AUTH_TOKEN_TYPE을 설정할 때 액세스하려는 API의 범위에 oauth2:를 접두사로 추가하기만 하면 됩니다. 따라서 Tasks API의 경우 다음을 사용할 수 있습니다.

String AUTH_TOKEN_TYPE = "oauth2:https://www.googleapis.com/auth/tasks";

위 값을 AUTH_TOKEN_TYPE으로 사용하면 승인 대화상자에 액세스하려는 Google 제품의 이름으로 oauth2:https://www.googleapis.com/auth/tasks 문자열이 표시됩니다. 이 문제를 해결하기 위해 Tasks API에는 사람이 읽을 수 있는 특수 AUTH_TOKEN_TYPE 별칭이 있습니다. OAuth 2.0 범위를 사용하는 것과 같습니다. 예를 들어 다음을 사용할 수 있습니다.

String AUTH_TOKEN_TYPE = "Manage your tasks";

Tasks API 읽기 전용 범위(oauth2:https://www.googleapis.com/auth/tasks.readonly)와 동일한 AUTH_TOKEN_TYPE 별칭 View your tasks를 사용할 수도 있습니다.

AccountManager.getAuthToken() 호출 중에 AccountManager는 애플리케이션이 Tasks API에 액세스하도록 승인되었는지 확인합니다. 애플리케이션이 아직 승인되지 않은 경우 AccountManager에서 Activity를 시작합니다. 이 Activity는 사용자에게 승인 대화상자를 표시하여 사용자가 애플리케이션이 자신의 계정에서 Tasks API를 사용하도록 허용하거나 거부할 수 있도록 합니다.

승인 대화상자
승인 대화상자

사용자가 Tasks API에 대한 애플리케이션 액세스를 거부하면 future.getResult() 호출 중에 OperationCanceledException이 발생합니다. 예를 들어 계정을 다시 선택하도록 요청하거나 액세스를 다시 승인하는 버튼이 있는 메시지를 표시하여 이를 적절하게 처리해야 합니다.

애플리케이션 식별 및 Tasks API 서비스 객체 설정

이제 애플리케이션에 Tasks API에 액세스할 권한이 있고 액세스 토큰이 부여되었으므로 Tasks API를 호출하는 데 필수이므로 Google API 콘솔의 프로젝트에서 가져와야 하는 API 키도 필요합니다. 방법은 다음과 같습니다.

  1. 프로젝트 만들기 또는 기존 프로젝트 사용
  2. Tasks API 스위치를 ON으로 전환하여 프로젝트에서 Tasks API를 사용 설정합니다.
  3. API 키API 액세스 > 간단한 API 액세스 > API 키에서 확인할 수 있습니다.

API 콘솔에서 API 키 가져오기
API 콘솔에서 API 키 가져오기

API 키는 애플리케이션을 식별하므로 API가 할당량을 차감하고 프로젝트에 정의된 할당량 규칙을 사용할 수 있도록 허용하므로 필수입니다. Tasks 서비스 객체에서 API 키를 지정해야 합니다.

useTasksAPI(String accessToken) {
  // Setting up the Tasks API Service
  HttpTransport transport = AndroidHttp.newCompatibleTransport();
  AccessProtectedResource accessProtectedResource = new GoogleAccessProtectedResource(accessToken);
  Tasks service = new Tasks(transport, accessProtectedResource, new JacksonFactory());
  service.accessKey = INSERT_YOUR_API_KEY;
  service.setApplicationName("Google-TasksSample/1.0");

  // TODO: now use the service to query the Tasks API
}

accessToken은 일정 시간 동안만 유효하므로 만료되면 새 토큰을 가져와야 합니다. 이 문제를 처리하는 방법에는 두 가지가 있습니다.

  • API를 통해 요청할 때마다 AccountManageraccessToken을 요청합니다. AccountManager가 토큰을 캐시하므로 이 솔루션은 허용됩니다.
  • 403 오류가 발생할 때까지 accessToken을 계속 사용하고, 이때 AccountManager에 새 토큰을 요청합니다.

API를 통한 Tasks 조작

이 시점에서 Tasks API 개발자 가이드에 따라 API를 쿼리하는 데 사용할 수 있는 완전히 설정된 Tasks API 서비스 객체가 있어야 합니다. 예를 들면 다음과 같습니다.

// Getting all the Task lists
List taskLists = service.tasklists.list().execute().items;

// Getting the list of tasks in the default task list
List tasks = service.tasks.list("@default").execute().items;

// Add a task to the default task list
Task task = new Task();
task.title = "New Task";
task.notes = "Please complete me";
task.due = "2010-10-15T12:00:00.000Z";
Task result = service.tasks.insert("@default", task).execute();

Android 애플리케이션 매니페스트에 인터넷에 액세스할 수 있는 권한을 추가해야 합니다. 그러지 않으면 위의 Tasks API 엔드포인트 요청이 실패합니다.

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

샘플 애플리케이션

최근 Android에서 Tasks API 및 OAuth 2.0을 시작하는 데 도움이 되는 새로운 샘플이 Java용 Google API 클라이언트 라이브러리 샘플 저장소에 추가되었습니다. 이 샘플은 Tasks API를 사용하고 ListView에 기본 작업 목록의 작업을 표시하기 위한 권한을 요청하는 간단하지만 완전히 작동하는 Android 애플리케이션입니다.

ListView의 기본 할 일 목록에 할 일 표시
ListView의 기본 할 일 목록에 할 일 표시

안내에 따라 샘플을 실행하고 Google Tasks API 포럼에 의견이나 질문을 게시해 주세요.