Dar dicas de login a um usuário

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

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

Antes de começar

Configure um projeto do Android Studio.

Recuperar dicas de login

Para recuperar as dicas de login, primeiro configure a caixa de diálogo do seletor de dicas da seguinte forma: criar um objeto HintRequest. objeto. Em seguida, transmita o objeto HintRequest para CredentialsClient.getHintPickerIntent() para gerar uma intent que solicita que o usuário escolha um endereço de e-mail. Por fim, inicie o 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 dicas de login do Smart Lock

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

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 adequada 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 banco de dados de usuários e você tiver iniciado o login no app atividade, é possível verificar (opcionalmente) se o objeto Credential contém um ID com base no token correto anterior. Em caso afirmativo, você pode fazer o login do usuário com o token de ID, sem que o usuário precise digitar uma senha.

Se o objeto Credential não tiver um token de ID (ou se você não quiser usar o token de ID), preencha previamente os campos de login com as dicas que você adicionou ao intenção.

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 banco de dados de usuários e você tiver iniciado a inscrição no app preencha previamente os campos de inscrição com as dicas de login que você adicionou o 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.

        ...
    }

    ...
}

Também é possível verificar se o objeto Credential contém um Token de ID que tem um endereço de e-mail verificado. Nesse caso, pule a etapa de verificação de e-mail do app. porque o endereço de e-mail já foi verificado pelo Google.