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