כדי לשלב את 'כניסה באמצעות חשבון Google' באפליקציה ל-Android, צריך להגדיר את 'כניסה באמצעות חשבון Google' ולהוסיף לחלל האפליקציה לחצן שמפעיל את תהליך הכניסה.
לפני שמתחילים
מגדירים פרויקט ב-Google API Console ומגדירים את הפרויקט ב-Android Studio.
הגדרת Google Sign-in והאובייקט GoogleSignInClient
בשיטה
onCreate
של פעילות הכניסה, מגדירים את Google Sign-In לבקש את נתוני המשתמשים הנדרשים לאפליקציה. לדוגמה, כדי להגדיר את Google Sign-In לבקש את מזהה המשתמשים ואת פרטי הפרופיל הבסיסיים שלהם, יוצרים אובייקט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
. אם אתם צריכים להעביר את המשתמש שמחובר כרגע לשרת לקצה העורפי, שלחו את אסימון המזהה לשרת הקצה העורפי ואימתו את הטוקן בשרת.