دمج "تسجيل الدخول بحساب Google" في تطبيق Android

لدمج ميزة "تسجيل الدخول باستخدام حساب Google" في تطبيق Android، عليك ضبط إعدادات هذه الميزة وإضافة زر إلى تنسيق تطبيقك لبدء عملية تسجيل الدخول.

قبل البدء

إعداد مشروع على Google API Console وإعداد مشروعك على Android Studio

ضبط ميزة "تسجيل الدخول باستخدام حساب Google" وكائن 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، حدِّدها باستخدام 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. عدِّل واجهة المستخدم وفقًا لذلك، أي إخفاء زر تسجيل الدخول أو إطلاق نشاطك الرئيسي أو أي إجراء آخر مناسب لتطبيقك.

إذا كانت القيمة التي يعرضها GoogleSignIn.getLastSignedInAccount هي null، يعني ذلك أنّ المستخدم لم يسجِّل الدخول إلى تطبيقك باستخدام حساب Google بعد. عدِّل واجهة المستخدم لعرض زر تسجيل الدخول باستخدام حساب 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);
    }

    يؤدي بدء النية إلى مطالبة المستخدم باختيار حساب 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 للمستخدم (للاستخدام من جهة العميل) باستخدام getId، ورمز تعريف للمستخدم باستخدام getIdToken. إذا كنت بحاجة إلى تمرير المستخدم الذي سجّل الدخول حاليًا إلى خادم خلفية، أرسِل الرمز المميّز لتعريف المستخدم إلى خادم الخلفية وأثبِت صحة الرمز المميّز على الخادم.