Fornire suggerimenti di accesso a un utente

Le richieste di recupero delle credenziali utente possono non riuscire se un utente non ha ancora salvato le credenziali o se un utente non si è ancora registrato alla tua app. In questi casi, utilizza l'API Credentials per recuperare i suggerimenti di accesso, ad esempio il nome e l'indirizzo email dell'utente. Utilizza questi suggerimenti per precompilare i moduli di accesso e registrazione della tua app, velocizzando la procedura di onboarding.

Su Android 6.0 (Marshmallow) e versioni successive, la tua app non deve richiedere autorizzazioni di runtime o del dispositivo per recuperare i suggerimenti di accesso con l'API Credentials.

Prima di iniziare

Configura un progetto Android Studio.

Recuperare i suggerimenti di accesso

Per recuperare i suggerimenti di accesso, configura innanzitutto la finestra di dialogo del selettore di suggerimenti creando un oggetto HintRequest. Quindi, passa l'oggetto HintRequest a CredentialsClient.getHintPickerIntent() per avere un intent che richieda all'utente di scegliere un indirizzo email. Infine, inizia l'intent con 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);
}

Selettore suggerimenti di accesso a Smart Lock

All'utente viene chiesto di scegliere un indirizzo email da utilizzare.

Quindi, nel metodo onActivityResult() dell'attività, recupera i suggerimenti dal pacchetto Credential.EXTRA_KEY, controlla se l'utente si trova nel database degli utenti e avvia l'attività appropriata con il suggerimento per le credenziali.

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

    ...

}

Precompila il modulo di accesso

Se l'utente si trova nel tuo database utenti e hai avviato l'attività di accesso dell'app, puoi (facoltativamente) verificare se l'oggetto Credential contiene un token ID. In questo caso, puoi far accedere l'utente con il token ID, senza che sia necessario che digiti una password.

Se l'oggetto Credential non contiene un token ID (o non vuoi utilizzare il token ID), precompila i campi di accesso con i suggerimenti che hai aggiunto all'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());

        ...
    }

    ...
}

Precompila il modulo di registrazione

Se l'utente non è presente nel tuo database utenti e hai avviato l'attività di registrazione dell'app, precompila i campi di registrazione con i suggerimenti di accesso che hai aggiunto all'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.

        ...
    }

    ...
}

Facoltativamente, puoi anche controllare se l'oggetto Credential contiene un token ID con un indirizzo email verificato. In questo caso, puoi saltare il passaggio di verifica email dell'app, poiché l'indirizzo email è già stato verificato da Google.