對於僅進行身份驗證的用戶登錄方案,我們建議使用較新的 Google 登錄和Android 本機Web應用程序的一鍵式按鈕。

將 Google Sign-In 集成到您的 Android 應用程序中

要將 Google Sign-In 集成到您的 Android 應用程序中,請配置 Google Sign-In 並向您的應用程序佈局添加一個按鈕以啟動登錄流程。

在你開始之前

配置谷歌API控制台項目,並成立了自己的Android Studio項目

配置 Google Sign-in 和 GoogleSignInClient 對象

  1. 在您登入活動的onCreate方法,配置谷歌登錄的帳戶來請求您的應用程序所需的用戶數據。例如,以配置谷歌登錄到請求用戶的ID和基本簡檔信息,創建一個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();

    如果您需要請求額外的範圍來訪問谷歌的API,以指定它們requestScopes 。為了獲得最佳用戶體驗,在登錄時,僅請求您的應用程序所需的範圍以最小化運行。僅在您需要時請求任何其他範圍,以便您的用戶在他們執行的操作的上下文中看到同意屏幕。見請求附加的範圍

  2. 然後,同樣在你登錄活動的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 ),用戶已經登錄到您與谷歌應用程序。相應地更新您的用戶界面——即隱藏登錄按鈕、啟動您的主要活動或任何適合您的應用程序的內容。

如果GoogleSignIn.getLastSignedInAccount返回null ,用戶尚未登錄到谷歌與您的應用程序。更新您的用戶界面以顯示 Google 登錄按鈕。

將 Google 登錄按鈕添加到您的應用

  1. 標準的 Google 登錄按鈕添加SignInButton在應用程序的佈局:

    <com.google.android.gms.common.SignInButton
     android:id="@+id/sign_in_button"
     android:layout_width="wrap_content"
     android:layout_height="wrap_content" />
    
  2. 可選:如果您使用的是默認的登錄按鈕圖形,而不是提供自己的登錄按鈕的資產,您可以使用自定義按鈕的尺寸setSize方法。

    // Set the dimensions of the sign-in button.
    SignInButton signInButton = findViewById(R.id.sign_in_button);
    signInButton.setSize(SignInButton.SIZE_STANDARD);
    
  3. 在Android活動(例如,在onCreate方法),註冊按鈕的OnClickListener點擊時在用戶登錄:

    findViewById(R.id.sign_in_button).setOnClickListener(this);
    

啟動登錄流程

  1. 登錄帳戶選擇器的圖像在活動的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);
    }

    啟動 Intent 會提示用戶選擇要登錄的 Google 帳戶。如果你要求的範圍超出了profileemail ,和openid ,用戶也被提示授權訪問所請求的資源。

  2. 在用戶登錄後,你可以得到一個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 ,用戶的谷歌標識(客戶端使用)用getId和令牌與用戶的ID getIdToken 。如果你需要傳遞當前登錄的用戶到後端服務器,發送令牌後台服務器的ID和驗證令牌在服務器上。