Android用のLogin with Amazon SDK 3.xへの移行ガイド
このガイドでは、アプリで使用しているAndroid用のLogin with Amazon SDKをv2.0.2(またはそれ以下)からv3.xに移行する方法について説明します。
アプリとLogin with Amazonをまだ統合していない場合は、Androidのスタートガイドの一連の手順を参照してください。
- アプリで使用しているAndroid用のLogin with Amazon SDKバージョンを確認する方法
- アップグレードの方法
- ユーザープロファイルデータの取得
- 認可データの消去とユーザーのログアウト
アプリで使用しているAndroid用のLogin with Amazon SDKバージョンを確認する方法
アプリで使用しているAndroid用のLogin with Amazon SDKのバージョンを確認するには、次の手順を実行します。
- Mac/Unixターミナルを開きます。
- AndroidアプリでAndroid用のLogin with Amazon SDK(login-with-amazon-sdk.jar)を格納しているフォルダに移動します。一般的に、これはプロジェクトのルートディレクトリです。
- 次のコマンドを実行し、SDKのバージョン番号を出力します。
    `javap -classpath ./login-with-amazon-sdk.jar -constants com.amazon.identity.auth.map.device.utils.MAPVersionInfo | grep -o "LWA_VERSION = .*"`
アップグレードの方法
- Android用のLogin with Amazon SDKの最新バージョンをダウンロードします。
- ハードドライブのディレクトリにファイルを展開し、LoginWithAmazonフォルダに移動します。
- このフォルダにあるlogin-with-amazon-sdk.jarを使用して、Androidアプリにある古いSDKの.jarファイルと置き換えます。それには、新しい.jarファイルをクリップボードにコピーして、古い.jarファイルが保存されているAndroidプロジェクトのフォルダ(通常はプロジェクトのルートディレクトリ)に貼り付けます。
- 次の手順に従って、Login with Amazon 3.0ライブラリに導入された新しいAPIに移行します。
ログインボタンの処理とユーザープロファイルデータの取得
RequestContextとregisterListenerを初期化する
新しいAndroid用のLWA SDKでは、AuthorizationManagerインスタンスを初期化する必要がありません。その代わり、RequestContext変数を宣言してそのクラスの新しいインスタンスを作成する必要があります。RequestContextを初期化するのに最適な場所は、AndroidアクティビティまたはフラグメントのonCreateメソッド内です。RequestContextインスタンスが作成されたら、registerListenerの呼び出しと一緒にAuthorizeListenerインターフェイスを作成します。
AuthorizeListener()のonSuccess()メソッドでユーザープロファイルデータを取得する
新しいAuthorizeListenerクラスのonSuccess()メソッドでは、入力引数の型がAuthorizeResultに変更されています。AuthorizationManager.authorizeの呼び出しの成功時には、LWA認可サーバーからのレスポンスとして、AuthorizeResultオブジェクトに次の値が含まれます。
- user:- profileスコープをリクエストした場合、- AuthorizeResultオブジェクトに、リクエストしたユーザープロファイルデータを含む- Userオブジェクトが格納されます。- AuthorizationManager.getProfileを- AuthorizeListenerの- onSuccessメソッドから呼び出す必要はありません(Android用の以前のバージョンのLWA SDKでは必要でした)。プロファイルデータの取得に関する詳細については、SDKドキュメントに記載の- Userクラスに関するクラスリファレンスを参照してください。
- 
    accessToken: アクセストークンをリクエストした場合(デフォルトの処理)、LWA認可サーバーはレスポンスでアクセストークンを返します。AuthorizationManager.getTokenをAuthorizeListenerのonSuccessメソッドから呼び出す必要はありません(Android用の以前のバージョンのLWA SDKでは必要でした)。@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestContext = RequestContext.create(this); requestContext.registerListener(new AuthorizeListener() { /* 認可が正常に完了しました。 */ @Override public void onSuccess(AuthorizeResult result) { /* リクエストしたスコープに対してアプリが承認されました */ } /* アプリの認可中にエラーが 発生しました。 */ @Override public void onError(AuthError ae) { /* ユーザーにエラーを通知します */ } /* 完了前に認可がキャンセルされました。 */ @Override public void onCancel(AuthCancellation cancellation) { /* UIをready-to-loginの状態にリセットします */ } }); } @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); /* 以前のonCreate宣言の省略 */ // login_with_amazon IDのボタンを検索します // クリックハンドラーをセットアップします View loginButton = findViewById(R.id.login_with_amazon); loginButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { AuthorizationManager.authorize(new AuthorizeRequest .Builder(requestContext) .addScopes(ProfileScope.profile(), ProfileScope.postalCode()) .build()); }); } }
