Oferecer dicas de login a um usuário

As solicitações para recuperar credenciais de usuário podem falhar quando um usuário ainda não salvou as credenciais ou ainda não se inscreveu no app. Nessas situações, use a API Credentials para recuperar dicas de login, como o nome e o endereço de e-mail do usuário. Use estas dicas para pré-preencher os formulários de login e inscrição do seu app, agilizando o processo de integração.

No Android 6.0 (Marshmallow) e versões mais recentes, seu app não precisa solicitar permissões de dispositivo ou ambiente de execução para recuperar dicas de login com a API Credentials.

Antes de começar

Configurar um projeto do Android Studio.

Recuperar dicas de login

Para recuperar as dicas de login, primeiro configure a caixa de diálogo de seletor de dicas criando um objeto HintRequest. Em seguida, transmita o objeto HintRequest para CredentialsClient.getHintPickerIntent() para que uma intent solicite que o usuário escolha um endereço de e-mail. Por fim, inicie a intent com startIntentSenderForResult().

HintRequest hintRequest = new HintRequest.Builder()
        .setHintPickerConfig(new CredentialPickerConfig.Builder()
                .setShowCancelButton(true)
                .build())
        .setEmailAddressIdentifierSupported(true)
        .setAccountTypes(IdentityProviders.GOOGLE)
        .build();

PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Log.e(TAG, "Could not start hint picker Intent", e);
}

Seletor de dica de login do Smart Lock

O usuário precisa escolher um endereço de e-mail.

Em seguida, no método onActivityResult() da atividade, recupere as dicas do pacote Credential.EXTRA_KEY, verifique se o usuário está no banco de dados do usuário e inicie a atividade apropriada com a dica de credenciais.

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

    if (requestCode == RC_HINT) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            Intent intent;
            // Check for the user ID in your user database.
            if (userDatabaseContains(credential.getId())) {
                intent = new Intent(this, SignInActivity.class);
            } else {
                intent = new Intent(this, SignUpNewUserActivity.class);
            }
            intent.putExtra("com.mycompany.myapp.SIGNIN_HINTS", credential);
            startActivity(intent);
        } else {
            Log.e(TAG, "Hint Read: NOT OK");
            Toast.makeText(this, "Hint Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    ...

}

Preencher automaticamente o formulário de login

Se o usuário estiver no seu banco de dados de usuários e você iniciar a atividade de login do seu aplicativo, você poderá, opcionalmente, verificar se o objeto Credential contém um token de ID. Nesse caso, é possível fazer login do usuário com o token de código, sem que ele precise digitar uma senha.

Se o objeto Credential não contiver um token de ID (ou você não quiser usar o token de ID), preencha automaticamente os campos de login com as dicas adicionadas à intent.

public class SignInActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill ID field
        mUsernameView.setText(credential.getId());

        ...
    }

    ...
}

Preencher automaticamente o formulário de inscrição

Se o usuário não estiver no seu banco de dados do usuário e você iniciou a atividade de inscrição do seu app, preencha automaticamente os campos de inscrição com as dicas de login que você adicionou à intent.

public class SignUpNewUserActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill sign-up fields
        mUsernameView.setText(credential.getId());
        mDisplaynameView.setText(credential.getName()); // Might be null.

        ...
    }

    ...
}

Você também pode verificar se o objeto Credential contém um token de ID que tem um endereço de e-mail verificado. Em caso afirmativo, é possível pular a etapa de verificação de e-mail do seu app, já que o endereço de e-mail já foi verificado pelo Google.