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