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를 추가해야 합니다. 이렇게 하려면 Android 애플리케이션의 루트에 있는 /assets 폴더에 아래에 나열된 jar를 넣습니다. 또한 문서가 오래되면 새 버전을 확인하세요.

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가 환경에 등록된 계정(Settings > Accounts & sync 아래 나열된 계정)을 관리합니다. 특히 승인 흐름을 처리하며 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");

또는 Java용 Google API 클라이언트 라이브러리는 Google 계정만 처리하는 GoogleAccountManager와 함께 제공됩니다.

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

Android 기기에서 두 개 이상의 Google 계정을 사용할 수 있는 경우 다음과 같은 대화상자를 통해 사용자가 사용하려는 계정을 입력하라는 메시지를 표시해야 합니다.

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

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

@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으로 사용할 때 문제는 oauth2:https://www.googleapis.com/auth/tasks 문자열이 액세스하려는 Google 제품의 이름으로 승인 대화상자에 표시된다는 점입니다. 이 문제를 해결하기 위해 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에 액세스하도록 승인되었는지 확인합니다. 애플리케이션이 아직 승인되지 않은 경우 AccountManagerActivity를 시작하여 사용자에게 승인 대화상자를 표시합니다. 사용자는 이 대화상자에서 자신의 계정에서 Tasks API를 사용하는 것을 허용 또는 거부할 수 있습니다.

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

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

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

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

  1. 프로젝트 만들기 또는 기존 프로젝트 사용
  2. Tasks API 스위치를 사용으로 전환하여 프로젝트에서 Tasks API를 사용 설정합니다.
  3. API 키API Access > Simple API Access > API Key에서 찾을 수 있습니다.

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 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 클라이언트 라이브러리 샘플 저장소에 새로운 샘플을 추가했습니다. 이 샘플은 간단하지만 완전히 작동하는 Android 애플리케이션으로, Tasks API를 사용하고 ListView에 기본 작업 목록의 작업을 표시하기 위한 승인을 요청합니다.

ListView의 기본 작업 목록에 작업 표시
ListView의 기본 작업 목록에 작업 표시

instructions에 따라 샘플을 실행하고, 의견이나 질문이 있으면 언제든지 Google Tasks API 포럼에 게시해 주세요.