メインコンテンツへスキップ
このドキュメントは Mobile + API アーキテクチャシナリオの一部であり、Android でモバイルアプリケーションを実装する方法について説明します。実装するソリューションの詳細については、このシナリオを参照してください。

ステップ 1. アプリケーションをセットアップする

サンプルプロジェクト

まずは、このチュートリアル用のサンプルプロジェクトをダウンロードしてください。 ダウンロード GitHub でフォーク システム要件
  • Android Studio 2.3
  • Android SDK 25
  • エミュレーター - Nexus 5X - Android 6.0
要件を表示

依存関係を設定する

この実装では、アプリのbuild.gradleファイルで次の依存関係を使用します。
  • Auth0.Android: このパッケージを使用すると、Auth0 と統合してユーザーを認証できます。
  • OkHttp: このパッケージは、Node.js API にリクエストを送信するための HTTP クライアントを提供します。
  • JWTDecode.Android: このパッケージは、のデコードに役立ちます。
  • AppCompat: このパッケージを使用すると、アクティビティ内のナビゲーションに toolbar ウィジェットを利用できます。

マニフェストを更新する

アプリケーションのAndroidManifest.xmlを開き、インターネット アクセス権限を追加します。
アプリケーションの詳細も更新し、Toolbar ウィジェットを利用するようにします。

設定値を指定する

/res/values/strings.xml にある strings.xml リソースに、Auth0 の 、Auth0 ドメイン、および API の URL を設定します。
この実装では、アプリケーションパッケージ内に activitiesmodelsutils 用のディレクトリを作成します。
  • activities/: このパッケージには、LoginActivity.javaTimeSheetActivity.javaFormActivity.javaUserActivity.java を配置します。
  • models/: このパッケージには、TimeSheet.javaUser.java のデータモデルを配置します。
  • utils/: このパッケージには、UserProfileManager.javaTimeSheetAdapter.javaImageTask.java を配置します。

ステップ 2. ユーザーを認可する

マニフェストを更新する

アプリのAndroidManifest.xmlを開き、LoginActivityを追加します。

Login Activity を作成する

LoginActivity はユーザーの認可を処理し、ユーザーに最初に表示される画面になります。WebAuthProvider を初期化して認証を開始するための login() メソッドを作成します。WebAuthProvider には、正しい scheme、、およびスコープを指定してください。この実装では次を使用します。
  • scheme: demo
  • audience: https://api.exampleco.com/timesheets (Node.JS API)
  • response_type: code
  • scope: create:timesheets read:timesheets openid profile email offline_access。これらのスコープにより、Node.JS API に対して POSTGET を実行できるほか、ユーザープロフィールと を取得できます。
login() メソッドでは、認証に成功すると、ユーザーは TimeSheetActivity にリダイレクトされます。

認証情報を保存する

ログイン後に受け取った認証情報を保存するには、Auth0.Android ライブラリの CredentialsManager と、保存先として SharedPreferences を使用します。 login() メソッドで WebAuthProvider を初期化する前に、CredentialsManager を作成できます。AuthenticationAPIClientCredentialsManager に渡すと、有効期限が切れた場合に を更新できるようになります。
認証が成功したら認証情報がCredentialsManagerを介して保存されるように、login()メソッドを更新します。

ステップ 3. ユーザープロファイルを取得する

ユーザーモデルを作成する

UserProfileManagerUserActivity で使用する、シンプルなユーザーモデルを作成します。

ユーザープロファイルを保存する

ユーザープロファイル情報を保存するために、UserProfileManager マネージャークラスを作成します。UserProfileManager は、データの保存に SharedPreferences を使用します。
次に、LoginActivitylogin() メソッドを更新して、 を取得し、JWTDecode.Android ライブラリを使用してトークンからユーザープロファイルを取り出します。続いて、そのユーザープロファイルを UserProfileManager に保存します。

ステップ 4. スコープに基づいて UI 要素を条件付きで表示する

ユーザーに特定の操作を実行する権限があるかどうかを判断するには、認証プロセス中にそのユーザーに付与された scope を確認します。scope にはユーザーに付与されたすべてのスコープを含む文字列が格納されるため、特定のスコープが付与されているかどうかを確認するには、スコープ文字列にそのスコープに対応する部分文字列が含まれているかを確認するだけです。

スコープを保存する

まず、付与されたスコープを保存できるように User クラスを更新します。次に、付与されたスコープに特定のスコープが含まれているかどうかを判定するためのヘルパーメソッド hasScope() を追加します。
追加のフィールドを保存できるよう、UserProfileManager も忘れずに更新してください。
次に、LoginActivity を更新し、scope を渡して User オブジェクトに保存できるようにします。

スコープに基づいて承認メニューを表示する

