ให้คำแนะนำในการลงชื่อเข้าใช้แก่ผู้ใช้

คำขอดึงข้อมูลเข้าสู่ระบบของผู้ใช้อาจล้มเหลวเมื่อผู้ใช้ยังไม่ได้บันทึก หรือเมื่อผู้ใช้ยังไม่ได้ลงชื่อสมัครใช้แอปของคุณ ใน ให้ใช้ Credentials API เพื่อดึงข้อมูลคำแนะนำในการลงชื่อเข้าใช้ เช่น ชื่อและที่อยู่อีเมลของผู้ใช้ ใช้คําแนะนําเหล่านี้เพื่อป้อนข้อมูลการลงชื่อเข้าใช้ของแอปล่วงหน้า และลงชื่อสมัครใช้แบบฟอร์ม ทำให้ขั้นตอนการเริ่มต้นใช้งานแอปเร็วขึ้น

ใน Android 6.0 (Marshmallow) ขึ้นไป แอปของคุณไม่จำเป็นต้องขอ อุปกรณ์หรือสิทธิ์รันไทม์ใดๆ เพื่อเรียกข้อมูลคำแนะนำในการลงชื่อเข้าใช้ด้วย API ข้อมูลประจำตัว

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

กำหนดค่าโปรเจ็กต์ Android Studio

เรียกข้อมูลคำแนะนำในการลงชื่อเข้าใช้

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

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 แล้ว