谷歌智能锁定disableAutoSignIn()不会阻止下一个应用程序打开时的选择器对话框

时间:2017-06-15 03:16:13

标签: android google-smartlockpasswords

我正在将Google Smart Lock集成到我的应用中。除了在用户注销的情况下,它似乎工作得很好。首先,一些背景......

在应用启动时,当用户未登录时,我会拨打此电话:

CredentialRequest r = new CredentialRequest.Builder()
                  .setPasswordLoginSupported(true)
                  .setAccountTypes(IdentityProviders.FACEBOOK)
                  .build();

          Auth.CredentialsApi.request(googleApiClient, r)
                  .setResultCallback(result -> {
                    Status status = result.getStatus();
                    if (status.isSuccess()) {
                      onCredentialReceived(result.getCredential());
                    } else  if (status.getStatusCode() == CommonStatusCodes.RESOLUTION_REQUIRED) {
                      try {
                        status.startResolutionForResult(activity, REQUEST_CREDENTIALS);
                      } catch (IntentSender.SendIntentException e) {
                        Timber.e(e, "Couldn't start a resolution request for the user's credentials");
                      }
                    }
                  });

退出后,我的应用会拨打此电话:

Auth.CredentialsApi.disableAutoSignIn(googleApiClient)
        .setResultCallback(status -> {
          if (!status.isSuccess()) Timber.e("Error disabling auto sign in");
        });

这在应用程序的首次启动时效果很好;如果用户拥有单个已保存的凭据,我会从Google获取该凭据并无缝地记录用户。如果用户有多个已保存的凭据,我会启动帐户选择器并以此方式获取凭据。当用户注销时,我禁用自动登录。

不幸的是,如果用户在注销后再次打开应用,则Auth.CredentialsApi.request()返回的结果会告诉我需要解决方案,因此我最终会再次显示帐户选择器,并且每次都会再次显示该应用重新启动。我曾假设禁用自动登录会导致后续调用Auth.CredentialsApi.request()返回状态代码!= CommonStatusCodes.RESOLUTION_REQUIRED;我期望类似CommonStatusCodes.SIGN_IN_REQUIRED(意味着用户需要再次明确登录并同意使用Smart Lock保存凭据)或CommonStatusCodes.CANCELED(意味着此时已禁用Smart Lock)。

这是Smart Lock API中的错误还是我做错了什么?谢谢!

1 个答案:

答案 0 :(得分:0)

如何最好地处理这个取决于应用程序的用户体验(例如,是否需要登录或可选的UX?),这取决于开发人员:如果始终显示凭据选择对话框没有意义,如果状态为credentialRequestResult,则无法解析startResolutionForResult(即请勿拨打RESOLUTION_REQUIRED

例如,您可以在应用程序启动时调用请求API,但如果您发现用户取消了对话框,请设置一些持久的本地状态(例如,在共享首选项中)不再显示(即不解析)直到他们采取明确的行动登录(例如导航到登录界面)。

我建议跟踪用户是否取消了对话而不是退出,因为用户可能根本不想首先登录。