警告: このドキュメントのサポートは終了しています。OAuth 2.0 を使用して Android アプリを認可する方法については、Android Play 開発者サービスの承認に関するドキュメントをご覧ください。
このドキュメントでは、Android で OAuth 2.0 とともに Tasks API を使用する方法について説明します。ここでは、ユーザーの Google ToDo リストにアクセスするための承認メカニズムと、Android アプリで Tasks API サービス オブジェクトを使用できるようにする方法について説明します。
Android アプリで Tasks API を使用するには、いくつかの手順を実施する必要があります。
- お客様の Google アカウントを選択します。
- Task API 用の AccountManager から OAuth 2.0 アクセス トークンを取得する
- プロジェクトを特定し、ToDo リスト サービス オブジェクトを設定する
- 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 を使用してデータにアクセスするために必要な認証トークンを生成できます。
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 アカウントを利用できる場合は、次のようなダイアログで、使用したいアカウントの入力をユーザーに促します。
このようなダイアログを作成するには、アクティビティの 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 コンソールでプロジェクトから取得する必要があります。手順は次のとおりです。
- プロジェクトを作成するか、既存のプロジェクトを使用してください
- Tasks API のスイッチをオンに切り替えて、プロジェクトで Tasks API を有効にします。
- API キーは [API Access] > [Simple API Access] > [API Key] で確認できます。
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 を介してリクエストを行うたびに、AccountManager に accessToken をリクエストします。AccountManager がトークンをキャッシュに保存しているため、この方法では問題ありません。
- 403 エラーが発生し AccountManager に新しいトークンをリクエストするまで、accessToken を引き続き使用します。
API によるタスクの操作
この時点で、Tasks API デベロッパー ガイドに従って、Tasks API サービス オブジェクトが完全に設定されました。これを使用して 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 アプリケーションです。
こちらのinstructionsに沿ってサンプルを実行してください。フィードバックやご質問は、Google Tasks API フォーラムにお気軽に投稿してください。