警告: このドキュメントは非推奨です。OAuth 2.0 を使用して Android アプリを承認する方法については、Android Play 開発者サービスの認可に関するドキュメントをご覧ください。
このドキュメントでは、Android で OAuth 2.0 を使用して Tasks API を使用する方法について説明します。ユーザーの Google タスクにアクセスするための認可メカニズムと、Android アプリですぐに使用できる Tasks API サービス オブジェクトを取得する方法について説明します。
Android アプリで Tasks API を使用するには、いくつかの手順が必要です。
- ユーザーの Google アカウントを選択する
- Task API の AccountManager から OAuth 2.0 アクセス トークンを取得する
- プロジェクトを特定して、タスク サービス オブジェクトを設定します
- 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 を使用してデータにアクセスするために必要な認可トークンを生成できます。

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] ダイアログ](https://developers.google.cn/static/workspace/tasks/images/Android_Choose_Account.png?hl=ja)
このようなダイアログを作成するには、アクティビティの 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 コンソールのプロジェクトから取得する必要があります。手順は次のとおりです。
- プロジェクトを作成するか、既存のプロジェクトを使用する
- Tasks API スイッチを [オン] に切り替えて、プロジェクトで Tasks 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 を介してリクエストを行うたびに、AccountManager に accessToken をリクエストします。AccountManager はトークンをキャッシュに保存するため、このソリューションは許容されます。
- 403 エラーが表示されるまで accessToken を使用し、エラーが表示されたら AccountManager に新しいトークンをリクエストします。
API によるタスクの操作
この時点で、Tasks API デベロッパー ガイドに沿って API にクエリを実行するために使用できる、Tasks API のサービス オブジェクトが完全に設定されているはずです。次に例を示します。
// Getting all the Task lists ListtaskLists = 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 アプリです。

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