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);
}
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.