Si el inicio de sesión con One Tap satisface sus necesidades, considere usarlo en su lugar. One Tap tiene una experiencia de usuario actualizada y otras mejoras.

Proporciona sugerencias de acceso a un usuario

Las solicitudes para recuperar las credenciales del usuario pueden fallar cuando un usuario aún no guardó las credenciales o cuando el usuario aún no se registra en la app. En estos casos, 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 tu 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 de 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 configura el diálogo del selector de sugerencia mediante la creación de un objeto HintRequest. 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 sugerencia de acceso a 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 del paquete Credential.EXTRA_KEY, verifica si el usuario se encuentra en la base de datos de usuarios y, luego, inicia 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 por adelantado el formulario de acceso

Si el usuario se encuentra en la base de datos de usuarios y comenzaste la actividad de acceso de la app, puedes verificar (opcionalmente) si el objeto Credential contiene un token de ID. Si es así, puedes acceder al usuario con el token de ID sin necesidad de que escriba una contraseña.

Si el objeto Credential no contiene un token de ID (o no quieres usar el token de ID), 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());

        ...
    }

    ...
}

Completa por adelantado el formulario de registro

Si el usuario no se encuentra en tu base de datos de usuarios y comenzaste la actividad de registro de tu app, completa 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 de correo electrónico de la app, ya que Google ya verificó la dirección.