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

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

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

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

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

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

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

        ...
    }

    ...
}

กรอกแบบฟอร์มลงชื่อสมัครใช้ล่วงหน้า

หากผู้ใช้ไม่อยู่ในฐานข้อมูลผู้ใช้และคุณเริ่มกิจกรรมการลงชื่อสมัครใช้ของแอปแล้ว ให้กรอกข้อมูลในช่องลงชื่อสมัครใช้ล่วงหน้าด้วยคำแนะนำในการลงชื่อเข้าใช้ที่คุณเพิ่มไว้ใน Intent

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