本帖最后由 hanguokai 于 2016-1-15 16:15 编辑
英文原文:API Updates for Sign-In with Google 随着 Google Play service 8.3 的发布,我们对 Sign-In with Google(使用 Google 登录)做出了大量的改进。在本系列的第一篇博文中,我们介绍了用户界面的改进。今天,我们将继续探讨对 API 的改进,这些改进让开发使用 Google 登录的应用变得比以前更简单。 对基本登录流程的变动在开发使用 Google 登录的应用时,您会注意到有许多变动让您的代码更容易理解和维护。 在此版本之前,如果您开发使用 Sign-In with Google 的应用,您开发的应用会尝试连接到 GoogleApiClient。此时,系统会向用户显示一个帐户选取器和/或权限对话框,这两者都可能触发连接故障。您可能不得不处理这些连接故障才能登录。连接 GoogleApiClient 之后,用户会被视为已登录,系统即会授予其权限。该流程记载在此处的 CodeLab 中。 现在,您的代码可以大大简化。 系统会分别处理登录和连接 GoogleApiClient 的流程。登录通过 GoogleSignInOptions 对象实现,您可以对其指定登录参数,例如,您想要的登录作用域。以下是一段示例代码: - <blockquote>GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN)
复制代码建立 GoogleSignInOptions 对象之后,即可使用它来配置 GoogleApiClient: 这里正是您的代码在新的 API 中改变巨大之处。现在,如果您想使用 Google 帐户连接,您将使用利用客户端初始化的 Intent,而不必处理 GoogleApiClient 上的错误。 - Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
- startActivityForResult(signInIntent, RC_SIGN_IN);
- Intent signInIntent = Auth.GoogleSignInApi.getSignInIntent(mGoogleApiClient);
- startActivityForResult(signInIntent, RC_SIGN_IN);
复制代码启动该 Intent 将会向您显示帐户选取器以及作用域权限对话框(倘若您的 GoogleSignInOptions 请求的作用域超出基本作用域的范畴之外)。用户完成与这些对话框的交互之后,即会触发 OnActivityResult 回调,该回调包含必要的登录信息。 - @Override
- public void onActivityResult(int requestCode, int resultCode, Intent data) {
- super.onActivityResult(requestCode, resultCode, data);
- // Result returned from launching the Intent from GoogleSignInApi.getSignInIntent(...);
- if (requestCode == RC_SIGN_IN) {
- GoogleSignInResult result = Auth.GoogleSignInApi.getSignInResultFromIntent(data);
- handleSignInResult(result);
- }
- }
复制代码在集成 Google Sign-In 快速入门中或者通过查看此示例代码,您可以了解到有关此代码的更多信息。 静默式登录为进一步减少用户在多设备环境中的困惑,新版 API 还支持静默式登录。这种情况下,如果您的用户在另一设备上授权该应用,则该帐户后面会显示详细登录信息,除非他们撤销授权,否则,他们不需要在其今后登录的设备上再重复提供这些信息。现有登录信息也会被缓存,并可同步到当前可用的设备上。 使用它就像在此 API 中调用 silentSignIn 方法一样简单。 - OptionalPendingResult opr =
- Auth.GoogleSignInApi.silentSignIn(mGoogleApiClient);
复制代码随后,您可以检查 isDone() 方法的处理结果,如果返回 True,则说明该用户已登录,您可以从 PendingResult 获取其状态。否则,则必须等待回调 SignInResult - if (pendingResult.isDone()) {
- doStuffWith(pendingResult.get());
- } else {
- // There's no immediate result ready, displays some progress indicator and waits for the
- // async callback.
- showProgressIndicator();
- pendingResult.setResultCallback(new ResultCallback<GoogleSignInResult>() {
- @Override
- public void onResult(@NonNull GoogleSignInResult result) {
- updateButtonsAndStatusFromSignInResult(result);
- hideProgressIndicator();
- }
- });
- }
复制代码 自定义登录按钮在开发使用 Google 登录的应用时,我们提供了一个 SignInButton 对象,该对象包含 Google 品牌标识,看上去像下面这样:
此 API 中提供了许多属性和常量,可用来自定义该按钮,详见此处。 品牌指南可从此处获取,它们包含 PNG、SVG、EPS 和其他格式、多种分辨率的按钮版本,包括按钮的所有不同状态。这些文件可用于本地化该按钮,如果您需要让按钮的样式与您的应用相匹配,也可以参考提供的相关指南。 这仅仅处理了应用的 Android 端。您很可能还拥有服务器后端,您可能希望在服务器端安全地使用这些凭据。 在下一篇博文中,我们将介绍如何在服务器端场景中使用 Sign-In with Google,包括如何将您的凭据安全地传输到您自己的服务器上,以及如何利用用户的权限和凭据使用 Google 后端服务(例如 Google Drive)。 Blog地址
|