如要將 Google 登入整合至 Android 應用程式,請設定 Google 登入,並在應用程式版面配置中新增按鈕,啟動登入流程。
事前準備
設定 Google API 控制台專案,並設定 Android Studio 專案。
設定 Google 登入和 GoogleSignInClient 物件
在登入活動的
onCreate
方法中設定 Google 登入,要求應用程式所需的使用者資料。舉例來說,如要設定 Google 登入,要求使用者的 ID 和基本個人資料,請使用DEFAULT_SIGN_IN
參數建立GoogleSignInOptions
物件。如要一併要求使用者的電子郵件地址,請使用requestEmail
選項建立GoogleSignInOptions
物件。// 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 API,請使用
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 帳戶登入應用程式。請據此更新 UI,也就是隱藏登入按鈕、啟動主要活動,或執行其他適合應用程式的操作。
如果 GoogleSignIn.getLastSignedInAccount
傳回 null
,表示使用者尚未使用 Google 帳戶登入您的應用程式。更新 UI 以顯示 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
以外的範圍,系統也會提示使用者授予要求的資源存取權。使用者登入後,您可以在活動的
onActivityResult
方法中為使用者取得GoogleSignInAccount
物件。@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
取得使用者的電子郵件地址、使用getId
取得使用者的 Google ID (用於用戶端),以及使用getIdToken
取得使用者的 ID 符記。如果您需要將目前登入的使用者傳遞至後端伺服器,請將 ID 權杖傳送至後端伺服器,然後在伺服器上驗證權杖。