Android 3.x用のLogin with Amazon SDKへの移行ガイド
このガイドでは、アプリで使用しているAndroid用のLogin with Amazon SDKをv2.0.2(またはそれ以下)からAndroid 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 = .*"`
アップグレードの方法
- Login with Amazon SDK(Android用)の最新バージョンをダウンロードします。
- ハードドライブのディレクトリにファイルを展開し、
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
インスタンスが作成されたら、AuthorizeListener
インターフェイスと一緒にregisterListener
呼び出しを作成します。
AuthorizeListener()のonSuccess()メソッドでユーザープロファイルデータを取得する
新しいAuthorizeListener
クラスのonSuccess()
メソッドで入力引数タイプがAuthorizeResult
に変更されました。AuthorizeResult
オブジェクトには、AuthorizationManager.authorize
呼び出しが成功したときのLWA認可サーバーからのレスポンスが含まれます。
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
オブジェクトを使用します。スコープをリクエストするには、Scope
オブジェクトをAuthorizeRequest
に追加する必要があります。これには2つの方法があります。
-
Login with Amazonから提供されるユーザープロファイルscopeをリクエストするには、
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
スコープに対して1つ以上の認可リクエストを行う必要があります。以前の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) {
// エラーをログに記録
}
});
}
});
}