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

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

قبل البدء

ضبط مشروع وحدة تحكّم واجهة برمجة تطبيقات Google وإعداد مشروع "استوديو Android"

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