使用适用于Android API的Login with Amazon SDK

使用适用于Android API的Login with Amazon SDK

处理登录按钮并获取个人资料数据

本部分介绍了如何调用authorize API来登录用户。这包括在应用的onCreate方法中为您的Login with Amazon按钮创建onClick侦听器。

  1. 为Android项目添加Login with Amazon
  2. 初始化RequestContext

    您需要声明RequestContext变量并为此类创建新实例。RequestContext初始化的最佳位置为Android活动或片段的onCreate方法。例如:

    private RequestContext requestContext;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestContext = RequestContext.create(this);
    }
    
  3. 创建AuthorizeListener

    AuthorizeListener将处理authorize调用的结果。一共包含三种方法:onSuccessonErroronCancel。配合Android活动或片段的onCreate方法下的registerListener调用,创建AuthorizeListener接口。

    @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重新设置为随时登录状态*/
            }
        });
    }
    
  4. 为您的AuthorizeListener实现onSuccessonErrorronCancel

    由于授权流程会在网页浏览器(或网页视图)中向用户显示登录界面(可能也会显示同意界面同意界面),用户可以取消登录或导航离开页面。如果用户明确取消登录流程,则调用onCancel,您可能会希望重新设置用户接口。

    如果用户在浏览器或网页视图中导航离开登录界面,然后返回到您的应用,SDK将检测不到登录未完成。如果您的应用在登录完成前检测到了用户活动,则可以假定用户已从浏览器导航离开并已做出相应反应。

  5. 调用RequestContext.onResume

    为适应Android应用生命周期,需要在活动或片段中实现onResume方法。如果您的应用在用户完成授权流程前被操作系统关闭,这将触发所有注册registerListener的侦听器。

    @Override
    protected void onResume() {
        super.onResume();
        requestContext.onResume();
    }
    
  6. 调用AuthorizationManager.authorize

    在Login with Amazon按钮的onClick处理程序中,调用authorize来提示用户登录并授权应用。

    此方法将使用以下其中一种方式来实现用户登录并同意请求信息:

    1. 切换到系统浏览器
    2. 切换到安全环境下的网页视图(适用于已安装亚马逊购物应用的设备)

    如果设备已安装马逊购物应用,可实现第二个选项中的安全环境。运行Fire OS的亚马逊设备(例如Kindle Fire、Fire手机和Fire TV)始终使用此选项,即使设备中没有亚马逊购物应用,也不例外。因此,如果用户已登录到亚马逊购物应用,此API将跳过登录页面,为用户提供单点登录体验。请参阅Android/Fire应用中的客户体验以了解更多信息。

    如果您的应用已获得授权,则将会得到一个或多个数据集的授权,即范围。包含向Login with Amazon请求的用户数据的范围。用户首次登录您的应用时,将看到您请求的数据列表并会询问是否批准。

    Login with Amazon当前支持的范围如下:profile(访问用户的名称、电子邮件地址和亚马逊账户ID)、profile:user_id(仅访问用户的亚马逊账户ID)和postal_code(访问用户保存在亚马逊账户文件中的邮政编码)。

    AuthorizationManager.authorize为异步调用,因此您不必阻止UI线程或创建自己的工作线程。要调用authorize,需要传递一个可用AuthorizeRequest.Builder构建的AuthorizeRequest对象:

    @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());
                    });
            }
          }
    

获取用户个人资料数据

