Android で Tasks API を使用する

警告: このドキュメントは非推奨です。OAuth 2.0 を使用して Android アプリを承認する方法については、Android Play 開発者サービスの認可に関するドキュメントをご覧ください。

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

Android アプリで Tasks API を使用するには、いくつかの手順が必要です。

  1. ユーザーの Google アカウントを選択する
  2. Task API の AccountManager から OAuth 2.0 アクセス トークンを取得する
  3. プロジェクトを特定して、タスク サービス オブジェクトを設定します
  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

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 メソッドで次の 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 認可フロー

ユーザーがアカウントを選択したので、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 によってアクティビティが開始され、承認ダイアログが表示されます。ユーザーは、自分のアカウントで 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 アクセス] > [シンプルな API アクセス] > [API キー] で確認できます。

APIs Console から API キーを取得する
APIs Console から 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 エラーが表示されるまで 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 クライアント ライブラリのサンプル リポジトリに新しいサンプルを追加しました。このサンプルは、Tasks API の使用許可をリクエストし、デフォルトのタスクリストのタスクを ListView に表示する、シンプルで完全な Android アプリです。

デフォルトのタスクリストのタスクを ListView に表示する
デフォルトのタスクリストのタスクを ListView に表示する

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