Almacena las credenciales de un usuario

Una vez que los usuarios accedan, creen cuentas o cambien las contraseñas correctamente, permíteles almacenar sus credenciales para automatizar la autenticación futura 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. Por ejemplo, para permitir que los usuarios almacenen sus credenciales después de acceder correctamente con sus contraseñas, usa el siguiente código:

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 bien, por ejemplo, después de que los usuarios accedan con su Cuenta de Google correctamente:

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 credenciales de los usuarios. Si la llamada a CredentialsClient.save() no se ejecuta correctamente de inmediato, es posible que las credenciales sean nuevas, en cuyo caso el usuario deberá confirmar la solicitud de guardado. Resuelve el ResolvableApiException con startResolutionForResult() para solicitar la confirmación del usuario.

Si el usuario decide no guardar las credenciales, no se le volverá a solicitar que guarde ninguna de las credenciales de cuenta para la app. Si llamas a 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 habilitarla más tarde desde la app de Configuración de Google, en la sección Smart Lock para contraseñas. El usuario debe habilitar el guardado de credenciales para todas las cuentas a fin de que se le solicite guardar las credenciales 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, llama a CredentialsClient.request() para recuperarlas.

Orientación a Android O y versiones posteriores

Cuando guardas las credenciales de contraseña con Smart Lock en dispositivos que ejecutan Android O o versiones posteriores, Smart Lock usa el diálogo de confirmación de autocompletado nativo en lugar de su propio diálogo siempre que es posible. (Ten en cuenta que las credenciales guardadas con Autocompletar con Google se comparten de forma bidireccional con Smart Lock para contraseñas).