これで、ユーザーに特定のスコープが付与されているかどうかに応じて、特定の UI 要素を表示できるようになります。たとえば、承認メニュー項目は、approve:timesheets スコープが付与されているユーザーにのみ表示されるようにする必要があります。 以下は、ユーザーが approve:timesheets スコープを持っているかどうかを BaseActivity クラスで確認し、その結果に応じて承認アクティビティを表示するメニュー項目の表示/非表示を設定するコードです。

手順 5. API を呼び出す

マニフェスト を更新する

アプリの AndroidManifest.xml を開き、TimeSheetActivity を追加します:

Timesheets Activity のレイアウトを作成する

次に、TimeSheetsActivity 用のレイアウト timesheet_activity.xml を作成します。
ListViewウィジェットには、item_entry.xmlレイアウトで表される各エントリが含まれます。
また、TimeSheetActivity の Toolbar のナビゲーション用に、timesheet_action_menu.xml のメニューリソース (/res/menu/) を作成します。

タイムシートモデルを作成する

ビューでタイムシートデータを扱うためのモデルを作成します。

TimeSheetAdapter を作成する

TimeSheetAdapterは、タイムシートエントリの配列を受け取り、TimeSheetActivityListViewに反映するユーティリティクラスです。

Timesheet Activity を作成する

TimeSheetActivity は、サーバーに保存されている、ログイン中のユーザーのタイムシートエントリを表示します。
  • Android Emulator から http://localhost:8080 で実行中の Node.JS API に接続できるよう、@string/api_urlhttp://10.0.2.2:8080/timesheets に設定されています。
  • callAPI() メソッドは、Node.JS API からタイムシートを取得します。
  • processResults() メソッドは、callAPI() から返された JSON レスポンスを TimeSheet オブジェクトに変換します。
  • onCreateOptionsMenu() メソッドと onOptionsItemSelected() メソッドは、Toolbar ウィジェットのナビゲーション機能を処理します。

ステップ 6. ユーザープロファイルを表示する

ログイン中のユーザーのプロフィールを表示するため、UserActivity、対応する user_activity.xml レイアウト、そして Toolbar ナビゲーション用の user_action_menu.xml を作成します。このビューには、ユーザーの名前、メールアドレス、プロフィール画像が表示されます。

マニフェストを更新する

アプリの AndroidManifest.xml を開き、UserActivity を追加します。

ユーザーアクティビティのレイアウトを作成する

次に、プロフィール画像用の ImageView と、ユーザーの名前およびメールアドレス用の TextViews を含む、UserActivity のレイアウト user_activity.xml を作成します。
UserActivity の Toolbar 用に user_actions_menu.xml を作成します。

URLからプロフィール画像を読み込む

URLからユーザーのプロフィール画像を読み込むには、AsyncTask を継承し、バックグラウンドで実行するタスクを作成します。

ユーザーアクティビティを作成する

onCreate() メソッドでは、UserProfileManager からユーザー情報を取得し、その値をビューに設定します。前と同様に、onCreateOptionsMenu() メソッドと onOptionsItemSelected() メソッドが、Toolbarウィジェットのナビゲーション機能を処理します。

ステップ 7. 新しいタイムシート用フォーム

次に、新しいタイムシートエントリを作成するためのFormActivityとレイアウトを作成します。

マニフェストを更新する

アプリの AndroidManifest.xml を開き、FormActivity を追加します。

フォームアクティビティのレイアウトを作成する

プロジェクト名と作業時間の入力には EditText、作業日の指定には DatePicker を使用した form_activity.xml レイアウトを作成します。
FormActivity のToolbar用に、form_actions_menu.xml も作成します。

フォームアクティビティを作成する

  • @string/api_urlhttp://10.0.2.2:8080/timesheets に設定されています。これにより、Android Emulator から http://localhost:8080 で実行中の Node.JS API に接続できます。
  • onCreate() メソッドはフォームを初期化し、送信ボタンが押されたときに postAPI() メソッドで使用する入力を取得します。
  • postAPI() メソッドは、フォームから取得したユーザー入力を JSON 形式で Node.JS API に送信します。
  • clearForm() メソッドはフォームの入力内容をクリアします。
  • onCreateOptionsMenu() メソッドと onOptionsItemSelected() メソッドは、Toolbar ウィジェットのナビゲーション機能を処理します。

アプリをテストする

先に進む前に、必ず Node.JS API を実装 しておいてください。
  1. ターミナルで API のディレクトリに移動し、node server コマンドを実行して API を起動します。
  2. Android Studio でモバイルアプリを開き、Run ボタンを押します。
  3. Nexus 5X API 23 の仮想デバイスを選択します。
  4. エミュレーターでモバイルアプリが起動したら、ユーザーとしてログインし、実行中の Node.JS API を使用してタイムシートエントリを作成・表示できます。
以上で完了です。