จัดเก็บข้อมูลเข้าสู่ระบบของผู้ใช้

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

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

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

จัดเก็บข้อมูลเข้าสู่ระบบ

สร้างออบเจ็กต์ Credential ที่มีข้อมูลการลงชื่อเข้าใช้ของผู้ใช้ ตัวอย่างเช่น หากต้องการอนุญาตให้ผู้ใช้จัดเก็บข้อมูลเข้าสู่ระบบหลังจากลงชื่อเข้าใช้ด้วยรหัสผ่านเรียบร้อยแล้ว ให้ทำดังนี้

Credential credential = new Credential.Builder(email)
        .setPassword(password)  // Important: only store passwords in this field.
                                // Android autofill uses this value to complete
                                // sign-in forms, so repurposing this field will
                                // likely cause errors.
        .build();

หรือ เช่น เมื่อผู้ใช้ลงชื่อเข้าใช้ด้วยบัญชี Google สำเร็จแล้ว ก็ให้ทำดังนี้

GoogleSignInAccount gsa = signInTask.getResult();
Credential credential = new Credential.Builder(gsa.getEmail())
        .setAccountType(IdentityProviders.GOOGLE)
        .setName(gsa.getDisplayName())
        .setProfilePictureUri(gsa.getPhotoUrl())
        .build();

กล่องโต้ตอบการบันทึกของ Smart Lock

จากนั้นเรียกใช้ CredentialsClient.save() เพื่อบันทึกข้อมูลเข้าสู่ระบบของผู้ใช้ หากการเรียก CredentialsClient.save() ไม่สำเร็จในทันที ข้อมูลเข้าสู่ระบบอาจเป็นข้อมูลใหม่ ซึ่งในกรณีนี้ผู้ใช้ต้องยืนยันคำขอบันทึก ปิด ResolvableApiException ด้วย startResolutionForResult() เพื่อแสดงข้อความแจ้งให้ผู้ใช้ยืนยัน

หากผู้ใช้เลือกที่จะไม่บันทึกข้อมูลเข้าสู่ระบบ ผู้ใช้จะไม่ได้รับข้อความแจ้งอีกครั้งให้บันทึกข้อมูลเข้าสู่ระบบของบัญชีสําหรับแอป หากเรียกใช้ CredentialsClient.save() หลังจากผู้ใช้เลือกไม่รับแล้ว ผลลัพธ์จะมีรหัสสถานะ CANCELED ผู้ใช้สามารถเลือกใช้ได้ในภายหลังจากแอป การตั้งค่า Google ในส่วน Smart Lock สำหรับรหัสผ่าน ผู้ใช้ต้องเปิดใช้การบันทึกข้อมูลเข้าสู่ระบบสำหรับทุกบัญชีเพื่อได้รับแจ้งให้บันทึกข้อมูลเข้าสู่ระบบในครั้งถัดไป

mCredentialsClient.save(credential).addOnCompleteListener(
        new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                if (task.isSuccessful()) {
                    Log.d(TAG, "SAVE: OK");
                    Toast.makeText(activity, "Credentials saved", Toast.LENGTH_SHORT).show();
                    return;
                }

                Exception e = task.getException();
                if (e instanceof ResolvableApiException) {
                    // Try to resolve the save request. This will prompt the user if
                    // the credential is new.
                    ResolvableApiException rae = (ResolvableApiException) e;
                    try {
                        rae.startResolutionForResult(this, RC_SAVE);
                    } catch (IntentSender.SendIntentException exception) {
                        // Could not resolve the request
                        Log.e(TAG, "Failed to send resolution.", exception);
                        Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                    }
                } else {
                    // Request has no resolution
                    Toast.makeText(activity, "Save failed", Toast.LENGTH_SHORT).show();
                }
            }
        });</pre>

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

        // ...

        if (requestCode == RC_SAVE) {
            if (resultCode == RESULT_OK) {
                Log.d(TAG, "SAVE: OK");
                Toast.makeText(this, "Credentials saved", Toast.LENGTH_SHORT).show();
            } else {
                Log.e(TAG, "SAVE: Canceled by user");
            }
        }

        // ...

    }

หลังจากจัดเก็บข้อมูลเข้าสู่ระบบแล้ว ให้เรียกใช้ CredentialsClient.request()

การกำหนดเป้าหมาย Android O ขึ้นไป

เมื่อคุณบันทึกข้อมูลเข้าสู่ระบบของรหัสผ่านโดยใช้ Smart Lock ในอุปกรณ์ที่ใช้ Android O หรือเวอร์ชันใหม่กว่า Smart Lock จะใช้กล่องโต้ตอบการยืนยันการป้อนอัตโนมัติแบบดั้งเดิมผ่านกล่องโต้ตอบของตนเองทุกครั้งที่ทำได้ (โปรดทราบว่าข้อมูลเข้าสู่ระบบที่บันทึกโดยใช้การป้อนข้อความอัตโนมัติด้วย Google จะแชร์แบบ 2 ทิศทางกับ Smart Lock สำหรับรหัสผ่าน)