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. プロジェクトを特定し、ToDo リスト サービス オブジェクトを設定する
  4. Tasks API を呼び出す

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

このドキュメントのサンプルでは、Java 用の Google API クライアント ライブラリを使用しています。以下の JAR を Android アプリに追加する必要があります。それには、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 は、環境で登録したアカウント([設定] > [アカウントと同期] に表示されるアカウント)を管理します。具体的には、認可フローを処理し、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) を呼び出すと、Account Chooser のダイアログが表示されます。

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 として使用する場合の問題は、認可ダイアログにアクセス対象の Google プロダクトの名前として文字列 oauth2:https://www.googleapis.com/auth/tasks が表示されることです。この問題を回避するために、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] > [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 は一定期間のみ有効であるため、期限が切れた場合は新しいトークンを取得する必要があります。これに対処する方法は 2 つあります。

  • API を介してリクエストを行うたびに、AccountManageraccessToken をリクエストします。AccountManager がトークンをキャッシュに保存しているため、この方法では問題ありません。
  • 403 エラーが発生し AccountManager に新しいトークンをリクエストするまで、accessToken を引き続き使用します。

API によるタスクの操作

この時点で、Tasks API デベロッパー ガイドに従って、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 のデフォルトのタスクリストにタスクを表示する

こちらのinstructionsに沿ってサンプルを実行してください。フィードバックやご質問は、Google Tasks API フォーラムにお気軽に投稿してください。