تقديم تلميحات تسجيل الدخول للمستخدم

قد يتعذّر استرداد طلبات استرداد بيانات اعتماد المستخدم إذا لم يحفظ المستخدم بيانات الاعتماد بعد أو لم يشترك بعد في تطبيقك. وفي هذه الحالات، يمكنك استخدام واجهة برمجة تطبيقات بيانات الاعتماد لاسترداد تلميحات تسجيل الدخول، مثل اسم المستخدم وعنوان بريده الإلكتروني. استخدم هذه التلميحات لملء نموذج تسجيل الدخول والاشتراك لتطبيقك مسبقًا، مما يؤدي إلى تسريع عملية إعداد تطبيقك.

على نظام التشغيل Android 6.0 (Marshmallow) والإصدارات الأحدث، لا يحتاج تطبيقك إلى طلب أذونات على أي جهاز أو وقت تشغيل لاسترداد تلميحات تسجيل الدخول باستخدام Credentials API.

قبل البدء

ضبط مشروع "استوديو Android":

استرداد تلميحات تسجيل الدخول

لاسترداد تلميحات تسجيل الدخول، عليك أولاً ضبط مربع حوار أداة اختيار التلميح من خلال إنشاء كائن HintRequest. بعد ذلك، مرِّر كائن HintRequest إلى CredentialsClient.getHintPickerIntent() لحث المستخدم على اختيار عنوان بريد إلكتروني. أخيرًا، ابدأ النية بـ startIntentSenderForResult().

HintRequest hintRequest = new HintRequest.Builder()
        .setHintPickerConfig(new CredentialPickerConfig.Builder()
                .setShowCancelButton(true)
                .build())
        .setEmailAddressIdentifierSupported(true)
        .setAccountTypes(IdentityProviders.GOOGLE)
        .build();

PendingIntent intent = mCredentialsClient.getHintPickerIntent(hintRequest);
try {
    startIntentSenderForResult(intent.getIntentSender(), RC_HINT, null, 0, 0, 0);
} catch (IntentSender.SendIntentException e) {
    Log.e(TAG, "Could not start hint picker Intent", e);
}

أداة اختيار تلميح تسجيل الدخول في Smart Lock

يُطلب من المستخدم اختيار عنوان بريد إلكتروني لاستخدامه.

بعد ذلك، في طريقة onActivityResult() للنشاط، يمكنك استرداد التلميحات من حزمة Credential.EXTRA_KEY، والتحقّق مما إذا كان المستخدم في قاعدة بيانات المستخدم، وبدء النشاط المناسب بتلميح بيانات الاعتماد.

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (requestCode == RC_HINT) {
        if (resultCode == RESULT_OK) {
            Credential credential = data.getParcelableExtra(Credential.EXTRA_KEY);
            Intent intent;
            // Check for the user ID in your user database.
            if (userDatabaseContains(credential.getId())) {
                intent = new Intent(this, SignInActivity.class);
            } else {
                intent = new Intent(this, SignUpNewUserActivity.class);
            }
            intent.putExtra("com.mycompany.myapp.SIGNIN_HINTS", credential);
            startActivity(intent);
        } else {
            Log.e(TAG, "Hint Read: NOT OK");
            Toast.makeText(this, "Hint Read Failed", Toast.LENGTH_SHORT).show();
        }
    }

    ...

}

ملء نموذج تسجيل الدخول مسبقًا

إذا كان المستخدم في قاعدة بيانات المستخدمين وبدأت نشاط تسجيل الدخول إلى تطبيقك، يمكنك (اختياريًا) التحقق مما إذا كان عنصر Credential يحتوي على رمز مميز لرقم التعريف. إذا كان الأمر كذلك، يمكنك تسجيل دخول المستخدم باستخدام الرمز المميّز للمعرّف، بدون أن يطلب من المستخدم كتابة كلمة مرور.

إذا لم يكن كائن Credential يحتوي على رمز مميّز للمعرّف (أو إذا لم تكن تريد استخدام الرمز المميّز للمعرّف)، املأ حقول تسجيل الدخول مسبقًا بالتلميحات التي أضفتها إلى الهدف.

public class SignInActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill ID field
        mUsernameView.setText(credential.getId());

        ...
    }

    ...
}

ملء نموذج الاشتراك مسبقًا

إذا لم يكن المستخدم مدرَجًا في قاعدة بيانات المستخدم وبدأت نشاط الاشتراك في تطبيقك، املأ حقول الاشتراك مسبقًا بتلميحات تسجيل الدخول التي أضفتها إلى الغرض.

public class SignUpNewUserActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Intent intent = getIntent();
        Credential credential = intent.getParcelableExtra("com.mycompany.myapp.SIGNIN_HINTS");

        // Pre-fill sign-up fields
        mUsernameView.setText(credential.getId());
        mDisplaynameView.setText(credential.getName()); // Might be null.

        ...
    }

    ...
}

يمكنك اختياريًا التحقّق مما إذا كان الكائن Credential يحتوي على رمز مميّز للمعرّف يتضمّن عنوان بريد إلكتروني تم إثبات ملكيته. إذا كان الأمر كذلك، يمكنك تخطي خطوة التحقق من البريد الإلكتروني لتطبيقك نظرًا لأنه تم التحقق من عنوان البريد الإلكتروني بواسطة Google.