Android で Tasks API を使用する

警告: このドキュメントは非推奨となりました。 OAuth 2.0 を使用した Android アプリの認証については、 Android Play 開発者サービスの承認に関するドキュメント

このドキュメントでは、Android で OAuth 2.0 とともに Tasks API を使用する方法について説明します。ここでは、ユーザーの Google ToDo リストへのアクセス権を取得するための承認メカニズムと、Android アプリで Tasks API サービス オブジェクトを使用する準備を整える方法について説明します。

Android アプリで Tasks API を使用するには、以下の手順を行う必要があります。

  1. ユーザーの Google アカウントを選択します。
  2. Task API の AccountManager から OAuth 2.0 アクセス トークンを取得する
  3. プロジェクトを特定し、Tasks サービス オブジェクトを設定する
  4. Tasks API を呼び出す

Google のクライアント ライブラリをインポートする

このドキュメントのサンプルでは、Java 用 Google API クライアント ライブラリを使用しています。次の jar を Android アプリに追加する必要があります。それには、以下の 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

タスク固有の 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 を使用して、ToDo リストにアクセスする 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 アカウントを使用できる場合は、次のようなダイアログを使用して、使用したいアカウントをユーザーに確認します。

[Choose an account] ダイアログ
[Choose an account] ダイアログ

このようなダイアログを作成するには、アクティビティの 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 承認フロー

ユーザーがアカウントを選択したら、Task API 用の OAuth 2.0 アクセス トークンを発行するように AccountManager に要求します。これを行うには、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";

AUTH_TOKEN_TYPE エイリアスを使用することもできます。 タスクを表示する。これは Tasks API の読み取り専用権限に相当します。 スコープ: oauth2:https://www.googleapis.com/auth/tasks.readonly

AccountManager.getAuthToken() の呼び出し中に、AccountManager はアプリケーションに Tasks API へのアクセスが許可されているかどうかを確認します。アプリがまだ承認されていない場合は、AccountManager によって Activity が開始されます。ユーザーに承認ダイアログが表示され、ユーザーは自分のアカウントで 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 >シンプルな API アクセス >API キー

API コンソールから API キーを取得する
API コンソールから API キーを取得する

API キーはアプリケーションを識別し、API が割り当てを差し引いてプロジェクトに定義されている割り当てルールを使用できるようにするため、必須です。Tasks service オブジェクトに 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 は一定期間のみ有効です。期限が切れた場合は新しいトークンを取得する必要があります。これには次の 2 つの方法があります。

  • API を通じてリクエストを行うたびに、AccountManageraccessToken をリクエストします。AccountManager がトークンをキャッシュするため、このソリューションは使用できます。
  • 403 エラーが発生し、AccountManager に新しいトークンをリクエストするまで、accessToken を引き続き使用してください。

API によるタスクの操作

この時点で、Tasks API service オブジェクトを完全に設定したはずです。このオブジェクトを使用して、Tasks API デベロッパー ガイドのとおりに 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 フォーラムにお気軽に投稿してください。