如要將 Google 登入整合至 Android 應用程式,請設定 Google 登入,並在應用程式版面配置中新增按鈕,啟動登入流程。
事前準備
設定 Google API 控制台專案,並設定 Android Studio 專案。
設定 Google 登入和 GoogleSignInClient 物件
在登入活動的
onCreate
方法中設定 Google 登入,要求應用程式所需的使用者資料。舉例來說,如要設定 Google 登入,要求使用者的 ID 和基本個人資料,請使用DEFAULT_SIGN_IN
參數建立GoogleSignInOptions
物件。如要請使用者電子郵件地址 並使用程式碼建立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 API,請指定這些範圍 使用
requestScopes
。 為提供最佳使用者體驗,登入時請僅要求符合以下條件的範圍: 讓您的應用程式能達到最小功能性。要求其他範圍 有需要的時候 這樣使用者才會在 所做動作的背景資訊 請參閱要求其他範圍。接著,在登入活動的
onCreate
方法中,使用您指定的選項建立GoogleSignInClient
物件。// Build a GoogleSignInClient with the options specified by gso. mGoogleSignInClient = GoogleSignIn.getClient(this, gso);
檢查目前登入的使用者
在活動的 onStart
方法中,檢查使用者是否已登入
開發自己的應用程式
// 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 帳戶登入您的應用程式。更新使用者介面,顯示 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 ID (供用戶端使用) 搭配getId
, 和getIdToken
使用者的 ID 權杖。 如果您需要將目前登入的使用者傳遞至後端伺服器, 將 ID 權杖傳送至後端伺服器 並驗證伺服器上的憑證