Android Google Smart Lock
在本教程中,我们将讨论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(); } } }