איך שולחים למשתמשים רמזים לכניסה לחשבון

בקשות לאחזור פרטי כניסה של משתמשים יכולות להיכשל אם משתמש עדיין לא שמר פרטי כניסה או אם המשתמש עדיין לא נרשם לאפליקציה. במצבים אלה, כדאי להשתמש ב-Credentials API כדי לאחזר רמזים לכניסה, כמו השם וכתובת האימייל של המשתמש. תוכלו להשתמש ברמזים האלה כדי למלא מראש את טופסי הכניסה וההרשמה לאפליקציה, וכך לזרז את תהליך ההצטרפות לאפליקציה.

במכשירים עם Android 6.0 (Marshmallow) ואילך, האפליקציה לא צריכה לבקש הרשאות בזמן ריצה או מכשיר כדי לאחזר רמזים לכניסה באמצעות ה-Credentials API.

לפני שמתחילים

מגדירים פרויקט Android Studio.

אחזור רמזים לכניסה

כדי לאחזר את הרמזים לכניסה, מגדירים תחילה את תיבת הדו-שיח של בורר הרמזים על ידי יצירת אובייקט HintRequest. לאחר מכן, מעבירים את האובייקט HintRequest אל CredentialsClient.getHintPickerIntent() כדי לקבל כוונה לבקש מהמשתמש לבחור כתובת אימייל. לבסוף, צריך להתחיל את הכוונות עם 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);
}

בוחר הרמזים לכניסה אל Smart Lock

המשתמש מתבקש לבחור כתובת אימייל לשימוש.

לאחר מכן, בשיטה onActivityResult() של הפעילות, מאחזרים את הרמזים מהחבילה Credential.EXTRA_KEY, בודקים אם המשתמש נמצא במסד הנתונים של המשתמשים ומתחילים את הפעילות המתאימה עם הרמז לפרטי הכניסה.

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

    ...

}

מילוי מראש של טופס הכניסה

אם המשתמש נמצא במסד הנתונים של המשתמשים והתחלתם את פעילות הכניסה לאפליקציה, תוכלו לבדוק אם האובייקט Credential מכיל אסימון מזהה. במקרה כזה, תוכלו להיכנס למשתמשים באמצעות האסימון המזהה, בלי לבקש מהמשתמש להקליד סיסמה.

אם האובייקט Credential לא מכיל אסימון מזהה (או אם אתם לא רוצים להשתמש באסימון המזהה), צריך למלא מראש את שדות הכניסה באמצעות הרמזים שהוספתם לכוונה.

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

        ...
    }

    ...
}

מילוי מראש של טופס ההרשמה

אם המשתמש לא נמצא במסד הנתונים של המשתמשים והתחלתם את פעילות ההרשמה לאפליקציה, עליכם למלא מראש את שדות ההרשמה באמצעות הרמזים לכניסה שהוספתם ל-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.

        ...
    }

    ...
}

אפשר גם לבדוק אם האובייקט Credential מכיל אסימון מזהה עם כתובת אימייל מאומתת. אם כן, תוכלו לדלג על שלב אימות האימייל של האפליקציה, כי כתובת האימייל כבר אומתה על ידי Google.