as

Settings
Sign out
Notifications
Alexa
Amazonアプリストア
AWS
ドキュメント
Support
Contact Us
My Cases

使用适用于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) {
                // 记录错误
            }
        });
    }
    });
    }