Proporciona sugerencias de acceso a un usuario

Las solicitudes para recuperar credenciales de usuario pueden fallar cuando un usuario aún no guardó las credenciales o cuando no se registró en la app. En estas situaciones, usa la API de credenciales para recuperar sugerencias de acceso, como el nombre y la dirección de correo electrónico del usuario. Usa estas sugerencias para completar previamente los formularios de acceso y registro de la app, lo que acelera el proceso de integración.

En Android 6.0 (Marshmallow) y versiones posteriores, la app no necesita solicitar ningún permiso de dispositivo o tiempo de ejecución para recuperar sugerencias de acceso con la API de credenciales.

Antes de comenzar

Configura un proyecto de Android Studio.

Recuperar sugerencias de acceso

Para recuperar las sugerencias de acceso, primero crea un objeto HintRequest a fin de configurar el diálogo del selector de sugerencias. Luego, pasa el objeto HintRequest a CredentialsClient.getHintPickerIntent() para obtener un intent que le solicite al usuario que elija una dirección de correo electrónico. Por último, inicia el 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);
}

Selector de sugerencias de acceso de Smart Lock

Se le solicita al usuario que elija una dirección de correo electrónico para usar.

Luego, en el método onActivityResult() de la actividad, recupera las sugerencias de la parcela Credential.EXTRA_KEY, verifica si el usuario se encuentra en tu base de datos y comienza la actividad adecuada con la sugerencia de credenciales.

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

    ...

}

Completa el formulario de acceso previamente

Si el usuario se encuentra en tu base de datos de usuarios e iniciaste la actividad de acceso de la app, puedes verificar (de forma opcional) si el objeto Credential contiene un token de ID. Si es así, puedes permitir que el usuario acceda con el token de ID, sin necesidad de que el usuario escriba una contraseña.

Si el objeto Credential no contiene un token de ID (o no quieres usarlo), completa previamente los campos de acceso con las sugerencias que agregaste al 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());

        ...
    }

    ...
}

Completar previamente el formulario de registro

Si el usuario no se encuentra en tu base de datos de usuarios y comenzaste la actividad de registro de la app, completa previamente los campos de registro con las sugerencias de acceso que agregaste al 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.

        ...
    }

    ...
}

De manera opcional, también puedes verificar si el objeto Credential contiene un token de ID que tiene una dirección de correo electrónico verificada. Si es así, puedes omitir el paso de verificación por correo electrónico de tu app, debido a que Google ya verificó la dirección de correo electrónico.