ผสานรวม Google Sign-In เข้ากับแอป Android

หากต้องการผสานรวมการลงชื่อเข้าใช้ด้วย Google เข้ากับแอป Android ให้กำหนดค่าการลงชื่อเข้าใช้ด้วย Google และ เพิ่มปุ่มลงในเลย์เอาต์ของแอปที่จะเริ่มขั้นตอนการลงชื่อเข้าใช้

ก่อนเริ่มต้น

กำหนดค่าโปรเจ็กต์คอนโซล Google API และตั้งค่าโปรเจ็กต์ Android Studio

กำหนดค่า Google Sign-In และออบเจ็กต์ GoogleSignInClient

  1. ใน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 API ให้ระบุขอบเขตเหล่านั้นด้วย requestScopes เมื่อลงชื่อเข้าใช้ ให้ขอเฉพาะขอบเขตที่จำเป็นเพื่อให้แอปทำงานได้ขั้นต่ำ เพื่อให้ผู้ใช้ได้รับประสบการณ์ที่ดีที่สุด ขอขอบเขตเพิ่มเติมเฉพาะเมื่อจำเป็นเท่านั้น เพื่อให้ผู้ใช้เห็นหน้าจอคำยินยอมในบริบทของการดำเนินการที่ผู้ใช้ทำ ดูการขอขอบเขตเพิ่มเติม

  2. จากนั้นในเมธอด 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 ลงในแอป

  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 ของกิจกรรม ให้จัดการการแตะปุ่มลงชื่อเข้าใช้โดยสร้าง 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 ระบบจะแจ้งให้ผู้ใช้ให้สิทธิ์เข้าถึงทรัพยากรที่ขอด้วย

  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 Google ID ของผู้ใช้ (สําหรับการใช้งานฝั่งไคลเอ็นต์) ด้วย getId และโทเค็นรหัสสําหรับผู้ใช้ด้วย getIdToken ได้ด้วย หากต้องการส่งผู้ใช้ที่ลงชื่อเข้าใช้ในปัจจุบันไปยังเซิร์ฟเวอร์แบ็กเอนด์ ให้ส่งโทเค็นรหัสไปยังเซิร์ฟเวอร์แบ็กเอนด์ และตรวจสอบโทเค็นในเซิร์ฟเวอร์