Almacena las credenciales de un usuario

Después de que los usuarios accedan, creen cuentas o cambien las contraseñas correctamente, permite que almacenen sus credenciales para automatizar futuras autenticaciones en tu app

Antes de comenzar

Configura un proyecto de Android Studio.

Almacenar credenciales

Crea un objeto Credential que contenga la información de acceso de un usuario. Para por ejemplo, para permitir que los usuarios almacenen sus credenciales después de acceder con sus contraseñas:

Credential credential = new Credential.Builder(email)
        .setPassword(password)  // Important: only store passwords in this field.
                                // Android autofill uses this value to complete
                                // sign-in forms, so repurposing this field will
                                // likely cause errors.
        .build();

O, por ejemplo, después de que los usuarios acceder con su Cuenta de Google:

GoogleSignInAccount gsa = signInTask.getResult();
Credential credential = new Credential.Builder(gsa.getEmail())
        .setAccountType(IdentityProviders.GOOGLE)
        .setName(gsa.getDisplayName())
        .setProfilePictureUri(gsa.getPhotoUrl())
        .build();

Diálogo de guardado de Smart Lock

Luego, llama a CredentialsClient.save() para guardar las contraseñas credenciales. Si la llamada a CredentialsClient.save() no se envía de inmediato correctamente, las credenciales pueden ser nuevas, en cuyo caso el usuario debe confirmar la solicitud de guardado. Resuelve el ResolvableApiException con startResolutionForResult() para solicitar la confirmación del usuario.

Si el usuario elige no guardar las credenciales, no se le volverá a solicitar que guardar las credenciales de cualquier cuenta para la app. Si llamas CredentialsClient.save() después de que un usuario inhabilitó la función, su resultado tendrá un código de estado de CANCELED. El usuario puede aceptar la invitación más tarde desde la consola App de Configuración, en la sección Smart Lock para contraseñas. El usuario debe habilitar el guardado de credenciales de todas las cuentas, el cual se te solicitará que las guardes la próxima vez.

mCredentialsClient.save(credential).addOnCompleteListener(
        new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "SAVE: OK");
                    Toast.makeText(activity, "Credentials saved", Toast.LENGTH_SHORT).show();
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // Try to resolve the save request. This will prompt the user if
                    // the credential is new.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    try {
                        rae.startResolutionForResult(this, RC_SAVE);
                    } catch (IntentSender.SendIntentException exception) {
                        // Could not resolve the request
                        Log.e(TAG, "Failed to send resolution.", exception);
                        Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    // Request has no resolution
                    Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                }
            }
        });</pre>

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);

        // ...

        if (requestCode == RC_SAVE) {
            if (resultCode == RESULT_OK) {
                Log.d(TAG, "SAVE: OK");
                Toast.makeText(this, "Credentials saved", Toast.LENGTH_SHORT).show();
            } else {
                Log.e(TAG, "SAVE: Canceled by user");
            }
        }

        // ...

    }

Después de almacenar las credenciales, recupéralas llamando CredentialsClient.request()

Orientación a Android O y versiones posteriores

Cuando guardas credenciales de contraseñas usando Smart Lock en dispositivos con Android O o una versión posterior, Smart Lock usa por su cuenta el diálogo de confirmación nativo de Autocompletar cuando sea posible. (Ten en cuenta que las credenciales guardadas con Autocompletar con Google se comparten bidireccionalmente con Smart Lock para contraseñas).