适用于Android 3.x的Login with Amazon SDK迁移指南

适用于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版本:

  1. 打开Mac/Unix终端。
  2. 在Android应用中,导航到包含适用于Android的Login with Amazon SDK (login-with-amazon-sdk.jar)的文件夹。通常情况下,这是项目的根目录。
  3. 运行以下命令以打印SDK版本编号:
    `javap -classpath ./login-with-amazon-sdk.jar -constants com.amazon.identity.auth.map.device.utils.MAPVersionInfo | grep -o "LWA_VERSION = .*"`
    

如何升级

  1. 下载最新版本的适用于Android的Login with Amazon SDK
  2. 将文件解压缩到硬盘目录并导航到 LoginWithAmazon文件夹。
  3. 使用此文件夹中login-with-amazon-sdk.jar.代替Android应用中旧版本的SDK .jar文件。要实现这步操作,可以将新的.jar文件复制到剪贴板,然后将其粘贴到存储原有.jar文件的Android项目文件夹(通常为项目根目录)。
  4. 按照如下说明,迁移到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授权服务器的响应:

  1. user: 如果请求范围为profileAuthorizeResult对象将包含User对象,其中包含所请求客户的个人资料数据。您无需再从AuthorizeListeneronSuccess方法中调用AuthorizationManager.getProfile(适用于Android的旧版本LWA SDK需要此操作)。如需了解更多关于获取个人资料数据的信息,请参阅SDK文档中关于User类的参考类。
  2. accessToken: 如果您请求的是访问令牌(默认操作)访问令牌,则LWA授权服务器将在响应中返回访问令牌。您无需再从AuthorizeListeneronSuccess方法中调用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的对象通常包括:

  1. scopes: 定义授权请求的范围。Profile类定义Login with Amazon提供的范围。如果您使用的是用于其他亚马逊产品使用的API,则将在相关的产品文档中找到这些产品所支持的范围。
  2. requestContext: 您之前创建的requestContext对象。

如需了解AuthorizeRequest对象中的完整属性列表,请参阅SDK文档中的参考类。

为AuthorizeRequest添加范围。

适用于Android的新LWA SDK使用Scope对象来表示范围。要请求范围,则需要添加为AuthorizeRequest添加Scope对象。有两个选项:

  1. 要请求Login with Amazon提供的客户个人资料范围,需要使用 ProfileScope类中定义的方法:

    范围名称 ProfileScope类中的方法
    profile ProfileScope.profile()
    postal_code ProfileScope.postalCode()
    profile:user_id ProfileScope.userId()
  2. 或者,您可以使用ScopeFactory来创建Scope对象:

    ScopeFactory.scopeNamed("profile");
    

使用此方法来请求其他亚马逊产品提供的范围。

获取用户个人资料数据

只要用户登录并授权您的应用,您可以随时获取他们的个人资料数据。适用于Android的新LWA SDK引入了User类来帮助您更好地管理客户个人资料数据。常用的客户个人资料数据类在本类中定义为属性,具体如下:

  1. userID:客户的唯一标识符。
  2. name:客户的名称。
  3. email:客户的电子邮件地址。
  4. postalCode:客户的邮政编码。
  5. userInfo: 包含客户所有可用个人资料数据的映射。

与调用AuthorizationManager.getProfile的旧版本SDK相比,适用于Android的新LWA SDK提供了两种请求客户个人资料数据的选择:

  1. 如果客户未登录到您的应用,则调用AuthorizationManager.getProfile,在onSuccess()方法的result对象中检索User对象。
  2. 如果客户当前已登录到您的应用,则调用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) {
// 记录错误
}
});
}
});
}