Armazenar as credenciais de um usuário

Depois que os usuários fizerem login, criarem contas ou mudarem senhas, permita que eles armazenem as credenciais para automatizar futuras autenticaçãos no app.

Antes de começar

Configure um projeto do Android Studio.

Armazenar credenciais

Crie um objeto Credential que contenha as informações de login de um usuário. Por exemplo, para permitir que os usuários armazenem as credenciais depois de fazer login com as senhas:

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

Ou, por exemplo, depois que os usuários fizerem login com a Conta do Google:

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

Caixa de diálogo "Salvar" do Smart Lock

Em seguida, chame CredentialsClient.save() para salvar as credenciais dos usuários. Se a chamada para CredentialsClient.save() não for bem-sucedida imediatamente, as credenciais poderão ser novas. Nesse caso, o usuário precisará confirmar a solicitação de salvamento. Resolva o ResolvableApiException com startResolutionForResult() para solicitar a confirmação do usuário.

Se o usuário optar por não salvar as credenciais, ele não receberá uma solicitação novamente para salvar as credenciais de qualquer conta no app. Se você chamar CredentialsClient.save() depois que um usuário tiver desativado essa opção, o resultado terá um código de status de CANCELED. O usuário pode ativar essa opção mais tarde no app Configurações do Google, na seção Smart Lock para senhas. O usuário precisa ativar o salvamento de credenciais em todas as contas para receber uma solicitação para salvar credenciais na 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");
            }
        }

        // ...

    }

Depois de armazenar as credenciais, recupere-as chamando CredentialsClient.request().

Destinado ao Android O e superior

Quando você salva credenciais de senha usando o Smart Lock em dispositivos com Android O ou mais recente, o Smart Lock usa a caixa de diálogo de confirmação do preenchimento automático nativa na própria caixa de diálogo sempre que possível. As credenciais salvas usando o Preenchimento automático do Google são compartilhadas bidirecionalmente com o Smart Lock para senhas.