适用于Android 3.x的Login with Amazon SDK迁移指南
本指南介绍了如何将您的应用从适用于Android v2.0.2(及更低版本)的Login with Amazon SDK迁移到适应于Android v3.x的Login with Amazon。
如果您的应用尚未集成Login with Amazon,请参阅Android入门指南中的完整说明。
我的应用正在使用哪个版本的Login with Amazon Android SDK?
要确定应用正在使用的Login with Amazon Android 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 and registerListener.
新的适用于Android的LWA SDK无须再初始化AuthorizationManager
实例。反之,您需要声明RequestContext
变量并为此类创建新实例。RequestContext
初始化的最佳位置为Android活动或片段的onCreate
方法。RequestContext
实例创建完成后,配合registerListener
调用创建一起创建AuthorizeListener
接口。
利用AuthorizeListener().的onSuccess()方法获取客户个人资料
新AuthorizeListener
类的onSuccess()
方法已将输入增强类型更改为AuthorizeResult
。如果AuthorizationManager.authorize
调用成功,AuthorizeResult
对象将包含来自LWA授权服务器的响应:
user
: 如果请求范围为profile
,AuthorizeResult
对象将包含User
对象,其中包含所请求客户的个人资料数据。您无需再从AuthorizeListener
的onSuccess
方法中调用AuthorizationManager.getProfile
(适用于Android的旧版本LWA SDK需要此操作)。如需了解更多关于获取个人资料数据的信息,请参阅SDK文档中关于User
类的参考类。-
accessToken
: 如果您请求的是访问令牌(默认操作)访问令牌,则LWA授权服务器将在响应中返回访问令牌。您无需再从AuthorizeListener
的onSuccess
方法中调用AuthorizationManager.getToken
(适用于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重新设置为随时登录状态*/ } }); } @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 object调用AuthorizationManager.authorize方法。
适用于Android的新LWA SDK更改了AuthorizationManager.authorize
方法。AuthorizationManager.authorize
的输入现已变为一项AuthorizeRequest
对象。我们建议您使用AuthorizeRequest
类中定义的Builder
类来创建请求对象。传递给AuthorizeRequest
的对象通常包括:
scopes
: 定义授权请求的范围。Profile
类定义Login with Amazon提供的范围。如果您使用的是用于其他亚马逊产品使用的API,则将在相关的产品文档中找到这些产品所支持的范围。requestContext
: 您之前创建的requestContext
对象。
如需了解AuthorizeRequest
对象中的完整属性列表,请参阅SDK文档中的参考类。
为AuthorizeRequest添加范围。
适用于Android的新LWA SDK使用Scope
对象来表示范围。要请求范围,则需要添加为AuthorizeRequest
添加Scope
对象。有两个选项:
-
要请求Login with Amazon提供的客户个人资料范围,需要使用
ProfileScope
类中定义的方法:范围名称 ProfileScope类中的方法 profile ProfileScope.profile() postal_code ProfileScope.postalCode() profile:user_id ProfileScope.userId() -
或者,您可以使用
ScopeFactory
来创建Scope
对象:ScopeFactory.scopeNamed("profile");
使用此方法来请求其他亚马逊产品提供的范围。
获取用户个人资料数据
只要用户登录并授权您的应用,您可以随时获取他们的个人资料数据。适用于Android的新LWA SDK引入了User
类来帮助您更好地管理客户个人资料数据。常用的客户个人资料数据类在本类中定义为属性,具体如下:
userID
:客户的唯一标识符。name
:客户的名称。email
:客户的电子邮件地址。postalCode
:客户的邮政编码。userInfo
: 包含客户所有可用个人资料数据的映射。
profile
范围的授权(如上所述)。与调用AuthorizationManager.getProfile
的旧版本SDK相比,适用于Android的新LWA SDK提供了两种请求客户个人资料数据的选择:
- 如果客户未登录到您的应用,则调用
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) { /*重试并提示用户发生错误*/ } }); }
清除授权数据和注销用户
使用新LWA Android 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) {
// 记录错误
}
});
}
});
}