【问题标题】:Android Smart Lock setResultCallback is not getting calledAndroid Smart Lock setResultCallback 没有被调用
【发布时间】:2015-08-05 16:55:06
【问题描述】:

我一直在关注https://developers.google.com/identity/smartlock-passwords/android/retrieve-credentials,如果用户已将其凭据保存到 Chrome 中的新 Android Smart Lock 功能,则他们会尝试自动登录。我完全按照指南进行操作,但是我传递给 setResultCallback() 的回调没有被调用。有没有人遇到过这个问题?

没有错误消息或任何东西,只是没有被调用。

【问题讨论】:

    标签: android google-play-services credentials google-smartlockpasswords


    【解决方案1】:

    问题可能是Google API客户端没有连接,尝试在你Activity的onStart()方法中调用connect(),或者如果你使用的是最新版本的Play Services,我们添加了API的自动管理客户端使这更容易,真正简化事情并避免常见问题。

    在构建GoogleApiClient 时只需调用enableAutoManage()

        // "this" is a reference to your activity
        mCredentialsApiClient = new GoogleApiClient.Builder(this)
                .addConnectionCallbacks(this)
                .enableAutoManage(this, this)
                .addApi(Auth.CREDENTIALS_API)
                .build();
    

    然后,您无需在任何时候调用mCredentialsApiClient.onConnect() 即可发出 API 请求,Google API 客户端的生命周期将自动为您管理。例如

    @Override
    public void onStart() {
        CredentialRequest request = new CredentialRequest.Builder()
                .setSupportsPasswordLogin(true)
                .build();
        Auth.CredentialsApi.request(mCredentialsApiClient, request).setResultCallback(
                new ResultCallback<CredentialRequestResult>() {
                    public void onResult(CredentialRequestResult result) {
                        // result.getStatus(), result.getCredential() ... sign in automatically!
    ...
    

    在 Github 上查看完整的示例应用程序:https://github.com/googlesamples/android-credentials/blob/master/credentials-quickstart/app/src/main/java/com/google/example/credentialsbasic/MainActivity.java

    【讨论】:

      【解决方案2】:

      我厌倦了官方演示应用程序here,它工作正常。

      基本上,setResultCallback() 将在 saverequestdelete 时被调用

      保存:

      Auth.CredentialsApi.save(mCredentialsApiClient, credential).setResultCallback(
                      new ResultCallback<Status>() {
                          @Override
                          public void onResult(Status status) {
                              if (status.isSuccess()) {
                                  Log.d(TAG, "SAVE: OK");
                                  showToast("Credential Saved");
                                  hideProgress();
                              } else {
                                  resolveResult(status, RC_SAVE);
                              }
                          }
                      });
      

      请求:

      Auth.CredentialsApi.request(mCredentialsApiClient, request).setResultCallback(
                      new ResultCallback<CredentialRequestResult>() {
                          @Override
                          public void onResult(CredentialRequestResult credentialRequestResult) {
                              if (credentialRequestResult.getStatus().isSuccess()) {
                                  // Successfully read the credential without any user interaction, this
                                  // means there was only a single credential and the user has auto
                                  // sign-in enabled.
                                  processRetrievedCredential(credentialRequestResult.getCredential(), false);
                                  hideProgress();
                              } else {
                                  // Reading the credential requires a resolution, which means the user
                                  // may be asked to pick among multiple credentials if they exist.
                                  Status status = credentialRequestResult.getStatus();
                                  if (status.getStatusCode() == CommonStatusCodes.SIGN_IN_REQUIRED) {
                                      // This is a "hint" credential, which will have an ID but not
                                      // a password.  This can be used to populate the username/email
                                      // field of a sign-up form or to initialize other services.
                                      resolveResult(status, RC_HINT);
                                  } else {
                                      // This is most likely the case where the user has multiple saved
                                      // credentials and needs to pick one
                                      resolveResult(status, RC_READ);
                                  }
                              }
                          }
                      });
      

      删除:

      Auth.CredentialsApi.delete(mCredentialsApiClient, mCurrentCredential).setResultCallback(
                      new ResultCallback<Status>() {
                          @Override
                          public void onResult(Status status) {
                              hideProgress();
                              if (status.isSuccess()) {
                                  // Credential delete succeeded, disable the delete button because we
                                  // cannot delete the same credential twice.
                                  showToast("Credential Delete Success");
                                  findViewById(R.id.button_delete_loaded_credential).setEnabled(false);
                                  mCurrentCredential = null;
                              } else {
                                  // Credential deletion either failed or was cancelled, this operation
                                  // never gives a 'resolution' so we can display the failure message
                                  // immediately.
                                  Log.e(TAG, "Credential Delete: NOT OK");
                                  showToast("Credential Delete Failed");
                              }
                          }
                      });
      

      您也可以在我的 github here 中克隆项目,在您的控制台 here 中设置 SHA1

      此时你应该准备好了:)

      【讨论】:

      • 这对您有帮助吗?如果是这样,请接受。如果没有请告诉我,谢谢
      • 这并不能解决我的问题。我正在调用 Auth.CredentialsApi.request(mCredentialsApiClient, request).setResultCallback(...) 但从未调用过回调。
      • 你试过演示应用here吗?我从官方那里试过,setResultCallback(...) 确实有效。那么你能把我可以检查和帮助你的代码发布给你吗?
      • 我想通了,我错过了 mCredentialsApiClient.connect();示例代码中提到了这一点,但开发指南中没有提到。感谢您的帮助!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-07-14
      • 2017-01-24
      • 1970-01-01
      • 1970-01-01
      • 2015-08-16
      • 2017-10-28
      • 2016-08-18
      相关资源
      最近更新 更多