使用适用于Android API的Login with Amazon SDK
处理登录按钮并获取个人资料数据
本部分介绍了如何调用authorize
API来登录用户。这包括在应用的onCreate
方法中为您的Login with Amazon按钮创建onClick
侦听器。
- 为Android项目添加Login with Amazon。
-
初始化
RequestContext
。您需要声明
RequestContext
变量并为此类创建新实例。RequestContext
初始化的最佳位置为Android活动或片段的onCreate
方法。例如:private RequestContext requestContext; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); requestContext = RequestContext.create(this); }
-
创建
AuthorizeListener
。AuthorizeListener
将处理authorize
调用的结果。一共包含三种方法:onSuccess
、onError
和onCancel
。配合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重新设置为随时登录状态*/ } }); }
提示: 如果您使用片段并在AuthorizeListener
实现中捕获对View
对象的引用,则在onCreateView(而非onCreate
)方法中创建AuthorizeListener
。这将确保authorize
调用完成时,View
对象参考已设置完成。 -
为您的
AuthorizeListener
实现onSuccess
、onErrorr
和onCancel
。由于授权流程会在网页浏览器(或网页视图)中向用户显示登录界面(可能也会显示同意界面同意界面),用户可以取消登录或导航离开页面。如果用户明确取消登录流程,则调用
onCancel
,您可能会希望重新设置用户接口。如果用户在浏览器或网页视图中导航离开登录界面,然后返回到您的应用,SDK将检测不到登录未完成。如果您的应用在登录完成前检测到了用户活动,则可以假定用户已从浏览器导航离开并已做出相应反应。
-
调用
RequestContext.onResume
。为适应Android应用生命周期,需要在活动或片段中实现
onResume
方法。如果您的应用在用户完成授权流程前被操作系统关闭,这将触发所有注册registerListener
的侦听器。@Override protected void onResume() { super.onResume(); requestContext.onResume(); }
-
调用
AuthorizationManager.authorize
。在Login with Amazon按钮的
onClick
处理程序中,调用authorize
来提示用户登录并授权应用。此方法将使用以下其中一种方式来实现用户登录并同意请求信息:
- 切换到系统浏览器
- 切换到安全环境下的网页视图(适用于已安装亚马逊购物应用的设备)
如果设备已安装马逊购物应用,可实现第二个选项中的安全环境。运行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:
调用中指示的范围。
-
调用
User.fetch
。User.fetch
将通过Listener<User, AuthError>
回调来返回用户个人资料数据。Listener<User, AuthError>
包含两种方法:onSuccess
和onError
(由于无法取消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) { /*用户未登录*/ } }); }
注意: 如果请求范围为ProfileScope.postalCode()
,将仅返回User.getUserPostalCode
。
检查首次登录的用户
如果用户登录并关闭您的应用,并在之后重新启动,应用仍然有权检索数据。用户不会自动注销。如果您的应用仍处于授权状态,可在启动时将用户显示为已登录。本部分介绍了如何使用getToken
确定应用是否仍处于授权状态。
-
调用
getToken
。在活动或片段中的
onStart
方法中,调用getToken
以查看应用是否处于授权状态。getToken
将检索AuthorizationManager
用于访问客户个人资料的原始访问令牌访问令牌。如果令牌值不为nul,则应用仍处于授权状态,您可以继续获取用户个人资料数据。getToken
的请求范围需要与authorize
的调用范围相同。getToken
支持与User.fetch
相同的异步调用,因此无需阻止UI线程或创建您自己的工作线程。要异步调用getToken
异步,需要将支持Listener<AuthorizeRequest, AuthError>
接口的对象作为最后一个参数进行传递。 -
声明
Listener<AuthorizeResult, AuthError>
。Listener<AuthorizeResult, AuthError>
接口的实现将处理getToken
调用的结果。侦听器包含两种方法:onSuccess
和onError
(由于无法取消getToken
调用,该方法无法支持onCancel
)。 -
为您的
Listener<AuthorizeResult, AuthError>
实现onSuccess
和onError
。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
本地数据存储中的用户授权数据。应用若要检索个人资料数据,用户必须重新进行登录。使用此方法可注销用户,也可以对应用中的登录问题进行故障排除。
-
实现注销机制。
用户成功登录后,您应提供注销机制,以便用户清除个人资料数据和以前的授权范围。这项机制可以是超链接,也可以是按钮或菜单项。本示例将为按钮创建
onClick
方法。 -
调用
signOut
。在注销处理程序中调用
signOut
来移除本地存储中的用户授权数据(访问令牌和个人资料)。signOut
需要使用Android context和Listener<Void, AuthError>
来处理成功或失败。 -
声明匿名的
Listener<Void, AuthError>
。Listener<Void, AuthError>
实现将处理signOut
调用的结果。匿名类是捕获封闭范围的有力方法。请参阅处理登录按钮和授权用户中声明侦听器类的示例。 -
为您的
Listener<Void, AuthError>
实现onSuccess
和onError
。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) { // 记录错误 } }); } }); }