כדי לשלב את הכניסה באמצעות חשבון Google באפליקציית Android, צריך להגדיר את הכניסה באמצעות חשבון Google ולהוסיף פריסת לחצן לאפליקציה שתתחיל את תהליך הכניסה.
לפני שמתחילים
מגדירים פרויקט ב-Google API Console ומגדירים את הפרויקט ב-Android Studio.
הגדרת הכניסה באמצעות חשבון Google והאובייקט GoogleSignInClient
בשיטה
onCreate
של פעילות הכניסה, מגדירים את הכניסה באמצעות חשבון Google כדי לבקש את נתוני המשתמש שנדרשים לאפליקציה. לדוגמה, כדי להגדיר את הכניסה באמצעות חשבון Google כך שתבקש את המזהה של המשתמש ומידע בסיסי בפרופיל, יוצרים אובייקטGoogleSignInOptions
עם הפרמטרDEFAULT_SIGN_IN
. כדי לבקש גם את כתובות האימייל של המשתמשים, צריך ליצור את האובייקטGoogleSignInOptions
עם האפשרותrequestEmail
.// Configure sign-in to request the user's ID, email address, and basic // profile. ID and basic profile are included in DEFAULT_SIGN_IN. GoogleSignInOptions gso = new GoogleSignInOptions.Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestEmail() .build();
אם אתם צריכים לבקש היקפי הרשאות נוספים כדי לגשת ל-Google APIs, אתם יכולים לציין אותם באמצעות
requestScopes
. כדי לספק את חוויית המשתמש הכי טובה, כשמשתמשים נכנסים לחשבון, צריך לבקש רק את היקפי ההרשאות שנדרשים כדי שהאפליקציה תפעל בצורה מינימלית. שולחים בקשה להיקפי הרשאות נוספים רק כשצריך אותם, כדי שהמשתמשים יראו את מסך ההסכמה בהקשר של פעולה שהם ביצעו. איך מבקשים היקפים נוספיםלאחר מכן, גם בשיטה
onCreate
של פעילות הכניסה, יוצרים אובייקטGoogleSignInClient
עם האפשרויות שציינתם.// Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
בדיקה אם קיים משתמש שמחובר לחשבון
בשיטה onStart
של הפעילות, בודקים אם משתמש כבר נכנס לאפליקציה באמצעות Google.
// Check for existing Google Sign In account, if the user is already signed in // the GoogleSignInAccount will be non-null. GoogleSignInAccount account = GoogleSignIn.getLastSignedInAccount(this); updateUI(account);
אם הפונקציה GoogleSignIn.getLastSignedInAccount
מחזירה אובייקט GoogleSignInAccount
(ולא null
), סימן שהמשתמש כבר נכנס לאפליקציה באמצעות Google.
מעדכנים את ממשק המשתמש בהתאם – כלומר, מסתירים את לחצן הכניסה, מפעילים את הפעילות הראשית או כל פעולה אחרת שמתאימה לאפליקציה.
אם הפונקציה GoogleSignIn.getLastSignedInAccount
מחזירה null
, המשתמש עדיין לא נכנס לאפליקציה באמצעות Google. מעדכנים את ממשק המשתמש כדי להציג את לחצן הכניסה לחשבון Google.
הוספה של לחצן הכניסה לחשבון Google לאפליקציה
מוסיפים את
SignInButton
לפריסה של האפליקציה:<com.google.android.gms.common.SignInButton android:id="@+id/sign_in_button" android:layout_width="wrap_content" android:layout_height="wrap_content" />
אופציונלי: אם אתם משתמשים בגרפיקה של לחצן הכניסה שמוגדרת כברירת מחדל במקום לספק נכסים משלכם ללחצן הכניסה, אתם יכולים להתאים אישית את הגודל של הלחצן באמצעות השיטה
setSize
.// Set the dimensions of the sign-in button. SignInButton signInButton = findViewById(R.id.sign_in_button); signInButton.setSize(SignInButton.SIZE_STANDARD);
בפעילות Android (לדוגמה, בשיטה
onCreate
), רושמים אתOnClickListener
של הלחצן כדי שהמשתמש יתחבר כשהוא לוחץ עליו:findViewById(R.id.sign_in_button).setOnClickListener(this);
התחלת תהליך הכניסה
בשיטה
onClick
של הפעילות, מטפלים בהקשות על לחצן הכניסה על ידי יצירת כוונת כניסה באמצעות השיטהgetSignInIntent
והפעלת הכוונה באמצעותstartActivityForResult
.@Override public void onClick(View v) { switch (v.getId()) { case R.id.sign_in_button: signIn(); break; // ... } }
private void signIn() { Intent signInIntent = mGoogleSignInClient.getSignInIntent(); startActivityForResult(signInIntent, RC_SIGN_IN); }
הפעלת הכוונה גורמת למשתמש לבחור חשבון Google כדי להיכנס איתו. אם ביקשתם היקפים מעבר ל-
profile
,email
ו-openid
, המשתמש יתבקש גם להעניק גישה למשאבים המבוקשים.אחרי שהמשתמש נכנס לחשבון, אפשר לקבל אובייקט
GoogleSignInAccount
של המשתמש בשיטהonActivityResult
של הפעילות.@Override public void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); // Result returned from launching the Intent from GoogleSignInClient.getSignInIntent(...); if (requestCode == RC_SIGN_IN) { // The Task returned from this call is always completed, no need to attach // a listener. Task<GoogleSignInAccount> task = GoogleSignIn.getSignedInAccountFromIntent(data); handleSignInResult(task); } }
אובייקט
GoogleSignInAccount
מכיל מידע על המשתמש המחובר, כמו השם שלו.private void handleSignInResult(Task<GoogleSignInAccount> completedTask) { try { GoogleSignInAccount account = completedTask.getResult(ApiException.class); // Signed in successfully, show authenticated UI. updateUI(account); } catch (ApiException e) { // The ApiException status code indicates the detailed failure reason. // Please refer to the GoogleSignInStatusCodes class reference for more information. Log.w(TAG, "signInResult:failed code=" + e.getStatusCode()); updateUI(null); } }
אפשר גם לקבל את כתובת האימייל של המשתמש באמצעות
getEmail
, את מזהה Google של המשתמש (לשימוש בצד הלקוח) באמצעותgetId
, ואת טוקן המזהה של המשתמש באמצעותgetIdToken
. אם אתם צריכים להעביר את המשתמש שמחובר כרגע לשרת קצה עורפי, שולחים את טוקן ה-ID לשרת הקצה העורפי ומאמתים את הטוקן בשרת.