Android Google Smart Lock

时间:2020-02-23 14:28:58  来源:igfitidea点击:

在本教程中,我们将讨论Smart Lock功能,并将其在Android应用程序中实现。

Google Smart Lock

Smart Lock用于通过一劳永逸地保存凭据自动登录您的应用程序。
也就是说,如果过一会儿重新安装应用程序,只要您没有从Chrome密码中删除它们,就可以使用以前保存的凭据自动登录。

Google Smart Lock可让您一键登录。

为了将Smart Lock集成到您的应用程序中,您需要使用凭据API。

凭证API允许用户:

  • 打开应用程序时请求凭据。

  • 保存登录表单中的凭据。

  • 在应用程序和之间同步凭据。

  • 如果希望在登录/注册过程中帮助用户,请显示电子邮件提示。

要在您的应用程序中使用Google Smart Lock,您需要添加以下依赖项:

dependencies {
  implementation 'com.google.android.gms:play-services-auth:16.0.0'
}

SmartLock要求在您的android应用程序中设置GoogleApiClient。

只有一个凭证时,SmartLock允许自动登录。

如果凭证不止一个,它们将显示在一个对话框中。

之前,我们曾经依赖SharedPreferences在本地自动签名和保存凭据。
现在,借助Google Smart Lock,Google服务器可以处理一切。

以下是凭据API中存在的主要方法:

  • save(GoogleApiClient客户端,凭据凭证)

  • request(GoogleApiClient client,CredentialRequestrequest)-请求为应用程序保存的所有凭据。

  • getHintPickerIntent(GoogleApiClient客户,HintRequest请求)-显示您拥有的登录帐户列表,以便快速填写登录表单。

  • disableAutoSignIn(GoogleApiClient客户端)

  • delete(GoogleApiClient客户端,凭据凭证)

您可以转到passwords.google.com,查看为Google帐户保存的所有凭据。

使用Smart Lock的应用程序的流程是什么?

您需要通过以下方式来构造登录屏幕代码:

  • 检查凭据。
    如果存在单个凭据,请自动签名或者自动填写登录表单。

  • 如果有多个凭据,请在对话框中显示它们,然后让用户选择。

  • 如果没有保存的凭据,则可以让用户填写表单,也可以通过自动填充使它们变得更容易,也可以显示一个提示对话框,提示要登录的可用帐户。

入门

让我们开始在Android应用程序中实施Smart Lock功能。

设置GoogleApiClient

mGoogleApiClient = new GoogleApiClient.Builder(this)
              .addConnectionCallbacks(this)
              .addApi(Auth.CREDENTIALS_API)
              .enableAutoManage(this, this)
              .build();

实现GoogleApiClient接口并实现方法。

初始化凭据客户端

CredentialsOptions options = new CredentialsOptions.Builder()
              .forceEnableSaveDialog()
              .build();

CredentialsClient  mCredentialsApiClient = Credentials.getClient(this, options);

Android Oreo及更高版本需要forceEnableSaveDialog()。

创建凭据请求

CredentialRequest mCredentialRequest = new CredentialRequest.Builder()
              .setPasswordLoginSupported(true)
              .setAccountTypes(IdentityProviders.GOOGLE)
              .build();

检索凭证

Auth.CredentialsApi.request(mGoogleApiClient, mCredentialRequest).setResultCallback(this);

setResultCallBack要求我们从接口ResultCallback <CredentialRequestResult>覆盖方法onResult

@Override
  public void onResult(@NonNull CredentialRequestResult credentialRequestResult) {

      Status status = credentialRequestResult.getStatus();
      if (status.isSuccess()) {
          onCredentialRetrieved(credentialRequestResult.getCredential());
      } else {
          if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) {
              try {
                  isResolving = true;
                  status.startResolutionForResult(this, RC_READ);
              } catch (IntentSender.SendIntentException e) {
                  Log.d(TAG, e.toString());
              }
          } else {

              showHintDialog();
          }
      }
  }