本部分介绍了如何在用户授权后使用User API来检索个人资料数据。您可以检索的个人资料数据取决于authorize:withHandler:调用中指示的范围。

  1. 调用User.fetch

    User.fetch将通过Listener<User, AuthError>回调来返回用户个人资料数据。Listener<User, AuthError>包含两种方法:onSuccessonError(由于无法取消User.fetch调用,该方法不支持onCancel)。onSuccess将收到包含个人资料数据的User对象,onError将返回包含错误信息的AuthError对象。updateProfileData是一个功能示例,通过实现该功能,应用可在用户界面显示个人资料数据。

    @Override
    protected void onStart() {
        super.onStart();
        Scope[] scopes = {
            ProfileScope.profile(),
            ProfileScope.postalCode()
        };
        AuthorizationManager.getToken(this, scopes, new Listener < AuthorizeResult, AuthError > () {
    
            @Override
            public void onSuccess(AuthorizeResult result) {
                if (result.getAccessToken() != null) {
                    /*用户已登录*/
                } else {
                    /*用户未登录*/
                }
            }
    
            @Override
            public void onError(AuthError ae) {
                /*用户未登录*/
            }
        });
    }
    

检查首次登录的用户

如果用户登录并关闭您的应用,并在之后重新启动,应用仍然有权检索数据。用户不会自动注销。如果您的应用仍处于授权状态,可在启动时将用户显示为已登录。本部分介绍了如何使用getToken确定应用是否仍处于授权状态。

  1. 调用getToken

    在活动或片段中的onStart方法中,调用getToken以查看应用是否处于授权状态。getToken将检索AuthorizationManager用于访问客户个人资料的原始访问令牌访问令牌。如果令牌值不为nul,则应用仍处于授权状态,您可以继续获取用户个人资料数据。getToken的请求范围需要与authorize的调用范围相同。

    getToken支持与User.fetch相同的异步调用,因此无需阻止UI线程或创建您自己的工作线程。要异步调用getToken异步,需要将支持Listener<AuthorizeRequest, AuthError>接口的对象作为最后一个参数进行传递。

  2. 声明Listener<AuthorizeResult, AuthError>

    Listener<AuthorizeResult, AuthError>接口的实现将处理getToken调用的结果。侦听器包含两种方法:onSuccessonError(由于无法取消getToken调用,该方法无法支持onCancel)。

  3. 为您的Listener<AuthorizeResult, AuthError>实现onSuccessonError

    onSuccess将收到包含访问令牌AuthorizeResult对象,onError将收到包含错误信息的AuthError对象。

    @Override
    protected void onStart() {
        super.onStart();
        Scope[] scopes = {
            ProfileScope.profile(),
            ProfileScope.postalCode()
        };
        AuthorizationManager.getToken(this, scopes, new Listener < AuthorizeResult, AuthError > () {
    
            @Override
            public void onSuccess(AuthorizeResult result) {
                if (result.getAccessToken() != null) {
                    /*用户已登录*/
                } else {
                    /*用户未登录*/
                }
            }
    
            @Override
            public void onError(AuthError ae) {
                /*用户未登录*/
            }
        });
    }
    

清除授权数据并注销用户

本部分介绍了如何使用signOut方法来清除 AuthorizationManager本地数据存储中的用户授权数据。应用若要检索个人资料数据,用户必须重新进行登录。使用此方法可注销用户,也可以对应用中的登录问题进行故障排除。

  1. 实现注销机制。

    用户成功登录后,您应提供注销机制,以便用户清除个人资料数据和以前的授权范围。这项机制可以是超链接,也可以是按钮或菜单项。本示例将为按钮创建onClick方法。

  2. 调用signOut

    在注销处理程序中调用signOut来移除本地存储中的用户授权数据(访问令牌和个人资料)。signOut需要使用Android contextListener<Void, AuthError>来处理成功或失败。

  3. 声明匿名的Listener<Void, AuthError>

    Listener<Void, AuthError>实现将处理signOut调用的结果。匿名类是捕获封闭范围的有力方法。请参阅处理登录按钮和授权用户中声明侦听器类的示例。

  4. 为您的Listener<Void, AuthError>实现onSuccessonError

    signOut成功后,应更新UI来移除用户参考,并提供用户可用来再次登录的登录机制。如果signOut返回错误,可以让用户尝试注销。

    @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) {
                // 记录错误
            }
        });
    }
    });
    }