RequestContext.onResumeの呼び出し
Androidアプリのライフサイクルに対応するため、アクティビティやフラグメントにonResumeメソッドを実装します。このメソッドにより、ユーザーが認可フローを完了する前にオペレーティングシステムによってアプリが閉じられた場合には、registerListenerに登録されているすべてのリスナーがトリガーされます。
@Override
protected void onResume() {
super.onResume();
requestContext.onResume();
}
AuthorizeRequestオブジェクトによりAuthorizationManager.authorizeメソッドを呼び出す
Android用の新しいLWA SDKでは、AuthorizationManager.authorizeメソッドへの変更が導入されています。AuthorizationManager.authorizeへの入力はAuthorizeRequestオブジェクトになります。AuthorizeRequestクラスに定義されているBuilderクラスを使用してリクエストオブジェクトを作成することをお勧めします。一般的にAuthorizeRequestオブジェクトに渡されるプロパティは次のとおりです。
- scopes: 認可リクエストの対象となる範囲を定義します。- Profileクラスは、Login with Amazonで提供されるスコープを定義します。そのほかのAmazon製品のAPIを使用している場合、サポート対象のスコープについては各製品のドキュメントでご確認ください。
- requestContext: 以前に作成した- requestContextオブジェクト。
AuthorizeRequestオブジェクトのプロパティ一覧については、SDKドキュメント内のクラスリファレンスを参照してください。
AuthorizeRequestにスコープを追加する
Android用の新しいLWA SDKでは、スコープを表すためにScopeオブジェクトを使用します。スコープをリクエストするには、AuthorizeRequestにScopeオブジェクトを追加する必要があります。これには2つの方法があります。
- 
    Login with Amazonから提供されるユーザープロファイルスコープをリクエストするには、 ProfileScopeクラスで定義されたメソッドを使用します。スコープ名 ProfileScopeクラスのメソッド profile ProfileScope.profile() postal_code ProfileScope.postalCode() profile:user_id ProfileScope.userId() 
- 
    もう1つの方法として、次のように ScopeFactoryを使用してScopeオブジェクトを作成できます。ScopeFactory.scopeNamed("profile");
このメソッドを使用して、そのほかのAmazon製品に提供されるスコープをリクエストできます。
ユーザープロファイルデータの取得
ユーザーがアプリにログインして認可を受けている限り、開発者はいつでもそのユーザーのプロファイルデータを取得できます。Android用の新しいLWA SDKでは、ユーザープロファイルデータを管理しやすいUserクラスが導入されています。よく使用されるユーザープロファイルデータの一部は、このクラスのプロパティとして定義されています。
- userID:ユーザーの一意の識別子。
- name:ユーザーの名前。
- email:ユーザーのEメールアドレス。
- postalCode:ユーザーの郵便番号。
- userInfo: ユーザーから提示されているプロファイルデータをすべて含むマップ。
profileスコープに対して認可リクエストを行う必要があります。以前のSDKバージョンではAuthorizationManager.getProfileの呼び出しが必須でしたが、Android用の新しいLWA SDKでは、次の2つの方法でユーザープロファイルデータをリクエストできます。
- ユーザーがアプリにサインインしていないときは、AuthorizationManager.getProfileを呼び出して、onSuccess()メソッドのresultオブジェクトからUserオブジェクトを取得します。
- 
    ユーザーが現在アプリにサインインしている場合は、 User.fetchを呼び出して、最新のユーザープロファイルデータを取得します。private void fetchUserProfile() { User.fetch(this, new Listener<User, AuthError>() { /* 取得が正常に終了しました。 */ @Override public void onSuccess(User user) { final String name = user.getUserName(); final String email = user.getUserEmail(); final String account = user.getUserId(); final String zipcode = user.getUserPostalCode(); runOnUiThread(new Runnable() { @Override public void run() { updateProfileData(name, email, account, zipcode); } }); } /* プロファイルの取得中にエラーが発生しました。 */ @Override public void onError(AuthError ae) { /* 再試行するか、ユーザーにエラーを通知します */ } }); }
認可データの消去とユーザーのログアウト
Android用の新しいLWA SDKで提供される新たなsignOut APIを使用します。これは、clearAuthorizationStateに置き換わるものです。
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
/* 以前のonCreate宣言の省略 */
// ログアウトIDのボタンを検索してクリックハンドラーをセットアップします View logoutButton = findViewById(R.id.logout);
logoutButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
AuthorizationManager.signOut(getApplicationContext(), new Listener<Void, AuthError>() {
@Override
public void onSuccess(Void response) {
// UIにログアウト状態を設定します
}
@Override
public void onError(AuthError authError) {
// エラーをログに記録します
}
});
}
});
}

