Udostępnianie użytkownikowi wskazówek dotyczących logowania

Żądania pobrania danych logowania mogą zakończyć się niepowodzeniem, jeśli użytkownik nie zapisał jeszcze danych logowania lub nie zarejestrował się w aplikacji. W takiej sytuacji skorzystaj z interfejsu Credentials API, aby pobrać wskazówki dotyczące logowania, takie jak nazwa i adres e-mail użytkownika. Skorzystaj z tych wskazówek, aby wstępnie wypełnić formularze logowania i rejestracji w aplikacji, co przyspieszy proces wdrażania.

W Androidzie 6.0 (Marshmallow) i nowszych aplikacja nie musi prosić o uprawnienia urządzenia ani w czasie działania, aby pobierać wskazówki dotyczące logowania za pomocą interfejsu Credentials API.

Zanim zaczniesz

Skonfiguruj projekt Android Studio.

Odzyskaj wskazówki dotyczące logowania

Aby pobrać wskazówki dotyczące logowania, najpierw skonfiguruj okno selektora podpowiedzi, tworząc obiekt HintRequest. Następnie przekaż obiekt HintRequest do CredentialsClient.getHintPickerIntent(), aby poprosić użytkownika o wybranie adresu e-mail. Na koniec rozpocznij intencję od elementu 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);
}

Wybór wskazówek dotyczących logowania w ramach funkcji Smart Lock

Pojawi się prośba o wybranie adresu e-mail.

Następnie za pomocą metody onActivityResult() aktywności pobierz wskazówki z pakietu Credential.EXTRA_KEY, sprawdź, czy użytkownik znajduje się w Twojej bazie danych użytkowników, i rozpocznij odpowiednie działanie przy użyciu podpowiedzi z danymi logowania.

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

    ...

}

Wstępne wypełnienie formularza logowania

Jeśli użytkownik znajduje się w bazie danych użytkownika i rozpoczęto proces logowania się w aplikacji, możesz (opcjonalnie) sprawdzić, czy obiekt Credential zawiera token identyfikatora. Jeśli tak, możesz zalogować użytkownika za pomocą tokena identyfikatora, nie wymagając od niego wpisywania hasła.

Jeśli obiekt Credential nie zawiera tokena identyfikatora (lub nie chcesz go używać), wypełnij wstępnie pola logowania wskazówkami dodanymi do intencji.

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

        ...
    }

    ...
}

Wstępne wypełnienie formularza rejestracyjnego

Jeśli użytkownika nie ma w bazie danych użytkowników, a rozpoczęto proces rejestracji w aplikacji, wypełnij wstępnie pola rejestracji podanymi w intencji wskazówkami dotyczącymi logowania.

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.

        ...
    }

    ...
}

Opcjonalnie możesz też sprawdzić, czy obiekt Credential zawiera token identyfikatora ze zweryfikowanym adresem e-mail. Jeśli tak, możesz pominąć etap potwierdzania adresu e-mail w aplikacji, ponieważ ten adres został już zweryfikowany przez Google.