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();
}
}
}

