כדי לשלב את הכניסה באמצעות חשבון 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);
התחלת תהליך הכניסה
ב-method
onClick
של הפעילות, צריך לטפל בהקשה על לחצני הכניסה. לשם כך, יוצרים Intent כניסה בשיטהgetSignInIntent
, ומתחילים את ה-Intent ב-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); }
המשתמש מתחיל ב-Intent מציג בקשה לבחור חשבון Google כדי להיכנס באמצעותו. אם ביקשתם היקפים מעבר ל-
profile
, ל-email
ול-openid
, המשתמש מתבקש גם להעניק גישה למשאבים המבוקשים.אחרי שהמשתמש ייכנס לחשבון, תוכלו לקבל אובייקט
GoogleSignInAccount
עבור המשתמש ב-methodonActivityResult
של הפעילות.@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
. אם אתם צריכים להעביר את המשתמש שמחובר כרגע לשרת עורפי, עליכם לשלוח את האסימון המזהה לשרת הקצה העורפי שלכם ולאמת את האסימון בשרת.